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