1*95c1762aSConor Dooley // SPDX-License-Identifier: GPL-2.0 2*95c1762aSConor Dooley 3*95c1762aSConor Dooley #include <linux/bitfield.h> 4*95c1762aSConor Dooley #include <linux/module.h> 5*95c1762aSConor Dooley #include <linux/mfd/syscon.h> 6*95c1762aSConor Dooley #include <linux/mod_devicetable.h> 7*95c1762aSConor Dooley #include <linux/of.h> 8*95c1762aSConor Dooley #include <linux/platform_device.h> 9*95c1762aSConor Dooley #include <linux/regmap.h> 10*95c1762aSConor Dooley #include <linux/seq_file.h> 11*95c1762aSConor Dooley 12*95c1762aSConor Dooley #include <linux/pinctrl/pinconf-generic.h> 13*95c1762aSConor Dooley #include <linux/pinctrl/pinconf.h> 14*95c1762aSConor Dooley #include <linux/pinctrl/pinctrl.h> 15*95c1762aSConor Dooley #include <linux/pinctrl/pinmux.h> 16*95c1762aSConor Dooley 17*95c1762aSConor Dooley #include "../pinctrl-utils.h" 18*95c1762aSConor Dooley 19*95c1762aSConor Dooley #define PIC64GX_PINMUX_REG 0x0 20*95c1762aSConor Dooley 21*95c1762aSConor Dooley static const struct regmap_config pic64gx_gpio2_regmap_config = { 22*95c1762aSConor Dooley .reg_bits = 32, 23*95c1762aSConor Dooley .reg_stride = 4, 24*95c1762aSConor Dooley .val_bits = 32, 25*95c1762aSConor Dooley .val_format_endian = REGMAP_ENDIAN_LITTLE, 26*95c1762aSConor Dooley .max_register = 0x0, 27*95c1762aSConor Dooley }; 28*95c1762aSConor Dooley 29*95c1762aSConor Dooley struct pic64gx_gpio2_pinctrl { 30*95c1762aSConor Dooley struct pinctrl_dev *pctrl; 31*95c1762aSConor Dooley struct device *dev; 32*95c1762aSConor Dooley struct regmap *regmap; 33*95c1762aSConor Dooley struct pinctrl_desc desc; 34*95c1762aSConor Dooley }; 35*95c1762aSConor Dooley 36*95c1762aSConor Dooley struct pic64gx_gpio2_pin_group { 37*95c1762aSConor Dooley const char *name; 38*95c1762aSConor Dooley const unsigned int *pins; 39*95c1762aSConor Dooley const unsigned int num_pins; 40*95c1762aSConor Dooley u32 mask; 41*95c1762aSConor Dooley u32 setting; 42*95c1762aSConor Dooley }; 43*95c1762aSConor Dooley 44*95c1762aSConor Dooley struct pic64gx_gpio2_function { 45*95c1762aSConor Dooley const char *name; 46*95c1762aSConor Dooley const char * const *groups; 47*95c1762aSConor Dooley const unsigned int num_groups; 48*95c1762aSConor Dooley }; 49*95c1762aSConor Dooley 50*95c1762aSConor Dooley static const struct pinctrl_pin_desc pic64gx_gpio2_pins[] = { 51*95c1762aSConor Dooley PINCTRL_PIN(0, "E14"), 52*95c1762aSConor Dooley PINCTRL_PIN(1, "E15"), 53*95c1762aSConor Dooley PINCTRL_PIN(2, "F16"), 54*95c1762aSConor Dooley PINCTRL_PIN(3, "F17"), 55*95c1762aSConor Dooley PINCTRL_PIN(4, "D19"), 56*95c1762aSConor Dooley PINCTRL_PIN(5, "B18"), 57*95c1762aSConor Dooley PINCTRL_PIN(6, "B10"), 58*95c1762aSConor Dooley PINCTRL_PIN(7, "C14"), 59*95c1762aSConor Dooley PINCTRL_PIN(8, "E18"), 60*95c1762aSConor Dooley PINCTRL_PIN(9, "D18"), 61*95c1762aSConor Dooley PINCTRL_PIN(10, "E19"), 62*95c1762aSConor Dooley PINCTRL_PIN(11, "C7"), 63*95c1762aSConor Dooley PINCTRL_PIN(12, "D6"), 64*95c1762aSConor Dooley PINCTRL_PIN(13, "D7"), 65*95c1762aSConor Dooley PINCTRL_PIN(14, "C9"), 66*95c1762aSConor Dooley PINCTRL_PIN(15, "C10"), 67*95c1762aSConor Dooley PINCTRL_PIN(16, "A5"), 68*95c1762aSConor Dooley PINCTRL_PIN(17, "A6"), 69*95c1762aSConor Dooley PINCTRL_PIN(18, "D8"), 70*95c1762aSConor Dooley PINCTRL_PIN(19, "D9"), 71*95c1762aSConor Dooley PINCTRL_PIN(20, "B8"), 72*95c1762aSConor Dooley PINCTRL_PIN(21, "A8"), 73*95c1762aSConor Dooley PINCTRL_PIN(22, "C12"), 74*95c1762aSConor Dooley PINCTRL_PIN(23, "B12"), 75*95c1762aSConor Dooley PINCTRL_PIN(24, "A11"), 76*95c1762aSConor Dooley PINCTRL_PIN(25, "A10"), 77*95c1762aSConor Dooley PINCTRL_PIN(26, "D11"), 78*95c1762aSConor Dooley PINCTRL_PIN(27, "C11"), 79*95c1762aSConor Dooley PINCTRL_PIN(28, "B9"), 80*95c1762aSConor Dooley }; 81*95c1762aSConor Dooley 82*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_mdio0_pins[] = { 83*95c1762aSConor Dooley 0, 1 84*95c1762aSConor Dooley }; 85*95c1762aSConor Dooley 86*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_mdio1_pins[] = { 87*95c1762aSConor Dooley 2, 3 88*95c1762aSConor Dooley }; 89*95c1762aSConor Dooley 90*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_spi0_pins[] = { 91*95c1762aSConor Dooley 4, 5, 10, 11 92*95c1762aSConor Dooley }; 93*95c1762aSConor Dooley 94*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_can0_pins[] = { 95*95c1762aSConor Dooley 6, 24, 28 96*95c1762aSConor Dooley }; 97*95c1762aSConor Dooley 98*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_pcie_pins[] = { 99*95c1762aSConor Dooley 7, 8, 9 100*95c1762aSConor Dooley }; 101*95c1762aSConor Dooley 102*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_qspi_pins[] = { 103*95c1762aSConor Dooley 12, 13, 14, 15, 16, 17 104*95c1762aSConor Dooley }; 105*95c1762aSConor Dooley 106*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_uart3_pins[] = { 107*95c1762aSConor Dooley 18, 19 108*95c1762aSConor Dooley }; 109*95c1762aSConor Dooley 110*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_uart4_pins[] = { 111*95c1762aSConor Dooley 20, 21 112*95c1762aSConor Dooley }; 113*95c1762aSConor Dooley 114*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_can1_pins[] = { 115*95c1762aSConor Dooley 22, 23, 25 116*95c1762aSConor Dooley }; 117*95c1762aSConor Dooley 118*95c1762aSConor Dooley static const unsigned int pic64gx_gpio2_uart2_pins[] = { 119*95c1762aSConor Dooley 26, 27 120*95c1762aSConor Dooley }; 121*95c1762aSConor Dooley 122*95c1762aSConor Dooley #define PIC64GX_PINCTRL_GROUP(_name, _mask) { \ 123*95c1762aSConor Dooley .name = "gpio_" #_name, \ 124*95c1762aSConor Dooley .pins = pic64gx_gpio2_##_name##_pins, \ 125*95c1762aSConor Dooley .num_pins = ARRAY_SIZE(pic64gx_gpio2_##_name##_pins), \ 126*95c1762aSConor Dooley .mask = _mask, \ 127*95c1762aSConor Dooley .setting = 0x0, \ 128*95c1762aSConor Dooley }, { \ 129*95c1762aSConor Dooley .name = #_name, \ 130*95c1762aSConor Dooley .pins = pic64gx_gpio2_##_name##_pins, \ 131*95c1762aSConor Dooley .num_pins = ARRAY_SIZE(pic64gx_gpio2_##_name##_pins), \ 132*95c1762aSConor Dooley .mask = _mask, \ 133*95c1762aSConor Dooley .setting = _mask, \ 134*95c1762aSConor Dooley } 135*95c1762aSConor Dooley 136*95c1762aSConor Dooley static const struct pic64gx_gpio2_pin_group pic64gx_gpio2_pin_groups[] = { 137*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(mdio0, BIT(0) | BIT(1)), 138*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(mdio1, BIT(2) | BIT(3)), 139*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(spi0, BIT(4) | BIT(5) | BIT(10) | BIT(11)), 140*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(can0, BIT(6) | BIT(24) | BIT(28)), 141*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(pcie, BIT(7) | BIT(8) | BIT(9)), 142*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(qspi, GENMASK(17, 12)), 143*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(uart3, BIT(18) | BIT(19)), 144*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(uart4, BIT(20) | BIT(21)), 145*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(can1, BIT(22) | BIT(23) | BIT(25)), 146*95c1762aSConor Dooley PIC64GX_PINCTRL_GROUP(uart2, BIT(26) | BIT(27)), 147*95c1762aSConor Dooley }; 148*95c1762aSConor Dooley 149*95c1762aSConor Dooley static const char * const pic64gx_gpio2_gpio_groups[] = { 150*95c1762aSConor Dooley "gpio_mdio0", "gpio_mdio1", "gpio_spi0", "gpio_can0", "gpio_pcie", 151*95c1762aSConor Dooley "gpio_qspi", "gpio_uart3", "gpio_uart4", "gpio_can1", "gpio_uart2" 152*95c1762aSConor Dooley }; 153*95c1762aSConor Dooley 154*95c1762aSConor Dooley static const char * const pic64gx_gpio2_mdio0_groups[] = { 155*95c1762aSConor Dooley "mdio0" 156*95c1762aSConor Dooley }; 157*95c1762aSConor Dooley 158*95c1762aSConor Dooley static const char * const pic64gx_gpio2_mdio1_groups[] = { 159*95c1762aSConor Dooley "mdio1" 160*95c1762aSConor Dooley }; 161*95c1762aSConor Dooley 162*95c1762aSConor Dooley static const char * const pic64gx_gpio2_spi0_groups[] = { 163*95c1762aSConor Dooley "spi0" 164*95c1762aSConor Dooley }; 165*95c1762aSConor Dooley 166*95c1762aSConor Dooley static const char * const pic64gx_gpio2_can0_groups[] = { 167*95c1762aSConor Dooley "can0" 168*95c1762aSConor Dooley }; 169*95c1762aSConor Dooley 170*95c1762aSConor Dooley static const char * const pic64gx_gpio2_pcie_groups[] = { 171*95c1762aSConor Dooley "pcie" 172*95c1762aSConor Dooley }; 173*95c1762aSConor Dooley 174*95c1762aSConor Dooley static const char * const pic64gx_gpio2_qspi_groups[] = { 175*95c1762aSConor Dooley "qspi" 176*95c1762aSConor Dooley }; 177*95c1762aSConor Dooley 178*95c1762aSConor Dooley static const char * const pic64gx_gpio2_uart3_groups[] = { 179*95c1762aSConor Dooley "uart3" 180*95c1762aSConor Dooley }; 181*95c1762aSConor Dooley 182*95c1762aSConor Dooley static const char * const pic64gx_gpio2_uart4_groups[] = { 183*95c1762aSConor Dooley "uart4" 184*95c1762aSConor Dooley }; 185*95c1762aSConor Dooley 186*95c1762aSConor Dooley static const char * const pic64gx_gpio2_can1_groups[] = { 187*95c1762aSConor Dooley "can1" 188*95c1762aSConor Dooley }; 189*95c1762aSConor Dooley 190*95c1762aSConor Dooley static const char * const pic64gx_gpio2_uart2_groups[] = { 191*95c1762aSConor Dooley "uart2" 192*95c1762aSConor Dooley }; 193*95c1762aSConor Dooley 194*95c1762aSConor Dooley #define PIC64GX_PINCTRL_FUNCTION(_name) { \ 195*95c1762aSConor Dooley .name = #_name, \ 196*95c1762aSConor Dooley .groups = pic64gx_gpio2_##_name##_groups, \ 197*95c1762aSConor Dooley .num_groups = ARRAY_SIZE(pic64gx_gpio2_##_name##_groups), \ 198*95c1762aSConor Dooley } 199*95c1762aSConor Dooley 200*95c1762aSConor Dooley static const struct pic64gx_gpio2_function pic64gx_gpio2_functions[] = { 201*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(gpio), 202*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(mdio0), 203*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(mdio1), 204*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(spi0), 205*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(can0), 206*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(pcie), 207*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(qspi), 208*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(uart3), 209*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(uart4), 210*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(can1), 211*95c1762aSConor Dooley PIC64GX_PINCTRL_FUNCTION(uart2), 212*95c1762aSConor Dooley }; 213*95c1762aSConor Dooley 214*95c1762aSConor Dooley static void pic64gx_gpio2_pin_dbg_show(struct pinctrl_dev *pctrl_dev, struct seq_file *seq, 215*95c1762aSConor Dooley unsigned int pin) 216*95c1762aSConor Dooley { 217*95c1762aSConor Dooley struct pic64gx_gpio2_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); 218*95c1762aSConor Dooley u32 val; 219*95c1762aSConor Dooley 220*95c1762aSConor Dooley regmap_read(pctrl->regmap, PIC64GX_PINMUX_REG, &val); 221*95c1762aSConor Dooley val = (val & BIT(pin)) >> pin; 222*95c1762aSConor Dooley seq_printf(seq, "pin: %u val: %x\n", pin, val); 223*95c1762aSConor Dooley } 224*95c1762aSConor Dooley 225*95c1762aSConor Dooley static int pic64gx_gpio2_groups_count(struct pinctrl_dev *pctldev) 226*95c1762aSConor Dooley { 227*95c1762aSConor Dooley return ARRAY_SIZE(pic64gx_gpio2_pin_groups); 228*95c1762aSConor Dooley } 229*95c1762aSConor Dooley 230*95c1762aSConor Dooley static const char *pic64gx_gpio2_group_name(struct pinctrl_dev *pctldev, unsigned int selector) 231*95c1762aSConor Dooley { 232*95c1762aSConor Dooley return pic64gx_gpio2_pin_groups[selector].name; 233*95c1762aSConor Dooley } 234*95c1762aSConor Dooley 235*95c1762aSConor Dooley static int pic64gx_gpio2_group_pins(struct pinctrl_dev *pctldev, unsigned int selector, 236*95c1762aSConor Dooley const unsigned int **pins, unsigned int *num_pins) 237*95c1762aSConor Dooley { 238*95c1762aSConor Dooley *pins = pic64gx_gpio2_pin_groups[selector].pins; 239*95c1762aSConor Dooley *num_pins = pic64gx_gpio2_pin_groups[selector].num_pins; 240*95c1762aSConor Dooley 241*95c1762aSConor Dooley return 0; 242*95c1762aSConor Dooley } 243*95c1762aSConor Dooley 244*95c1762aSConor Dooley static const struct pinctrl_ops pic64gx_gpio2_pinctrl_ops = { 245*95c1762aSConor Dooley .get_groups_count = pic64gx_gpio2_groups_count, 246*95c1762aSConor Dooley .get_group_name = pic64gx_gpio2_group_name, 247*95c1762aSConor Dooley .get_group_pins = pic64gx_gpio2_group_pins, 248*95c1762aSConor Dooley .dt_node_to_map = pinconf_generic_dt_node_to_map_all, 249*95c1762aSConor Dooley .dt_free_map = pinctrl_utils_free_map, 250*95c1762aSConor Dooley .pin_dbg_show = pic64gx_gpio2_pin_dbg_show, 251*95c1762aSConor Dooley }; 252*95c1762aSConor Dooley 253*95c1762aSConor Dooley static int pic64gx_gpio2_pinmux_get_funcs_count(struct pinctrl_dev *pctldev) 254*95c1762aSConor Dooley { 255*95c1762aSConor Dooley return ARRAY_SIZE(pic64gx_gpio2_functions); 256*95c1762aSConor Dooley } 257*95c1762aSConor Dooley 258*95c1762aSConor Dooley static const char *pic64gx_gpio2_pinmux_get_func_name(struct pinctrl_dev *pctldev, 259*95c1762aSConor Dooley unsigned int selector) 260*95c1762aSConor Dooley { 261*95c1762aSConor Dooley return pic64gx_gpio2_functions[selector].name; 262*95c1762aSConor Dooley } 263*95c1762aSConor Dooley 264*95c1762aSConor Dooley static int pic64gx_gpio2_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned int selector, 265*95c1762aSConor Dooley const char * const **groups, 266*95c1762aSConor Dooley unsigned int * const num_groups) 267*95c1762aSConor Dooley { 268*95c1762aSConor Dooley *groups = pic64gx_gpio2_functions[selector].groups; 269*95c1762aSConor Dooley *num_groups = pic64gx_gpio2_functions[selector].num_groups; 270*95c1762aSConor Dooley 271*95c1762aSConor Dooley return 0; 272*95c1762aSConor Dooley } 273*95c1762aSConor Dooley 274*95c1762aSConor Dooley static int pic64gx_gpio2_pinmux_set_mux(struct pinctrl_dev *pctrl_dev, unsigned int fsel, 275*95c1762aSConor Dooley unsigned int gsel) 276*95c1762aSConor Dooley { 277*95c1762aSConor Dooley struct pic64gx_gpio2_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev); 278*95c1762aSConor Dooley struct device *dev = pctrl->dev; 279*95c1762aSConor Dooley const struct pic64gx_gpio2_pin_group *group; 280*95c1762aSConor Dooley const struct pic64gx_gpio2_function *function; 281*95c1762aSConor Dooley 282*95c1762aSConor Dooley group = &pic64gx_gpio2_pin_groups[gsel]; 283*95c1762aSConor Dooley function = &pic64gx_gpio2_functions[fsel]; 284*95c1762aSConor Dooley 285*95c1762aSConor Dooley dev_dbg(dev, "Setting func %s mask %x setting %x\n", 286*95c1762aSConor Dooley function->name, group->mask, group->setting); 287*95c1762aSConor Dooley regmap_assign_bits(pctrl->regmap, PIC64GX_PINMUX_REG, group->mask, group->setting); 288*95c1762aSConor Dooley 289*95c1762aSConor Dooley return 0; 290*95c1762aSConor Dooley } 291*95c1762aSConor Dooley 292*95c1762aSConor Dooley static const struct pinmux_ops pic64gx_gpio2_pinmux_ops = { 293*95c1762aSConor Dooley .get_functions_count = pic64gx_gpio2_pinmux_get_funcs_count, 294*95c1762aSConor Dooley .get_function_name = pic64gx_gpio2_pinmux_get_func_name, 295*95c1762aSConor Dooley .get_function_groups = pic64gx_gpio2_pinmux_get_groups, 296*95c1762aSConor Dooley .set_mux = pic64gx_gpio2_pinmux_set_mux, 297*95c1762aSConor Dooley }; 298*95c1762aSConor Dooley 299*95c1762aSConor Dooley static int pic64gx_gpio2_probe(struct platform_device *pdev) 300*95c1762aSConor Dooley { 301*95c1762aSConor Dooley struct device *dev = &pdev->dev; 302*95c1762aSConor Dooley struct pic64gx_gpio2_pinctrl *pctrl; 303*95c1762aSConor Dooley void __iomem *base; 304*95c1762aSConor Dooley 305*95c1762aSConor Dooley pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL); 306*95c1762aSConor Dooley if (!pctrl) 307*95c1762aSConor Dooley return -ENOMEM; 308*95c1762aSConor Dooley 309*95c1762aSConor Dooley base = devm_platform_ioremap_resource(pdev, 0); 310*95c1762aSConor Dooley if (IS_ERR(base)) { 311*95c1762aSConor Dooley dev_err(dev, "Failed get resource\n"); 312*95c1762aSConor Dooley return PTR_ERR(base); 313*95c1762aSConor Dooley } 314*95c1762aSConor Dooley 315*95c1762aSConor Dooley pctrl->regmap = devm_regmap_init_mmio(dev, base, &pic64gx_gpio2_regmap_config); 316*95c1762aSConor Dooley if (IS_ERR(pctrl->regmap)) { 317*95c1762aSConor Dooley dev_err(dev, "Failed to map regmap\n"); 318*95c1762aSConor Dooley return PTR_ERR(pctrl->regmap); 319*95c1762aSConor Dooley } 320*95c1762aSConor Dooley 321*95c1762aSConor Dooley pctrl->desc.name = dev_name(dev); 322*95c1762aSConor Dooley pctrl->desc.pins = pic64gx_gpio2_pins; 323*95c1762aSConor Dooley pctrl->desc.npins = ARRAY_SIZE(pic64gx_gpio2_pins); 324*95c1762aSConor Dooley pctrl->desc.pctlops = &pic64gx_gpio2_pinctrl_ops; 325*95c1762aSConor Dooley pctrl->desc.pmxops = &pic64gx_gpio2_pinmux_ops; 326*95c1762aSConor Dooley pctrl->desc.owner = THIS_MODULE; 327*95c1762aSConor Dooley 328*95c1762aSConor Dooley pctrl->dev = dev; 329*95c1762aSConor Dooley 330*95c1762aSConor Dooley platform_set_drvdata(pdev, pctrl); 331*95c1762aSConor Dooley 332*95c1762aSConor Dooley pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &pctrl->desc, pctrl); 333*95c1762aSConor Dooley if (IS_ERR(pctrl->pctrl)) 334*95c1762aSConor Dooley return PTR_ERR(pctrl->pctrl); 335*95c1762aSConor Dooley 336*95c1762aSConor Dooley return 0; 337*95c1762aSConor Dooley } 338*95c1762aSConor Dooley 339*95c1762aSConor Dooley static const struct of_device_id pic64gx_gpio2_of_match[] = { 340*95c1762aSConor Dooley { .compatible = "microchip,pic64gx-pinctrl-gpio2" }, 341*95c1762aSConor Dooley { } 342*95c1762aSConor Dooley }; 343*95c1762aSConor Dooley MODULE_DEVICE_TABLE(of, pic64gx_gpio2_of_match); 344*95c1762aSConor Dooley 345*95c1762aSConor Dooley static struct platform_driver pic64gx_gpio2_driver = { 346*95c1762aSConor Dooley .driver = { 347*95c1762aSConor Dooley .name = "pic64gx-pinctrl-gpio2", 348*95c1762aSConor Dooley .of_match_table = pic64gx_gpio2_of_match, 349*95c1762aSConor Dooley }, 350*95c1762aSConor Dooley .probe = pic64gx_gpio2_probe, 351*95c1762aSConor Dooley }; 352*95c1762aSConor Dooley module_platform_driver(pic64gx_gpio2_driver); 353*95c1762aSConor Dooley 354*95c1762aSConor Dooley MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>"); 355*95c1762aSConor Dooley MODULE_DESCRIPTION("pic64gx gpio2 pinctrl driver"); 356*95c1762aSConor Dooley MODULE_LICENSE("GPL"); 357