1*a83c29e1SYixun Lan // SPDX-License-Identifier: GPL-2.0 2*a83c29e1SYixun Lan /* Copyright (c) 2024 Yixun Lan <dlan@gentoo.org> */ 3*a83c29e1SYixun Lan 4*a83c29e1SYixun Lan #include <linux/bits.h> 5*a83c29e1SYixun Lan #include <linux/cleanup.h> 6*a83c29e1SYixun Lan #include <linux/io.h> 7*a83c29e1SYixun Lan #include <linux/of.h> 8*a83c29e1SYixun Lan #include <linux/platform_device.h> 9*a83c29e1SYixun Lan #include <linux/seq_file.h> 10*a83c29e1SYixun Lan #include <linux/spinlock.h> 11*a83c29e1SYixun Lan #include <linux/module.h> 12*a83c29e1SYixun Lan 13*a83c29e1SYixun Lan #include <linux/pinctrl/pinconf-generic.h> 14*a83c29e1SYixun Lan #include <linux/pinctrl/pinconf.h> 15*a83c29e1SYixun Lan #include <linux/pinctrl/pinctrl.h> 16*a83c29e1SYixun Lan #include <linux/pinctrl/pinmux.h> 17*a83c29e1SYixun Lan 18*a83c29e1SYixun Lan #include "../core.h" 19*a83c29e1SYixun Lan #include "../pinctrl-utils.h" 20*a83c29e1SYixun Lan #include "../pinconf.h" 21*a83c29e1SYixun Lan #include "../pinmux.h" 22*a83c29e1SYixun Lan #include "pinctrl-k1.h" 23*a83c29e1SYixun Lan 24*a83c29e1SYixun Lan /* 25*a83c29e1SYixun Lan * +---------+----------+-----------+--------+--------+----------+--------+ 26*a83c29e1SYixun Lan * | pull | drive | schmitter | slew | edge | strong | mux | 27*a83c29e1SYixun Lan * | up/down | strength | trigger | rate | detect | pull | mode | 28*a83c29e1SYixun Lan * +---------+----------+-----------+--------+--------+----------+--------+ 29*a83c29e1SYixun Lan * 3 bits 3 bits 2 bits 1 bit 3 bits 1 bit 3 bits 30*a83c29e1SYixun Lan */ 31*a83c29e1SYixun Lan 32*a83c29e1SYixun Lan #define PAD_MUX GENMASK(2, 0) 33*a83c29e1SYixun Lan #define PAD_STRONG_PULL BIT(3) 34*a83c29e1SYixun Lan #define PAD_EDGE_RISE BIT(4) 35*a83c29e1SYixun Lan #define PAD_EDGE_FALL BIT(5) 36*a83c29e1SYixun Lan #define PAD_EDGE_CLEAR BIT(6) 37*a83c29e1SYixun Lan #define PAD_SLEW_RATE GENMASK(12, 11) 38*a83c29e1SYixun Lan #define PAD_SLEW_RATE_EN BIT(7) 39*a83c29e1SYixun Lan #define PAD_SCHMITT GENMASK(9, 8) 40*a83c29e1SYixun Lan #define PAD_DRIVE GENMASK(12, 10) 41*a83c29e1SYixun Lan #define PAD_PULLDOWN BIT(13) 42*a83c29e1SYixun Lan #define PAD_PULLUP BIT(14) 43*a83c29e1SYixun Lan #define PAD_PULL_EN BIT(15) 44*a83c29e1SYixun Lan 45*a83c29e1SYixun Lan struct spacemit_pin { 46*a83c29e1SYixun Lan u16 pin; 47*a83c29e1SYixun Lan u16 flags; 48*a83c29e1SYixun Lan u8 gpiofunc; 49*a83c29e1SYixun Lan }; 50*a83c29e1SYixun Lan 51*a83c29e1SYixun Lan struct spacemit_pinctrl { 52*a83c29e1SYixun Lan struct device *dev; 53*a83c29e1SYixun Lan struct pinctrl_dev *pctl_dev; 54*a83c29e1SYixun Lan const struct spacemit_pinctrl_data *data; 55*a83c29e1SYixun Lan struct pinctrl_desc pdesc; 56*a83c29e1SYixun Lan 57*a83c29e1SYixun Lan struct mutex mutex; 58*a83c29e1SYixun Lan raw_spinlock_t lock; 59*a83c29e1SYixun Lan 60*a83c29e1SYixun Lan void __iomem *regs; 61*a83c29e1SYixun Lan }; 62*a83c29e1SYixun Lan 63*a83c29e1SYixun Lan struct spacemit_pinctrl_data { 64*a83c29e1SYixun Lan const struct pinctrl_pin_desc *pins; 65*a83c29e1SYixun Lan const struct spacemit_pin *data; 66*a83c29e1SYixun Lan u16 npins; 67*a83c29e1SYixun Lan }; 68*a83c29e1SYixun Lan 69*a83c29e1SYixun Lan struct spacemit_pin_mux_config { 70*a83c29e1SYixun Lan const struct spacemit_pin *pin; 71*a83c29e1SYixun Lan u32 config; 72*a83c29e1SYixun Lan }; 73*a83c29e1SYixun Lan 74*a83c29e1SYixun Lan struct spacemit_pin_drv_strength { 75*a83c29e1SYixun Lan u8 val; 76*a83c29e1SYixun Lan u32 mA; 77*a83c29e1SYixun Lan }; 78*a83c29e1SYixun Lan 79*a83c29e1SYixun Lan /* map pin id to pinctrl register offset, refer MFPR definition */ 80*a83c29e1SYixun Lan static unsigned int spacemit_pin_to_offset(unsigned int pin) 81*a83c29e1SYixun Lan { 82*a83c29e1SYixun Lan unsigned int offset = 0; 83*a83c29e1SYixun Lan 84*a83c29e1SYixun Lan switch (pin) { 85*a83c29e1SYixun Lan case 0 ... 85: 86*a83c29e1SYixun Lan offset = pin + 1; 87*a83c29e1SYixun Lan break; 88*a83c29e1SYixun Lan case 86 ... 92: 89*a83c29e1SYixun Lan offset = pin + 37; 90*a83c29e1SYixun Lan break; 91*a83c29e1SYixun Lan case 93 ... 97: 92*a83c29e1SYixun Lan offset = pin + 24; 93*a83c29e1SYixun Lan break; 94*a83c29e1SYixun Lan case 98: 95*a83c29e1SYixun Lan offset = 93; 96*a83c29e1SYixun Lan break; 97*a83c29e1SYixun Lan case 99: 98*a83c29e1SYixun Lan offset = 92; 99*a83c29e1SYixun Lan break; 100*a83c29e1SYixun Lan case 100: 101*a83c29e1SYixun Lan offset = 91; 102*a83c29e1SYixun Lan break; 103*a83c29e1SYixun Lan case 101: 104*a83c29e1SYixun Lan offset = 90; 105*a83c29e1SYixun Lan break; 106*a83c29e1SYixun Lan case 102: 107*a83c29e1SYixun Lan offset = 95; 108*a83c29e1SYixun Lan break; 109*a83c29e1SYixun Lan case 103: 110*a83c29e1SYixun Lan offset = 94; 111*a83c29e1SYixun Lan break; 112*a83c29e1SYixun Lan case 104 ... 110: 113*a83c29e1SYixun Lan offset = pin + 6; 114*a83c29e1SYixun Lan break; 115*a83c29e1SYixun Lan case 111 ... 127: 116*a83c29e1SYixun Lan offset = pin + 20; 117*a83c29e1SYixun Lan break; 118*a83c29e1SYixun Lan default: 119*a83c29e1SYixun Lan break; 120*a83c29e1SYixun Lan } 121*a83c29e1SYixun Lan 122*a83c29e1SYixun Lan return offset << 2; 123*a83c29e1SYixun Lan } 124*a83c29e1SYixun Lan 125*a83c29e1SYixun Lan static inline void __iomem *spacemit_pin_to_reg(struct spacemit_pinctrl *pctrl, 126*a83c29e1SYixun Lan unsigned int pin) 127*a83c29e1SYixun Lan { 128*a83c29e1SYixun Lan return pctrl->regs + spacemit_pin_to_offset(pin); 129*a83c29e1SYixun Lan } 130*a83c29e1SYixun Lan 131*a83c29e1SYixun Lan static u16 spacemit_dt_get_pin(u32 value) 132*a83c29e1SYixun Lan { 133*a83c29e1SYixun Lan return value >> 16; 134*a83c29e1SYixun Lan } 135*a83c29e1SYixun Lan 136*a83c29e1SYixun Lan static u16 spacemit_dt_get_pin_mux(u32 value) 137*a83c29e1SYixun Lan { 138*a83c29e1SYixun Lan return value & GENMASK(15, 0); 139*a83c29e1SYixun Lan } 140*a83c29e1SYixun Lan 141*a83c29e1SYixun Lan static const struct spacemit_pin *spacemit_get_pin(struct spacemit_pinctrl *pctrl, 142*a83c29e1SYixun Lan unsigned long pin) 143*a83c29e1SYixun Lan { 144*a83c29e1SYixun Lan const struct spacemit_pin *pdata = pctrl->data->data; 145*a83c29e1SYixun Lan int i; 146*a83c29e1SYixun Lan 147*a83c29e1SYixun Lan for (i = 0; i < pctrl->data->npins; i++) { 148*a83c29e1SYixun Lan if (pin == pdata[i].pin) 149*a83c29e1SYixun Lan return &pdata[i]; 150*a83c29e1SYixun Lan } 151*a83c29e1SYixun Lan 152*a83c29e1SYixun Lan return NULL; 153*a83c29e1SYixun Lan } 154*a83c29e1SYixun Lan 155*a83c29e1SYixun Lan static inline enum spacemit_pin_io_type spacemit_to_pin_io_type( 156*a83c29e1SYixun Lan const struct spacemit_pin *pin) 157*a83c29e1SYixun Lan { 158*a83c29e1SYixun Lan return K1_PIN_GET_IO_TYPE(pin->flags); 159*a83c29e1SYixun Lan } 160*a83c29e1SYixun Lan 161*a83c29e1SYixun Lan /* External: IO voltage via external source, can be 1.8V or 3.3V */ 162*a83c29e1SYixun Lan static const char * const io_type_desc[] = { 163*a83c29e1SYixun Lan "None", 164*a83c29e1SYixun Lan "Fixed/1V8", 165*a83c29e1SYixun Lan "Fixed/3V3", 166*a83c29e1SYixun Lan "External", 167*a83c29e1SYixun Lan }; 168*a83c29e1SYixun Lan 169*a83c29e1SYixun Lan static void spacemit_pctrl_dbg_show(struct pinctrl_dev *pctldev, 170*a83c29e1SYixun Lan struct seq_file *seq, unsigned int pin) 171*a83c29e1SYixun Lan { 172*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 173*a83c29e1SYixun Lan const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); 174*a83c29e1SYixun Lan enum spacemit_pin_io_type type = spacemit_to_pin_io_type(spin); 175*a83c29e1SYixun Lan void __iomem *reg; 176*a83c29e1SYixun Lan u32 value; 177*a83c29e1SYixun Lan 178*a83c29e1SYixun Lan seq_printf(seq, "offset: 0x%04x ", spacemit_pin_to_offset(pin)); 179*a83c29e1SYixun Lan seq_printf(seq, "type: %s ", io_type_desc[type]); 180*a83c29e1SYixun Lan 181*a83c29e1SYixun Lan reg = spacemit_pin_to_reg(pctrl, pin); 182*a83c29e1SYixun Lan value = readl(reg); 183*a83c29e1SYixun Lan seq_printf(seq, "mux: %ld reg: 0x%04x", (value & PAD_MUX), value); 184*a83c29e1SYixun Lan } 185*a83c29e1SYixun Lan 186*a83c29e1SYixun Lan /* use IO high level output current as the table */ 187*a83c29e1SYixun Lan static struct spacemit_pin_drv_strength spacemit_ds_1v8_tbl[4] = { 188*a83c29e1SYixun Lan { 0, 11 }, 189*a83c29e1SYixun Lan { 2, 21 }, 190*a83c29e1SYixun Lan { 4, 32 }, 191*a83c29e1SYixun Lan { 6, 42 }, 192*a83c29e1SYixun Lan }; 193*a83c29e1SYixun Lan 194*a83c29e1SYixun Lan static struct spacemit_pin_drv_strength spacemit_ds_3v3_tbl[8] = { 195*a83c29e1SYixun Lan { 0, 7 }, 196*a83c29e1SYixun Lan { 2, 10 }, 197*a83c29e1SYixun Lan { 4, 13 }, 198*a83c29e1SYixun Lan { 6, 16 }, 199*a83c29e1SYixun Lan { 1, 19 }, 200*a83c29e1SYixun Lan { 3, 23 }, 201*a83c29e1SYixun Lan { 5, 26 }, 202*a83c29e1SYixun Lan { 7, 29 }, 203*a83c29e1SYixun Lan }; 204*a83c29e1SYixun Lan 205*a83c29e1SYixun Lan static inline u8 spacemit_get_ds_value(struct spacemit_pin_drv_strength *tbl, 206*a83c29e1SYixun Lan u32 num, u32 mA) 207*a83c29e1SYixun Lan { 208*a83c29e1SYixun Lan int i; 209*a83c29e1SYixun Lan 210*a83c29e1SYixun Lan for (i = 0; i < num; i++) 211*a83c29e1SYixun Lan if (mA <= tbl[i].mA) 212*a83c29e1SYixun Lan return tbl[i].val; 213*a83c29e1SYixun Lan 214*a83c29e1SYixun Lan return tbl[num - 1].val; 215*a83c29e1SYixun Lan } 216*a83c29e1SYixun Lan 217*a83c29e1SYixun Lan static inline u32 spacemit_get_ds_mA(struct spacemit_pin_drv_strength *tbl, 218*a83c29e1SYixun Lan u32 num, u32 val) 219*a83c29e1SYixun Lan { 220*a83c29e1SYixun Lan int i; 221*a83c29e1SYixun Lan 222*a83c29e1SYixun Lan for (i = 0; i < num; i++) 223*a83c29e1SYixun Lan if (val == tbl[i].val) 224*a83c29e1SYixun Lan return tbl[i].mA; 225*a83c29e1SYixun Lan 226*a83c29e1SYixun Lan return 0; 227*a83c29e1SYixun Lan } 228*a83c29e1SYixun Lan 229*a83c29e1SYixun Lan static inline u8 spacemit_get_driver_strength(enum spacemit_pin_io_type type, 230*a83c29e1SYixun Lan u32 mA) 231*a83c29e1SYixun Lan { 232*a83c29e1SYixun Lan switch (type) { 233*a83c29e1SYixun Lan case IO_TYPE_1V8: 234*a83c29e1SYixun Lan return spacemit_get_ds_value(spacemit_ds_1v8_tbl, 235*a83c29e1SYixun Lan ARRAY_SIZE(spacemit_ds_1v8_tbl), 236*a83c29e1SYixun Lan mA); 237*a83c29e1SYixun Lan case IO_TYPE_3V3: 238*a83c29e1SYixun Lan return spacemit_get_ds_value(spacemit_ds_3v3_tbl, 239*a83c29e1SYixun Lan ARRAY_SIZE(spacemit_ds_3v3_tbl), 240*a83c29e1SYixun Lan mA); 241*a83c29e1SYixun Lan default: 242*a83c29e1SYixun Lan return 0; 243*a83c29e1SYixun Lan } 244*a83c29e1SYixun Lan } 245*a83c29e1SYixun Lan 246*a83c29e1SYixun Lan static inline u32 spacemit_get_drive_strength_mA(enum spacemit_pin_io_type type, 247*a83c29e1SYixun Lan u32 value) 248*a83c29e1SYixun Lan { 249*a83c29e1SYixun Lan switch (type) { 250*a83c29e1SYixun Lan case IO_TYPE_1V8: 251*a83c29e1SYixun Lan return spacemit_get_ds_mA(spacemit_ds_1v8_tbl, 252*a83c29e1SYixun Lan ARRAY_SIZE(spacemit_ds_1v8_tbl), 253*a83c29e1SYixun Lan value & 0x6); 254*a83c29e1SYixun Lan case IO_TYPE_3V3: 255*a83c29e1SYixun Lan return spacemit_get_ds_mA(spacemit_ds_3v3_tbl, 256*a83c29e1SYixun Lan ARRAY_SIZE(spacemit_ds_3v3_tbl), 257*a83c29e1SYixun Lan value); 258*a83c29e1SYixun Lan default: 259*a83c29e1SYixun Lan return 0; 260*a83c29e1SYixun Lan } 261*a83c29e1SYixun Lan } 262*a83c29e1SYixun Lan 263*a83c29e1SYixun Lan static int spacemit_pctrl_check_power(struct pinctrl_dev *pctldev, 264*a83c29e1SYixun Lan struct device_node *dn, 265*a83c29e1SYixun Lan struct spacemit_pin_mux_config *pinmuxs, 266*a83c29e1SYixun Lan int num_pins, const char *grpname) 267*a83c29e1SYixun Lan { 268*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 269*a83c29e1SYixun Lan struct device *dev = pctrl->dev; 270*a83c29e1SYixun Lan enum spacemit_pin_io_type type; 271*a83c29e1SYixun Lan u32 power = 0, i; 272*a83c29e1SYixun Lan 273*a83c29e1SYixun Lan of_property_read_u32(dn, "power-source", &power); 274*a83c29e1SYixun Lan 275*a83c29e1SYixun Lan for (i = 0; i < num_pins; i++) { 276*a83c29e1SYixun Lan type = spacemit_to_pin_io_type(pinmuxs[i].pin); 277*a83c29e1SYixun Lan 278*a83c29e1SYixun Lan if (type != IO_TYPE_EXTERNAL) 279*a83c29e1SYixun Lan continue; 280*a83c29e1SYixun Lan 281*a83c29e1SYixun Lan switch (power) { 282*a83c29e1SYixun Lan case PIN_POWER_STATE_1V8: 283*a83c29e1SYixun Lan case PIN_POWER_STATE_3V3: 284*a83c29e1SYixun Lan break; 285*a83c29e1SYixun Lan default: 286*a83c29e1SYixun Lan dev_err(dev, "group %s has unsupported power\n", 287*a83c29e1SYixun Lan grpname); 288*a83c29e1SYixun Lan return -ENOTSUPP; 289*a83c29e1SYixun Lan } 290*a83c29e1SYixun Lan } 291*a83c29e1SYixun Lan 292*a83c29e1SYixun Lan return 0; 293*a83c29e1SYixun Lan } 294*a83c29e1SYixun Lan 295*a83c29e1SYixun Lan static int spacemit_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev, 296*a83c29e1SYixun Lan struct device_node *np, 297*a83c29e1SYixun Lan struct pinctrl_map **maps, 298*a83c29e1SYixun Lan unsigned int *num_maps) 299*a83c29e1SYixun Lan { 300*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 301*a83c29e1SYixun Lan struct device *dev = pctrl->dev; 302*a83c29e1SYixun Lan struct device_node *child; 303*a83c29e1SYixun Lan struct pinctrl_map *map; 304*a83c29e1SYixun Lan const char **grpnames; 305*a83c29e1SYixun Lan const char *grpname; 306*a83c29e1SYixun Lan int ngroups = 0; 307*a83c29e1SYixun Lan int nmaps = 0; 308*a83c29e1SYixun Lan int ret; 309*a83c29e1SYixun Lan 310*a83c29e1SYixun Lan for_each_available_child_of_node(np, child) 311*a83c29e1SYixun Lan ngroups += 1; 312*a83c29e1SYixun Lan 313*a83c29e1SYixun Lan grpnames = devm_kcalloc(dev, ngroups, sizeof(*grpnames), GFP_KERNEL); 314*a83c29e1SYixun Lan if (!grpnames) 315*a83c29e1SYixun Lan return -ENOMEM; 316*a83c29e1SYixun Lan 317*a83c29e1SYixun Lan map = devm_kcalloc(dev, ngroups * 2, sizeof(*map), GFP_KERNEL); 318*a83c29e1SYixun Lan if (!map) 319*a83c29e1SYixun Lan return -ENOMEM; 320*a83c29e1SYixun Lan 321*a83c29e1SYixun Lan ngroups = 0; 322*a83c29e1SYixun Lan guard(mutex)(&pctrl->mutex); 323*a83c29e1SYixun Lan for_each_available_child_of_node_scoped(np, child) { 324*a83c29e1SYixun Lan struct spacemit_pin_mux_config *pinmuxs; 325*a83c29e1SYixun Lan unsigned int config, *pins; 326*a83c29e1SYixun Lan int i, npins; 327*a83c29e1SYixun Lan 328*a83c29e1SYixun Lan npins = of_property_count_u32_elems(child, "pinmux"); 329*a83c29e1SYixun Lan 330*a83c29e1SYixun Lan if (npins < 1) { 331*a83c29e1SYixun Lan dev_err(dev, "invalid pinctrl group %pOFn.%pOFn\n", 332*a83c29e1SYixun Lan np, child); 333*a83c29e1SYixun Lan return -EINVAL; 334*a83c29e1SYixun Lan } 335*a83c29e1SYixun Lan 336*a83c29e1SYixun Lan grpname = devm_kasprintf(dev, GFP_KERNEL, "%pOFn.%pOFn", 337*a83c29e1SYixun Lan np, child); 338*a83c29e1SYixun Lan if (!grpname) 339*a83c29e1SYixun Lan return -ENOMEM; 340*a83c29e1SYixun Lan 341*a83c29e1SYixun Lan grpnames[ngroups++] = grpname; 342*a83c29e1SYixun Lan 343*a83c29e1SYixun Lan pins = devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL); 344*a83c29e1SYixun Lan if (!pins) 345*a83c29e1SYixun Lan return -ENOMEM; 346*a83c29e1SYixun Lan 347*a83c29e1SYixun Lan pinmuxs = devm_kcalloc(dev, npins, sizeof(*pinmuxs), GFP_KERNEL); 348*a83c29e1SYixun Lan if (!pinmuxs) 349*a83c29e1SYixun Lan return -ENOMEM; 350*a83c29e1SYixun Lan 351*a83c29e1SYixun Lan for (i = 0; i < npins; i++) { 352*a83c29e1SYixun Lan ret = of_property_read_u32_index(child, "pinmux", 353*a83c29e1SYixun Lan i, &config); 354*a83c29e1SYixun Lan 355*a83c29e1SYixun Lan if (ret) 356*a83c29e1SYixun Lan return -EINVAL; 357*a83c29e1SYixun Lan 358*a83c29e1SYixun Lan pins[i] = spacemit_dt_get_pin(config); 359*a83c29e1SYixun Lan pinmuxs[i].config = config; 360*a83c29e1SYixun Lan pinmuxs[i].pin = spacemit_get_pin(pctrl, pins[i]); 361*a83c29e1SYixun Lan 362*a83c29e1SYixun Lan if (!pinmuxs[i].pin) 363*a83c29e1SYixun Lan return dev_err_probe(dev, -ENODEV, "failed to get pin %d\n", pins[i]); 364*a83c29e1SYixun Lan } 365*a83c29e1SYixun Lan 366*a83c29e1SYixun Lan ret = spacemit_pctrl_check_power(pctldev, child, pinmuxs, 367*a83c29e1SYixun Lan npins, grpname); 368*a83c29e1SYixun Lan if (ret < 0) 369*a83c29e1SYixun Lan return ret; 370*a83c29e1SYixun Lan 371*a83c29e1SYixun Lan map[nmaps].type = PIN_MAP_TYPE_MUX_GROUP; 372*a83c29e1SYixun Lan map[nmaps].data.mux.function = np->name; 373*a83c29e1SYixun Lan map[nmaps].data.mux.group = grpname; 374*a83c29e1SYixun Lan nmaps += 1; 375*a83c29e1SYixun Lan 376*a83c29e1SYixun Lan ret = pinctrl_generic_add_group(pctldev, grpname, 377*a83c29e1SYixun Lan pins, npins, pinmuxs); 378*a83c29e1SYixun Lan if (ret < 0) 379*a83c29e1SYixun Lan return dev_err_probe(dev, ret, "failed to add group %s: %d\n", grpname, ret); 380*a83c29e1SYixun Lan 381*a83c29e1SYixun Lan ret = pinconf_generic_parse_dt_config(child, pctldev, 382*a83c29e1SYixun Lan &map[nmaps].data.configs.configs, 383*a83c29e1SYixun Lan &map[nmaps].data.configs.num_configs); 384*a83c29e1SYixun Lan if (ret) 385*a83c29e1SYixun Lan return dev_err_probe(dev, ret, "failed to parse pin config of group %s\n", 386*a83c29e1SYixun Lan grpname); 387*a83c29e1SYixun Lan 388*a83c29e1SYixun Lan if (map[nmaps].data.configs.num_configs == 0) 389*a83c29e1SYixun Lan continue; 390*a83c29e1SYixun Lan 391*a83c29e1SYixun Lan map[nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP; 392*a83c29e1SYixun Lan map[nmaps].data.configs.group_or_pin = grpname; 393*a83c29e1SYixun Lan nmaps += 1; 394*a83c29e1SYixun Lan } 395*a83c29e1SYixun Lan 396*a83c29e1SYixun Lan ret = pinmux_generic_add_function(pctldev, np->name, 397*a83c29e1SYixun Lan grpnames, ngroups, NULL); 398*a83c29e1SYixun Lan if (ret < 0) { 399*a83c29e1SYixun Lan pinctrl_utils_free_map(pctldev, map, nmaps); 400*a83c29e1SYixun Lan return dev_err_probe(dev, ret, "error adding function %s\n", np->name); 401*a83c29e1SYixun Lan } 402*a83c29e1SYixun Lan 403*a83c29e1SYixun Lan *maps = map; 404*a83c29e1SYixun Lan *num_maps = nmaps; 405*a83c29e1SYixun Lan 406*a83c29e1SYixun Lan return 0; 407*a83c29e1SYixun Lan } 408*a83c29e1SYixun Lan 409*a83c29e1SYixun Lan static const struct pinctrl_ops spacemit_pctrl_ops = { 410*a83c29e1SYixun Lan .get_groups_count = pinctrl_generic_get_group_count, 411*a83c29e1SYixun Lan .get_group_name = pinctrl_generic_get_group_name, 412*a83c29e1SYixun Lan .get_group_pins = pinctrl_generic_get_group_pins, 413*a83c29e1SYixun Lan .pin_dbg_show = spacemit_pctrl_dbg_show, 414*a83c29e1SYixun Lan .dt_node_to_map = spacemit_pctrl_dt_node_to_map, 415*a83c29e1SYixun Lan .dt_free_map = pinctrl_utils_free_map, 416*a83c29e1SYixun Lan }; 417*a83c29e1SYixun Lan 418*a83c29e1SYixun Lan static int spacemit_pmx_set_mux(struct pinctrl_dev *pctldev, 419*a83c29e1SYixun Lan unsigned int fsel, unsigned int gsel) 420*a83c29e1SYixun Lan { 421*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 422*a83c29e1SYixun Lan const struct group_desc *group; 423*a83c29e1SYixun Lan const struct spacemit_pin_mux_config *configs; 424*a83c29e1SYixun Lan unsigned int i, mux; 425*a83c29e1SYixun Lan void __iomem *reg; 426*a83c29e1SYixun Lan 427*a83c29e1SYixun Lan group = pinctrl_generic_get_group(pctldev, gsel); 428*a83c29e1SYixun Lan if (!group) 429*a83c29e1SYixun Lan return -EINVAL; 430*a83c29e1SYixun Lan 431*a83c29e1SYixun Lan configs = group->data; 432*a83c29e1SYixun Lan 433*a83c29e1SYixun Lan for (i = 0; i < group->grp.npins; i++) { 434*a83c29e1SYixun Lan const struct spacemit_pin *spin = configs[i].pin; 435*a83c29e1SYixun Lan u32 value = configs[i].config; 436*a83c29e1SYixun Lan 437*a83c29e1SYixun Lan reg = spacemit_pin_to_reg(pctrl, spin->pin); 438*a83c29e1SYixun Lan mux = spacemit_dt_get_pin_mux(value); 439*a83c29e1SYixun Lan 440*a83c29e1SYixun Lan guard(raw_spinlock_irqsave)(&pctrl->lock); 441*a83c29e1SYixun Lan value = readl_relaxed(reg) & ~PAD_MUX; 442*a83c29e1SYixun Lan writel_relaxed(mux | value, reg); 443*a83c29e1SYixun Lan } 444*a83c29e1SYixun Lan 445*a83c29e1SYixun Lan return 0; 446*a83c29e1SYixun Lan } 447*a83c29e1SYixun Lan 448*a83c29e1SYixun Lan static int spacemit_request_gpio(struct pinctrl_dev *pctldev, 449*a83c29e1SYixun Lan struct pinctrl_gpio_range *range, 450*a83c29e1SYixun Lan unsigned int pin) 451*a83c29e1SYixun Lan { 452*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 453*a83c29e1SYixun Lan const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); 454*a83c29e1SYixun Lan void __iomem *reg; 455*a83c29e1SYixun Lan 456*a83c29e1SYixun Lan reg = spacemit_pin_to_reg(pctrl, pin); 457*a83c29e1SYixun Lan guard(raw_spinlock_irqsave)(&pctrl->lock); 458*a83c29e1SYixun Lan writel_relaxed(spin->gpiofunc, reg); 459*a83c29e1SYixun Lan 460*a83c29e1SYixun Lan return 0; 461*a83c29e1SYixun Lan } 462*a83c29e1SYixun Lan 463*a83c29e1SYixun Lan static const struct pinmux_ops spacemit_pmx_ops = { 464*a83c29e1SYixun Lan .get_functions_count = pinmux_generic_get_function_count, 465*a83c29e1SYixun Lan .get_function_name = pinmux_generic_get_function_name, 466*a83c29e1SYixun Lan .get_function_groups = pinmux_generic_get_function_groups, 467*a83c29e1SYixun Lan .set_mux = spacemit_pmx_set_mux, 468*a83c29e1SYixun Lan .gpio_request_enable = spacemit_request_gpio, 469*a83c29e1SYixun Lan .strict = true, 470*a83c29e1SYixun Lan }; 471*a83c29e1SYixun Lan 472*a83c29e1SYixun Lan static int spacemit_pinconf_get(struct pinctrl_dev *pctldev, 473*a83c29e1SYixun Lan unsigned int pin, unsigned long *config) 474*a83c29e1SYixun Lan { 475*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 476*a83c29e1SYixun Lan int param = pinconf_to_config_param(*config); 477*a83c29e1SYixun Lan u32 value, arg = 0; 478*a83c29e1SYixun Lan 479*a83c29e1SYixun Lan if (!pin) 480*a83c29e1SYixun Lan return -EINVAL; 481*a83c29e1SYixun Lan 482*a83c29e1SYixun Lan value = readl(spacemit_pin_to_reg(pctrl, pin)); 483*a83c29e1SYixun Lan 484*a83c29e1SYixun Lan switch (param) { 485*a83c29e1SYixun Lan case PIN_CONFIG_SLEW_RATE: 486*a83c29e1SYixun Lan if (FIELD_GET(PAD_SLEW_RATE_EN, value)) 487*a83c29e1SYixun Lan arg = FIELD_GET(PAD_SLEW_RATE, value) + 2; 488*a83c29e1SYixun Lan else 489*a83c29e1SYixun Lan arg = 0; 490*a83c29e1SYixun Lan break; 491*a83c29e1SYixun Lan default: 492*a83c29e1SYixun Lan return -EINVAL; 493*a83c29e1SYixun Lan } 494*a83c29e1SYixun Lan 495*a83c29e1SYixun Lan *config = pinconf_to_config_packed(param, arg); 496*a83c29e1SYixun Lan 497*a83c29e1SYixun Lan return 0; 498*a83c29e1SYixun Lan } 499*a83c29e1SYixun Lan 500*a83c29e1SYixun Lan #define ENABLE_DRV_STRENGTH BIT(1) 501*a83c29e1SYixun Lan #define ENABLE_SLEW_RATE BIT(2) 502*a83c29e1SYixun Lan static int spacemit_pinconf_generate_config(const struct spacemit_pin *spin, 503*a83c29e1SYixun Lan unsigned long *configs, 504*a83c29e1SYixun Lan unsigned int num_configs, 505*a83c29e1SYixun Lan u32 *value) 506*a83c29e1SYixun Lan { 507*a83c29e1SYixun Lan enum spacemit_pin_io_type type; 508*a83c29e1SYixun Lan int i, param; 509*a83c29e1SYixun Lan u32 v = 0, voltage = 0, arg, val; 510*a83c29e1SYixun Lan u32 flag = 0, drv_strength, slew_rate; 511*a83c29e1SYixun Lan 512*a83c29e1SYixun Lan if (!spin) 513*a83c29e1SYixun Lan return -EINVAL; 514*a83c29e1SYixun Lan 515*a83c29e1SYixun Lan for (i = 0; i < num_configs; i++) { 516*a83c29e1SYixun Lan param = pinconf_to_config_param(configs[i]); 517*a83c29e1SYixun Lan arg = pinconf_to_config_argument(configs[i]); 518*a83c29e1SYixun Lan 519*a83c29e1SYixun Lan switch (param) { 520*a83c29e1SYixun Lan case PIN_CONFIG_BIAS_DISABLE: 521*a83c29e1SYixun Lan v &= ~(PAD_PULL_EN | PAD_PULLDOWN | PAD_PULLUP); 522*a83c29e1SYixun Lan v &= ~PAD_STRONG_PULL; 523*a83c29e1SYixun Lan break; 524*a83c29e1SYixun Lan case PIN_CONFIG_BIAS_PULL_DOWN: 525*a83c29e1SYixun Lan v &= ~(PAD_PULLUP | PAD_STRONG_PULL); 526*a83c29e1SYixun Lan v |= (PAD_PULL_EN | PAD_PULLDOWN); 527*a83c29e1SYixun Lan break; 528*a83c29e1SYixun Lan case PIN_CONFIG_BIAS_PULL_UP: 529*a83c29e1SYixun Lan v &= ~PAD_PULLDOWN; 530*a83c29e1SYixun Lan v |= (PAD_PULL_EN | PAD_PULLUP); 531*a83c29e1SYixun Lan 532*a83c29e1SYixun Lan if (arg == 1) 533*a83c29e1SYixun Lan v |= PAD_STRONG_PULL; 534*a83c29e1SYixun Lan break; 535*a83c29e1SYixun Lan case PIN_CONFIG_DRIVE_STRENGTH: 536*a83c29e1SYixun Lan flag |= ENABLE_DRV_STRENGTH; 537*a83c29e1SYixun Lan drv_strength = arg; 538*a83c29e1SYixun Lan break; 539*a83c29e1SYixun Lan case PIN_CONFIG_INPUT_SCHMITT: 540*a83c29e1SYixun Lan v &= ~PAD_SCHMITT; 541*a83c29e1SYixun Lan v |= FIELD_PREP(PAD_SCHMITT, arg); 542*a83c29e1SYixun Lan break; 543*a83c29e1SYixun Lan case PIN_CONFIG_POWER_SOURCE: 544*a83c29e1SYixun Lan voltage = arg; 545*a83c29e1SYixun Lan break; 546*a83c29e1SYixun Lan case PIN_CONFIG_SLEW_RATE: 547*a83c29e1SYixun Lan if (arg) { 548*a83c29e1SYixun Lan flag |= ENABLE_SLEW_RATE; 549*a83c29e1SYixun Lan v |= PAD_SLEW_RATE_EN; 550*a83c29e1SYixun Lan slew_rate = arg; 551*a83c29e1SYixun Lan } else { 552*a83c29e1SYixun Lan v &= ~PAD_SLEW_RATE_EN; 553*a83c29e1SYixun Lan } 554*a83c29e1SYixun Lan break; 555*a83c29e1SYixun Lan default: 556*a83c29e1SYixun Lan return -EINVAL; 557*a83c29e1SYixun Lan } 558*a83c29e1SYixun Lan } 559*a83c29e1SYixun Lan 560*a83c29e1SYixun Lan if (flag & ENABLE_DRV_STRENGTH) { 561*a83c29e1SYixun Lan type = spacemit_to_pin_io_type(spin); 562*a83c29e1SYixun Lan 563*a83c29e1SYixun Lan /* fix external io type */ 564*a83c29e1SYixun Lan if (type == IO_TYPE_EXTERNAL) { 565*a83c29e1SYixun Lan switch (voltage) { 566*a83c29e1SYixun Lan case 1800: 567*a83c29e1SYixun Lan type = IO_TYPE_1V8; 568*a83c29e1SYixun Lan break; 569*a83c29e1SYixun Lan case 3300: 570*a83c29e1SYixun Lan type = IO_TYPE_3V3; 571*a83c29e1SYixun Lan break; 572*a83c29e1SYixun Lan default: 573*a83c29e1SYixun Lan return -EINVAL; 574*a83c29e1SYixun Lan } 575*a83c29e1SYixun Lan } 576*a83c29e1SYixun Lan 577*a83c29e1SYixun Lan val = spacemit_get_driver_strength(type, drv_strength); 578*a83c29e1SYixun Lan 579*a83c29e1SYixun Lan v &= ~PAD_DRIVE; 580*a83c29e1SYixun Lan v |= FIELD_PREP(PAD_DRIVE, val); 581*a83c29e1SYixun Lan } 582*a83c29e1SYixun Lan 583*a83c29e1SYixun Lan if (flag & ENABLE_SLEW_RATE) { 584*a83c29e1SYixun Lan /* check, driver strength & slew rate */ 585*a83c29e1SYixun Lan if (flag & ENABLE_DRV_STRENGTH) { 586*a83c29e1SYixun Lan val = FIELD_GET(PAD_SLEW_RATE, v) + 2; 587*a83c29e1SYixun Lan if (slew_rate > 1 && slew_rate != val) { 588*a83c29e1SYixun Lan pr_err("slew rate conflict with drive strength\n"); 589*a83c29e1SYixun Lan return -EINVAL; 590*a83c29e1SYixun Lan } 591*a83c29e1SYixun Lan } else { 592*a83c29e1SYixun Lan v &= ~PAD_SLEW_RATE; 593*a83c29e1SYixun Lan slew_rate = slew_rate > 1 ? (slew_rate - 2) : 0; 594*a83c29e1SYixun Lan v |= FIELD_PREP(PAD_SLEW_RATE, slew_rate); 595*a83c29e1SYixun Lan } 596*a83c29e1SYixun Lan } 597*a83c29e1SYixun Lan 598*a83c29e1SYixun Lan *value = v; 599*a83c29e1SYixun Lan 600*a83c29e1SYixun Lan return 0; 601*a83c29e1SYixun Lan } 602*a83c29e1SYixun Lan 603*a83c29e1SYixun Lan static int spacemit_pin_set_config(struct spacemit_pinctrl *pctrl, 604*a83c29e1SYixun Lan unsigned int pin, u32 value) 605*a83c29e1SYixun Lan { 606*a83c29e1SYixun Lan const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); 607*a83c29e1SYixun Lan void __iomem *reg; 608*a83c29e1SYixun Lan unsigned int mux; 609*a83c29e1SYixun Lan 610*a83c29e1SYixun Lan if (!pin) 611*a83c29e1SYixun Lan return -EINVAL; 612*a83c29e1SYixun Lan 613*a83c29e1SYixun Lan reg = spacemit_pin_to_reg(pctrl, spin->pin); 614*a83c29e1SYixun Lan 615*a83c29e1SYixun Lan guard(raw_spinlock_irqsave)(&pctrl->lock); 616*a83c29e1SYixun Lan mux = readl_relaxed(reg) & PAD_MUX; 617*a83c29e1SYixun Lan writel_relaxed(mux | value, reg); 618*a83c29e1SYixun Lan 619*a83c29e1SYixun Lan return 0; 620*a83c29e1SYixun Lan } 621*a83c29e1SYixun Lan 622*a83c29e1SYixun Lan static int spacemit_pinconf_set(struct pinctrl_dev *pctldev, 623*a83c29e1SYixun Lan unsigned int pin, unsigned long *configs, 624*a83c29e1SYixun Lan unsigned int num_configs) 625*a83c29e1SYixun Lan { 626*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 627*a83c29e1SYixun Lan const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); 628*a83c29e1SYixun Lan u32 value; 629*a83c29e1SYixun Lan 630*a83c29e1SYixun Lan if (spacemit_pinconf_generate_config(spin, configs, num_configs, &value)) 631*a83c29e1SYixun Lan return -EINVAL; 632*a83c29e1SYixun Lan 633*a83c29e1SYixun Lan return spacemit_pin_set_config(pctrl, pin, value); 634*a83c29e1SYixun Lan } 635*a83c29e1SYixun Lan 636*a83c29e1SYixun Lan static int spacemit_pinconf_group_set(struct pinctrl_dev *pctldev, 637*a83c29e1SYixun Lan unsigned int gsel, 638*a83c29e1SYixun Lan unsigned long *configs, 639*a83c29e1SYixun Lan unsigned int num_configs) 640*a83c29e1SYixun Lan { 641*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 642*a83c29e1SYixun Lan const struct spacemit_pin *spin; 643*a83c29e1SYixun Lan const struct group_desc *group; 644*a83c29e1SYixun Lan u32 value; 645*a83c29e1SYixun Lan int i; 646*a83c29e1SYixun Lan 647*a83c29e1SYixun Lan group = pinctrl_generic_get_group(pctldev, gsel); 648*a83c29e1SYixun Lan if (!group) 649*a83c29e1SYixun Lan return -EINVAL; 650*a83c29e1SYixun Lan 651*a83c29e1SYixun Lan spin = spacemit_get_pin(pctrl, group->grp.pins[0]); 652*a83c29e1SYixun Lan if (spacemit_pinconf_generate_config(spin, configs, num_configs, &value)) 653*a83c29e1SYixun Lan return -EINVAL; 654*a83c29e1SYixun Lan 655*a83c29e1SYixun Lan for (i = 0; i < group->grp.npins; i++) 656*a83c29e1SYixun Lan spacemit_pin_set_config(pctrl, group->grp.pins[i], value); 657*a83c29e1SYixun Lan 658*a83c29e1SYixun Lan return 0; 659*a83c29e1SYixun Lan } 660*a83c29e1SYixun Lan 661*a83c29e1SYixun Lan static void spacemit_pinconf_dbg_pull(struct seq_file *seq, unsigned int value) 662*a83c29e1SYixun Lan { 663*a83c29e1SYixun Lan u32 normal, strong; 664*a83c29e1SYixun Lan 665*a83c29e1SYixun Lan if (!FIELD_GET(PAD_PULL_EN, value)) { 666*a83c29e1SYixun Lan seq_puts(seq, ", bias pull disabled"); 667*a83c29e1SYixun Lan return; 668*a83c29e1SYixun Lan } 669*a83c29e1SYixun Lan 670*a83c29e1SYixun Lan if (FIELD_GET(PAD_PULLDOWN, value)) 671*a83c29e1SYixun Lan seq_puts(seq, ", bias pull down"); 672*a83c29e1SYixun Lan 673*a83c29e1SYixun Lan normal = FIELD_GET(PAD_PULLUP, value); 674*a83c29e1SYixun Lan strong = FIELD_GET(PAD_STRONG_PULL, value); 675*a83c29e1SYixun Lan 676*a83c29e1SYixun Lan if (normal && strong) 677*a83c29e1SYixun Lan seq_puts(seq, ", bias strong pull up"); 678*a83c29e1SYixun Lan else if (normal) 679*a83c29e1SYixun Lan seq_puts(seq, ", bias normal pull up"); 680*a83c29e1SYixun Lan } 681*a83c29e1SYixun Lan 682*a83c29e1SYixun Lan static void spacemit_pinconf_dbg_show(struct pinctrl_dev *pctldev, 683*a83c29e1SYixun Lan struct seq_file *seq, unsigned int pin) 684*a83c29e1SYixun Lan { 685*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); 686*a83c29e1SYixun Lan const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin); 687*a83c29e1SYixun Lan enum spacemit_pin_io_type type = spacemit_to_pin_io_type(spin); 688*a83c29e1SYixun Lan void __iomem *reg = spacemit_pin_to_reg(pctrl, pin); 689*a83c29e1SYixun Lan u32 value, tmp, mA; 690*a83c29e1SYixun Lan 691*a83c29e1SYixun Lan value = readl(reg); 692*a83c29e1SYixun Lan spacemit_pinconf_dbg_pull(seq, value); 693*a83c29e1SYixun Lan 694*a83c29e1SYixun Lan seq_printf(seq, ", io type (%s)", io_type_desc[type]); 695*a83c29e1SYixun Lan 696*a83c29e1SYixun Lan tmp = FIELD_GET(PAD_DRIVE, value); 697*a83c29e1SYixun Lan if (type == IO_TYPE_1V8 || type == IO_TYPE_3V3) { 698*a83c29e1SYixun Lan mA = spacemit_get_drive_strength_mA(type, tmp); 699*a83c29e1SYixun Lan seq_printf(seq, ", drive strength (%d mA)", mA); 700*a83c29e1SYixun Lan } 701*a83c29e1SYixun Lan 702*a83c29e1SYixun Lan /* drive strength depend on power source, so show all values */ 703*a83c29e1SYixun Lan if (type == IO_TYPE_EXTERNAL) 704*a83c29e1SYixun Lan seq_printf(seq, ", drive strength (%d or %d mA)", 705*a83c29e1SYixun Lan spacemit_get_drive_strength_mA(IO_TYPE_1V8, tmp), 706*a83c29e1SYixun Lan spacemit_get_drive_strength_mA(IO_TYPE_3V3, tmp)); 707*a83c29e1SYixun Lan 708*a83c29e1SYixun Lan seq_printf(seq, ", register (0x%04x)\n", value); 709*a83c29e1SYixun Lan } 710*a83c29e1SYixun Lan 711*a83c29e1SYixun Lan static const struct pinconf_ops spacemit_pinconf_ops = { 712*a83c29e1SYixun Lan .pin_config_get = spacemit_pinconf_get, 713*a83c29e1SYixun Lan .pin_config_set = spacemit_pinconf_set, 714*a83c29e1SYixun Lan .pin_config_group_set = spacemit_pinconf_group_set, 715*a83c29e1SYixun Lan .pin_config_dbg_show = spacemit_pinconf_dbg_show, 716*a83c29e1SYixun Lan .is_generic = true, 717*a83c29e1SYixun Lan }; 718*a83c29e1SYixun Lan 719*a83c29e1SYixun Lan static int spacemit_pinctrl_probe(struct platform_device *pdev) 720*a83c29e1SYixun Lan { 721*a83c29e1SYixun Lan struct device *dev = &pdev->dev; 722*a83c29e1SYixun Lan struct spacemit_pinctrl *pctrl; 723*a83c29e1SYixun Lan const struct spacemit_pinctrl_data *pctrl_data; 724*a83c29e1SYixun Lan int ret; 725*a83c29e1SYixun Lan 726*a83c29e1SYixun Lan pctrl_data = device_get_match_data(dev); 727*a83c29e1SYixun Lan if (!pctrl_data) 728*a83c29e1SYixun Lan return -ENODEV; 729*a83c29e1SYixun Lan 730*a83c29e1SYixun Lan if (pctrl_data->npins == 0) 731*a83c29e1SYixun Lan return dev_err_probe(dev, -EINVAL, "invalid pin data\n"); 732*a83c29e1SYixun Lan 733*a83c29e1SYixun Lan pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL); 734*a83c29e1SYixun Lan if (!pctrl) 735*a83c29e1SYixun Lan return -ENOMEM; 736*a83c29e1SYixun Lan 737*a83c29e1SYixun Lan pctrl->regs = devm_platform_ioremap_resource(pdev, 0); 738*a83c29e1SYixun Lan if (IS_ERR(pctrl->regs)) 739*a83c29e1SYixun Lan return PTR_ERR(pctrl->regs); 740*a83c29e1SYixun Lan 741*a83c29e1SYixun Lan pctrl->pdesc.name = dev_name(dev); 742*a83c29e1SYixun Lan pctrl->pdesc.pins = pctrl_data->pins; 743*a83c29e1SYixun Lan pctrl->pdesc.npins = pctrl_data->npins; 744*a83c29e1SYixun Lan pctrl->pdesc.pctlops = &spacemit_pctrl_ops; 745*a83c29e1SYixun Lan pctrl->pdesc.pmxops = &spacemit_pmx_ops; 746*a83c29e1SYixun Lan pctrl->pdesc.confops = &spacemit_pinconf_ops; 747*a83c29e1SYixun Lan pctrl->pdesc.owner = THIS_MODULE; 748*a83c29e1SYixun Lan 749*a83c29e1SYixun Lan pctrl->data = pctrl_data; 750*a83c29e1SYixun Lan pctrl->dev = dev; 751*a83c29e1SYixun Lan raw_spin_lock_init(&pctrl->lock); 752*a83c29e1SYixun Lan mutex_init(&pctrl->mutex); 753*a83c29e1SYixun Lan 754*a83c29e1SYixun Lan platform_set_drvdata(pdev, pctrl); 755*a83c29e1SYixun Lan 756*a83c29e1SYixun Lan ret = devm_pinctrl_register_and_init(dev, &pctrl->pdesc, 757*a83c29e1SYixun Lan pctrl, &pctrl->pctl_dev); 758*a83c29e1SYixun Lan if (ret) 759*a83c29e1SYixun Lan return dev_err_probe(dev, ret, 760*a83c29e1SYixun Lan "fail to register pinctrl driver\n"); 761*a83c29e1SYixun Lan 762*a83c29e1SYixun Lan return pinctrl_enable(pctrl->pctl_dev); 763*a83c29e1SYixun Lan } 764*a83c29e1SYixun Lan 765*a83c29e1SYixun Lan static const struct pinctrl_pin_desc k1_pin_desc[] = { 766*a83c29e1SYixun Lan PINCTRL_PIN(0, "GPIO_00"), 767*a83c29e1SYixun Lan PINCTRL_PIN(1, "GPIO_01"), 768*a83c29e1SYixun Lan PINCTRL_PIN(2, "GPIO_02"), 769*a83c29e1SYixun Lan PINCTRL_PIN(3, "GPIO_03"), 770*a83c29e1SYixun Lan PINCTRL_PIN(4, "GPIO_04"), 771*a83c29e1SYixun Lan PINCTRL_PIN(5, "GPIO_05"), 772*a83c29e1SYixun Lan PINCTRL_PIN(6, "GPIO_06"), 773*a83c29e1SYixun Lan PINCTRL_PIN(7, "GPIO_07"), 774*a83c29e1SYixun Lan PINCTRL_PIN(8, "GPIO_08"), 775*a83c29e1SYixun Lan PINCTRL_PIN(9, "GPIO_09"), 776*a83c29e1SYixun Lan PINCTRL_PIN(10, "GPIO_10"), 777*a83c29e1SYixun Lan PINCTRL_PIN(11, "GPIO_11"), 778*a83c29e1SYixun Lan PINCTRL_PIN(12, "GPIO_12"), 779*a83c29e1SYixun Lan PINCTRL_PIN(13, "GPIO_13"), 780*a83c29e1SYixun Lan PINCTRL_PIN(14, "GPIO_14"), 781*a83c29e1SYixun Lan PINCTRL_PIN(15, "GPIO_15"), 782*a83c29e1SYixun Lan PINCTRL_PIN(16, "GPIO_16"), 783*a83c29e1SYixun Lan PINCTRL_PIN(17, "GPIO_17"), 784*a83c29e1SYixun Lan PINCTRL_PIN(18, "GPIO_18"), 785*a83c29e1SYixun Lan PINCTRL_PIN(19, "GPIO_19"), 786*a83c29e1SYixun Lan PINCTRL_PIN(20, "GPIO_20"), 787*a83c29e1SYixun Lan PINCTRL_PIN(21, "GPIO_21"), 788*a83c29e1SYixun Lan PINCTRL_PIN(22, "GPIO_22"), 789*a83c29e1SYixun Lan PINCTRL_PIN(23, "GPIO_23"), 790*a83c29e1SYixun Lan PINCTRL_PIN(24, "GPIO_24"), 791*a83c29e1SYixun Lan PINCTRL_PIN(25, "GPIO_25"), 792*a83c29e1SYixun Lan PINCTRL_PIN(26, "GPIO_26"), 793*a83c29e1SYixun Lan PINCTRL_PIN(27, "GPIO_27"), 794*a83c29e1SYixun Lan PINCTRL_PIN(28, "GPIO_28"), 795*a83c29e1SYixun Lan PINCTRL_PIN(29, "GPIO_29"), 796*a83c29e1SYixun Lan PINCTRL_PIN(30, "GPIO_30"), 797*a83c29e1SYixun Lan PINCTRL_PIN(31, "GPIO_31"), 798*a83c29e1SYixun Lan PINCTRL_PIN(32, "GPIO_32"), 799*a83c29e1SYixun Lan PINCTRL_PIN(33, "GPIO_33"), 800*a83c29e1SYixun Lan PINCTRL_PIN(34, "GPIO_34"), 801*a83c29e1SYixun Lan PINCTRL_PIN(35, "GPIO_35"), 802*a83c29e1SYixun Lan PINCTRL_PIN(36, "GPIO_36"), 803*a83c29e1SYixun Lan PINCTRL_PIN(37, "GPIO_37"), 804*a83c29e1SYixun Lan PINCTRL_PIN(38, "GPIO_38"), 805*a83c29e1SYixun Lan PINCTRL_PIN(39, "GPIO_39"), 806*a83c29e1SYixun Lan PINCTRL_PIN(40, "GPIO_40"), 807*a83c29e1SYixun Lan PINCTRL_PIN(41, "GPIO_41"), 808*a83c29e1SYixun Lan PINCTRL_PIN(42, "GPIO_42"), 809*a83c29e1SYixun Lan PINCTRL_PIN(43, "GPIO_43"), 810*a83c29e1SYixun Lan PINCTRL_PIN(44, "GPIO_44"), 811*a83c29e1SYixun Lan PINCTRL_PIN(45, "GPIO_45"), 812*a83c29e1SYixun Lan PINCTRL_PIN(46, "GPIO_46"), 813*a83c29e1SYixun Lan PINCTRL_PIN(47, "GPIO_47"), 814*a83c29e1SYixun Lan PINCTRL_PIN(48, "GPIO_48"), 815*a83c29e1SYixun Lan PINCTRL_PIN(49, "GPIO_49"), 816*a83c29e1SYixun Lan PINCTRL_PIN(50, "GPIO_50"), 817*a83c29e1SYixun Lan PINCTRL_PIN(51, "GPIO_51"), 818*a83c29e1SYixun Lan PINCTRL_PIN(52, "GPIO_52"), 819*a83c29e1SYixun Lan PINCTRL_PIN(53, "GPIO_53"), 820*a83c29e1SYixun Lan PINCTRL_PIN(54, "GPIO_54"), 821*a83c29e1SYixun Lan PINCTRL_PIN(55, "GPIO_55"), 822*a83c29e1SYixun Lan PINCTRL_PIN(56, "GPIO_56"), 823*a83c29e1SYixun Lan PINCTRL_PIN(57, "GPIO_57"), 824*a83c29e1SYixun Lan PINCTRL_PIN(58, "GPIO_58"), 825*a83c29e1SYixun Lan PINCTRL_PIN(59, "GPIO_59"), 826*a83c29e1SYixun Lan PINCTRL_PIN(60, "GPIO_60"), 827*a83c29e1SYixun Lan PINCTRL_PIN(61, "GPIO_61"), 828*a83c29e1SYixun Lan PINCTRL_PIN(62, "GPIO_62"), 829*a83c29e1SYixun Lan PINCTRL_PIN(63, "GPIO_63"), 830*a83c29e1SYixun Lan PINCTRL_PIN(64, "GPIO_64"), 831*a83c29e1SYixun Lan PINCTRL_PIN(65, "GPIO_65"), 832*a83c29e1SYixun Lan PINCTRL_PIN(66, "GPIO_66"), 833*a83c29e1SYixun Lan PINCTRL_PIN(67, "GPIO_67"), 834*a83c29e1SYixun Lan PINCTRL_PIN(68, "GPIO_68"), 835*a83c29e1SYixun Lan PINCTRL_PIN(69, "GPIO_69"), 836*a83c29e1SYixun Lan PINCTRL_PIN(70, "GPIO_70/PRI_DTI"), 837*a83c29e1SYixun Lan PINCTRL_PIN(71, "GPIO_71/PRI_TMS"), 838*a83c29e1SYixun Lan PINCTRL_PIN(72, "GPIO_72/PRI_TCK"), 839*a83c29e1SYixun Lan PINCTRL_PIN(73, "GPIO_73/PRI_TDO"), 840*a83c29e1SYixun Lan PINCTRL_PIN(74, "GPIO_74"), 841*a83c29e1SYixun Lan PINCTRL_PIN(75, "GPIO_75"), 842*a83c29e1SYixun Lan PINCTRL_PIN(76, "GPIO_76"), 843*a83c29e1SYixun Lan PINCTRL_PIN(77, "GPIO_77"), 844*a83c29e1SYixun Lan PINCTRL_PIN(78, "GPIO_78"), 845*a83c29e1SYixun Lan PINCTRL_PIN(79, "GPIO_79"), 846*a83c29e1SYixun Lan PINCTRL_PIN(80, "GPIO_80"), 847*a83c29e1SYixun Lan PINCTRL_PIN(81, "GPIO_81"), 848*a83c29e1SYixun Lan PINCTRL_PIN(82, "GPIO_82"), 849*a83c29e1SYixun Lan PINCTRL_PIN(83, "GPIO_83"), 850*a83c29e1SYixun Lan PINCTRL_PIN(84, "GPIO_84"), 851*a83c29e1SYixun Lan PINCTRL_PIN(85, "GPIO_85"), 852*a83c29e1SYixun Lan PINCTRL_PIN(86, "GPIO_86"), 853*a83c29e1SYixun Lan PINCTRL_PIN(87, "GPIO_87"), 854*a83c29e1SYixun Lan PINCTRL_PIN(88, "GPIO_88"), 855*a83c29e1SYixun Lan PINCTRL_PIN(89, "GPIO_89"), 856*a83c29e1SYixun Lan PINCTRL_PIN(90, "GPIO_90"), 857*a83c29e1SYixun Lan PINCTRL_PIN(91, "GPIO_91"), 858*a83c29e1SYixun Lan PINCTRL_PIN(92, "GPIO_92"), 859*a83c29e1SYixun Lan PINCTRL_PIN(93, "GPIO_93/PWR_SCL"), 860*a83c29e1SYixun Lan PINCTRL_PIN(94, "GPIO_94/PWR_SDA"), 861*a83c29e1SYixun Lan PINCTRL_PIN(95, "GPIO_95/VCX0_EN"), 862*a83c29e1SYixun Lan PINCTRL_PIN(96, "GPIO_96/DVL0"), 863*a83c29e1SYixun Lan PINCTRL_PIN(97, "GPIO_97/DVL1"), 864*a83c29e1SYixun Lan PINCTRL_PIN(98, "GPIO_98/QSPI_DAT3"), 865*a83c29e1SYixun Lan PINCTRL_PIN(99, "GPIO_99/QSPI_DAT2"), 866*a83c29e1SYixun Lan PINCTRL_PIN(100, "GPIO_100/QSPI_DAT1"), 867*a83c29e1SYixun Lan PINCTRL_PIN(101, "GPIO_101/QSPI_DAT0"), 868*a83c29e1SYixun Lan PINCTRL_PIN(102, "GPIO_102/QSPI_CLK"), 869*a83c29e1SYixun Lan PINCTRL_PIN(103, "GPIO_103/QSPI_CS1"), 870*a83c29e1SYixun Lan PINCTRL_PIN(104, "GPIO_104/MMC1_DAT3"), 871*a83c29e1SYixun Lan PINCTRL_PIN(105, "GPIO_105/MMC1_DAT2"), 872*a83c29e1SYixun Lan PINCTRL_PIN(106, "GPIO_106/MMC1_DAT1"), 873*a83c29e1SYixun Lan PINCTRL_PIN(107, "GPIO_107/MMC1_DAT0"), 874*a83c29e1SYixun Lan PINCTRL_PIN(108, "GPIO_108/MMC1_CMD"), 875*a83c29e1SYixun Lan PINCTRL_PIN(109, "GPIO_109/MMC1_CLK"), 876*a83c29e1SYixun Lan PINCTRL_PIN(110, "GPIO_110"), 877*a83c29e1SYixun Lan PINCTRL_PIN(111, "GPIO_111"), 878*a83c29e1SYixun Lan PINCTRL_PIN(112, "GPIO_112"), 879*a83c29e1SYixun Lan PINCTRL_PIN(113, "GPIO_113"), 880*a83c29e1SYixun Lan PINCTRL_PIN(114, "GPIO_114"), 881*a83c29e1SYixun Lan PINCTRL_PIN(115, "GPIO_115"), 882*a83c29e1SYixun Lan PINCTRL_PIN(116, "GPIO_116"), 883*a83c29e1SYixun Lan PINCTRL_PIN(117, "GPIO_117"), 884*a83c29e1SYixun Lan PINCTRL_PIN(118, "GPIO_118"), 885*a83c29e1SYixun Lan PINCTRL_PIN(119, "GPIO_119"), 886*a83c29e1SYixun Lan PINCTRL_PIN(120, "GPIO_120"), 887*a83c29e1SYixun Lan PINCTRL_PIN(121, "GPIO_121"), 888*a83c29e1SYixun Lan PINCTRL_PIN(122, "GPIO_122"), 889*a83c29e1SYixun Lan PINCTRL_PIN(123, "GPIO_123"), 890*a83c29e1SYixun Lan PINCTRL_PIN(124, "GPIO_124"), 891*a83c29e1SYixun Lan PINCTRL_PIN(125, "GPIO_125"), 892*a83c29e1SYixun Lan PINCTRL_PIN(126, "GPIO_126"), 893*a83c29e1SYixun Lan PINCTRL_PIN(127, "GPIO_127"), 894*a83c29e1SYixun Lan }; 895*a83c29e1SYixun Lan 896*a83c29e1SYixun Lan static const struct spacemit_pin k1_pin_data[ARRAY_SIZE(k1_pin_desc)] = { 897*a83c29e1SYixun Lan K1_FUNC_PIN(0, 0, IO_TYPE_1V8), 898*a83c29e1SYixun Lan K1_FUNC_PIN(1, 0, IO_TYPE_1V8), 899*a83c29e1SYixun Lan K1_FUNC_PIN(2, 0, IO_TYPE_1V8), 900*a83c29e1SYixun Lan K1_FUNC_PIN(3, 0, IO_TYPE_1V8), 901*a83c29e1SYixun Lan K1_FUNC_PIN(4, 0, IO_TYPE_1V8), 902*a83c29e1SYixun Lan K1_FUNC_PIN(5, 0, IO_TYPE_1V8), 903*a83c29e1SYixun Lan K1_FUNC_PIN(6, 0, IO_TYPE_1V8), 904*a83c29e1SYixun Lan K1_FUNC_PIN(7, 0, IO_TYPE_1V8), 905*a83c29e1SYixun Lan K1_FUNC_PIN(8, 0, IO_TYPE_1V8), 906*a83c29e1SYixun Lan K1_FUNC_PIN(9, 0, IO_TYPE_1V8), 907*a83c29e1SYixun Lan K1_FUNC_PIN(10, 0, IO_TYPE_1V8), 908*a83c29e1SYixun Lan K1_FUNC_PIN(11, 0, IO_TYPE_1V8), 909*a83c29e1SYixun Lan K1_FUNC_PIN(12, 0, IO_TYPE_1V8), 910*a83c29e1SYixun Lan K1_FUNC_PIN(13, 0, IO_TYPE_1V8), 911*a83c29e1SYixun Lan K1_FUNC_PIN(14, 0, IO_TYPE_1V8), 912*a83c29e1SYixun Lan K1_FUNC_PIN(15, 0, IO_TYPE_1V8), 913*a83c29e1SYixun Lan K1_FUNC_PIN(16, 0, IO_TYPE_1V8), 914*a83c29e1SYixun Lan K1_FUNC_PIN(17, 0, IO_TYPE_1V8), 915*a83c29e1SYixun Lan K1_FUNC_PIN(18, 0, IO_TYPE_1V8), 916*a83c29e1SYixun Lan K1_FUNC_PIN(19, 0, IO_TYPE_1V8), 917*a83c29e1SYixun Lan K1_FUNC_PIN(20, 0, IO_TYPE_1V8), 918*a83c29e1SYixun Lan K1_FUNC_PIN(21, 0, IO_TYPE_1V8), 919*a83c29e1SYixun Lan K1_FUNC_PIN(22, 0, IO_TYPE_1V8), 920*a83c29e1SYixun Lan K1_FUNC_PIN(23, 0, IO_TYPE_1V8), 921*a83c29e1SYixun Lan K1_FUNC_PIN(24, 0, IO_TYPE_1V8), 922*a83c29e1SYixun Lan K1_FUNC_PIN(25, 0, IO_TYPE_1V8), 923*a83c29e1SYixun Lan K1_FUNC_PIN(26, 0, IO_TYPE_1V8), 924*a83c29e1SYixun Lan K1_FUNC_PIN(27, 0, IO_TYPE_1V8), 925*a83c29e1SYixun Lan K1_FUNC_PIN(28, 0, IO_TYPE_1V8), 926*a83c29e1SYixun Lan K1_FUNC_PIN(29, 0, IO_TYPE_1V8), 927*a83c29e1SYixun Lan K1_FUNC_PIN(30, 0, IO_TYPE_1V8), 928*a83c29e1SYixun Lan K1_FUNC_PIN(31, 0, IO_TYPE_1V8), 929*a83c29e1SYixun Lan K1_FUNC_PIN(32, 0, IO_TYPE_1V8), 930*a83c29e1SYixun Lan K1_FUNC_PIN(33, 0, IO_TYPE_1V8), 931*a83c29e1SYixun Lan K1_FUNC_PIN(34, 0, IO_TYPE_1V8), 932*a83c29e1SYixun Lan K1_FUNC_PIN(35, 0, IO_TYPE_1V8), 933*a83c29e1SYixun Lan K1_FUNC_PIN(36, 0, IO_TYPE_1V8), 934*a83c29e1SYixun Lan K1_FUNC_PIN(37, 0, IO_TYPE_1V8), 935*a83c29e1SYixun Lan K1_FUNC_PIN(38, 0, IO_TYPE_1V8), 936*a83c29e1SYixun Lan K1_FUNC_PIN(39, 0, IO_TYPE_1V8), 937*a83c29e1SYixun Lan K1_FUNC_PIN(40, 0, IO_TYPE_1V8), 938*a83c29e1SYixun Lan K1_FUNC_PIN(41, 0, IO_TYPE_1V8), 939*a83c29e1SYixun Lan K1_FUNC_PIN(42, 0, IO_TYPE_1V8), 940*a83c29e1SYixun Lan K1_FUNC_PIN(43, 0, IO_TYPE_1V8), 941*a83c29e1SYixun Lan K1_FUNC_PIN(44, 0, IO_TYPE_1V8), 942*a83c29e1SYixun Lan K1_FUNC_PIN(45, 0, IO_TYPE_1V8), 943*a83c29e1SYixun Lan K1_FUNC_PIN(46, 0, IO_TYPE_1V8), 944*a83c29e1SYixun Lan K1_FUNC_PIN(47, 0, IO_TYPE_EXTERNAL), 945*a83c29e1SYixun Lan K1_FUNC_PIN(48, 0, IO_TYPE_EXTERNAL), 946*a83c29e1SYixun Lan K1_FUNC_PIN(49, 0, IO_TYPE_EXTERNAL), 947*a83c29e1SYixun Lan K1_FUNC_PIN(50, 0, IO_TYPE_EXTERNAL), 948*a83c29e1SYixun Lan K1_FUNC_PIN(51, 0, IO_TYPE_EXTERNAL), 949*a83c29e1SYixun Lan K1_FUNC_PIN(52, 0, IO_TYPE_EXTERNAL), 950*a83c29e1SYixun Lan K1_FUNC_PIN(53, 0, IO_TYPE_1V8), 951*a83c29e1SYixun Lan K1_FUNC_PIN(54, 0, IO_TYPE_1V8), 952*a83c29e1SYixun Lan K1_FUNC_PIN(55, 0, IO_TYPE_1V8), 953*a83c29e1SYixun Lan K1_FUNC_PIN(56, 0, IO_TYPE_1V8), 954*a83c29e1SYixun Lan K1_FUNC_PIN(57, 0, IO_TYPE_1V8), 955*a83c29e1SYixun Lan K1_FUNC_PIN(58, 0, IO_TYPE_1V8), 956*a83c29e1SYixun Lan K1_FUNC_PIN(59, 0, IO_TYPE_1V8), 957*a83c29e1SYixun Lan K1_FUNC_PIN(60, 0, IO_TYPE_1V8), 958*a83c29e1SYixun Lan K1_FUNC_PIN(61, 0, IO_TYPE_1V8), 959*a83c29e1SYixun Lan K1_FUNC_PIN(62, 0, IO_TYPE_1V8), 960*a83c29e1SYixun Lan K1_FUNC_PIN(63, 0, IO_TYPE_1V8), 961*a83c29e1SYixun Lan K1_FUNC_PIN(64, 0, IO_TYPE_1V8), 962*a83c29e1SYixun Lan K1_FUNC_PIN(65, 0, IO_TYPE_1V8), 963*a83c29e1SYixun Lan K1_FUNC_PIN(66, 0, IO_TYPE_1V8), 964*a83c29e1SYixun Lan K1_FUNC_PIN(67, 0, IO_TYPE_1V8), 965*a83c29e1SYixun Lan K1_FUNC_PIN(68, 0, IO_TYPE_1V8), 966*a83c29e1SYixun Lan K1_FUNC_PIN(69, 0, IO_TYPE_1V8), 967*a83c29e1SYixun Lan K1_FUNC_PIN(70, 1, IO_TYPE_1V8), 968*a83c29e1SYixun Lan K1_FUNC_PIN(71, 1, IO_TYPE_1V8), 969*a83c29e1SYixun Lan K1_FUNC_PIN(72, 1, IO_TYPE_1V8), 970*a83c29e1SYixun Lan K1_FUNC_PIN(73, 1, IO_TYPE_1V8), 971*a83c29e1SYixun Lan K1_FUNC_PIN(74, 0, IO_TYPE_1V8), 972*a83c29e1SYixun Lan K1_FUNC_PIN(75, 0, IO_TYPE_EXTERNAL), 973*a83c29e1SYixun Lan K1_FUNC_PIN(76, 0, IO_TYPE_EXTERNAL), 974*a83c29e1SYixun Lan K1_FUNC_PIN(77, 0, IO_TYPE_EXTERNAL), 975*a83c29e1SYixun Lan K1_FUNC_PIN(78, 0, IO_TYPE_EXTERNAL), 976*a83c29e1SYixun Lan K1_FUNC_PIN(79, 0, IO_TYPE_EXTERNAL), 977*a83c29e1SYixun Lan K1_FUNC_PIN(80, 0, IO_TYPE_EXTERNAL), 978*a83c29e1SYixun Lan K1_FUNC_PIN(81, 0, IO_TYPE_1V8), 979*a83c29e1SYixun Lan K1_FUNC_PIN(82, 0, IO_TYPE_1V8), 980*a83c29e1SYixun Lan K1_FUNC_PIN(83, 0, IO_TYPE_1V8), 981*a83c29e1SYixun Lan K1_FUNC_PIN(84, 0, IO_TYPE_1V8), 982*a83c29e1SYixun Lan K1_FUNC_PIN(85, 0, IO_TYPE_1V8), 983*a83c29e1SYixun Lan K1_FUNC_PIN(86, 0, IO_TYPE_1V8), 984*a83c29e1SYixun Lan K1_FUNC_PIN(87, 0, IO_TYPE_1V8), 985*a83c29e1SYixun Lan K1_FUNC_PIN(88, 0, IO_TYPE_1V8), 986*a83c29e1SYixun Lan K1_FUNC_PIN(89, 0, IO_TYPE_1V8), 987*a83c29e1SYixun Lan K1_FUNC_PIN(90, 0, IO_TYPE_1V8), 988*a83c29e1SYixun Lan K1_FUNC_PIN(91, 0, IO_TYPE_1V8), 989*a83c29e1SYixun Lan K1_FUNC_PIN(92, 0, IO_TYPE_1V8), 990*a83c29e1SYixun Lan K1_FUNC_PIN(93, 1, IO_TYPE_1V8), 991*a83c29e1SYixun Lan K1_FUNC_PIN(94, 1, IO_TYPE_1V8), 992*a83c29e1SYixun Lan K1_FUNC_PIN(95, 1, IO_TYPE_1V8), 993*a83c29e1SYixun Lan K1_FUNC_PIN(96, 1, IO_TYPE_1V8), 994*a83c29e1SYixun Lan K1_FUNC_PIN(97, 1, IO_TYPE_1V8), 995*a83c29e1SYixun Lan K1_FUNC_PIN(98, 1, IO_TYPE_EXTERNAL), 996*a83c29e1SYixun Lan K1_FUNC_PIN(99, 1, IO_TYPE_EXTERNAL), 997*a83c29e1SYixun Lan K1_FUNC_PIN(100, 1, IO_TYPE_EXTERNAL), 998*a83c29e1SYixun Lan K1_FUNC_PIN(101, 1, IO_TYPE_EXTERNAL), 999*a83c29e1SYixun Lan K1_FUNC_PIN(102, 1, IO_TYPE_EXTERNAL), 1000*a83c29e1SYixun Lan K1_FUNC_PIN(103, 1, IO_TYPE_EXTERNAL), 1001*a83c29e1SYixun Lan K1_FUNC_PIN(104, 4, IO_TYPE_EXTERNAL), 1002*a83c29e1SYixun Lan K1_FUNC_PIN(105, 4, IO_TYPE_EXTERNAL), 1003*a83c29e1SYixun Lan K1_FUNC_PIN(106, 4, IO_TYPE_EXTERNAL), 1004*a83c29e1SYixun Lan K1_FUNC_PIN(107, 4, IO_TYPE_EXTERNAL), 1005*a83c29e1SYixun Lan K1_FUNC_PIN(108, 4, IO_TYPE_EXTERNAL), 1006*a83c29e1SYixun Lan K1_FUNC_PIN(109, 4, IO_TYPE_EXTERNAL), 1007*a83c29e1SYixun Lan K1_FUNC_PIN(110, 0, IO_TYPE_1V8), 1008*a83c29e1SYixun Lan K1_FUNC_PIN(111, 0, IO_TYPE_1V8), 1009*a83c29e1SYixun Lan K1_FUNC_PIN(112, 0, IO_TYPE_1V8), 1010*a83c29e1SYixun Lan K1_FUNC_PIN(113, 0, IO_TYPE_1V8), 1011*a83c29e1SYixun Lan K1_FUNC_PIN(114, 0, IO_TYPE_1V8), 1012*a83c29e1SYixun Lan K1_FUNC_PIN(115, 0, IO_TYPE_1V8), 1013*a83c29e1SYixun Lan K1_FUNC_PIN(116, 0, IO_TYPE_1V8), 1014*a83c29e1SYixun Lan K1_FUNC_PIN(117, 0, IO_TYPE_1V8), 1015*a83c29e1SYixun Lan K1_FUNC_PIN(118, 0, IO_TYPE_1V8), 1016*a83c29e1SYixun Lan K1_FUNC_PIN(119, 0, IO_TYPE_1V8), 1017*a83c29e1SYixun Lan K1_FUNC_PIN(120, 0, IO_TYPE_1V8), 1018*a83c29e1SYixun Lan K1_FUNC_PIN(121, 0, IO_TYPE_1V8), 1019*a83c29e1SYixun Lan K1_FUNC_PIN(122, 0, IO_TYPE_1V8), 1020*a83c29e1SYixun Lan K1_FUNC_PIN(123, 0, IO_TYPE_1V8), 1021*a83c29e1SYixun Lan K1_FUNC_PIN(124, 0, IO_TYPE_1V8), 1022*a83c29e1SYixun Lan K1_FUNC_PIN(125, 0, IO_TYPE_1V8), 1023*a83c29e1SYixun Lan K1_FUNC_PIN(126, 0, IO_TYPE_1V8), 1024*a83c29e1SYixun Lan K1_FUNC_PIN(127, 0, IO_TYPE_1V8), 1025*a83c29e1SYixun Lan }; 1026*a83c29e1SYixun Lan 1027*a83c29e1SYixun Lan static const struct spacemit_pinctrl_data k1_pinctrl_data = { 1028*a83c29e1SYixun Lan .pins = k1_pin_desc, 1029*a83c29e1SYixun Lan .data = k1_pin_data, 1030*a83c29e1SYixun Lan .npins = ARRAY_SIZE(k1_pin_desc), 1031*a83c29e1SYixun Lan }; 1032*a83c29e1SYixun Lan 1033*a83c29e1SYixun Lan static const struct of_device_id k1_pinctrl_ids[] = { 1034*a83c29e1SYixun Lan { .compatible = "spacemit,k1-pinctrl", .data = &k1_pinctrl_data }, 1035*a83c29e1SYixun Lan { /* sentinel */ } 1036*a83c29e1SYixun Lan }; 1037*a83c29e1SYixun Lan MODULE_DEVICE_TABLE(of, k1_pinctrl_ids); 1038*a83c29e1SYixun Lan 1039*a83c29e1SYixun Lan static struct platform_driver k1_pinctrl_driver = { 1040*a83c29e1SYixun Lan .probe = spacemit_pinctrl_probe, 1041*a83c29e1SYixun Lan .driver = { 1042*a83c29e1SYixun Lan .name = "k1-pinctrl", 1043*a83c29e1SYixun Lan .suppress_bind_attrs = true, 1044*a83c29e1SYixun Lan .of_match_table = k1_pinctrl_ids, 1045*a83c29e1SYixun Lan }, 1046*a83c29e1SYixun Lan }; 1047*a83c29e1SYixun Lan module_platform_driver(k1_pinctrl_driver); 1048*a83c29e1SYixun Lan 1049*a83c29e1SYixun Lan MODULE_AUTHOR("Yixun Lan <dlan@gentoo.org>"); 1050*a83c29e1SYixun Lan MODULE_DESCRIPTION("Pinctrl driver for the SpacemiT K1 SoC"); 1051*a83c29e1SYixun Lan MODULE_LICENSE("GPL"); 1052