pinctrl-sprd.c (27163B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Spreadtrum pin controller driver 4 * Copyright (C) 2017 Spreadtrum - http://www.spreadtrum.com 5 */ 6 7#include <linux/debugfs.h> 8#include <linux/err.h> 9#include <linux/init.h> 10#include <linux/io.h> 11#include <linux/kernel.h> 12#include <linux/module.h> 13#include <linux/of.h> 14#include <linux/of_device.h> 15#include <linux/platform_device.h> 16#include <linux/pinctrl/machine.h> 17#include <linux/pinctrl/pinconf.h> 18#include <linux/pinctrl/pinconf-generic.h> 19#include <linux/pinctrl/pinctrl.h> 20#include <linux/pinctrl/pinmux.h> 21#include <linux/slab.h> 22 23#include "../core.h" 24#include "../pinmux.h" 25#include "../pinconf.h" 26#include "../pinctrl-utils.h" 27#include "pinctrl-sprd.h" 28 29#define PINCTRL_BIT_MASK(width) (~(~0UL << (width))) 30#define PINCTRL_REG_OFFSET 0x20 31#define PINCTRL_REG_MISC_OFFSET 0x4020 32#define PINCTRL_REG_LEN 0x4 33 34#define PIN_FUNC_MASK (BIT(4) | BIT(5)) 35#define PIN_FUNC_SEL_1 ~PIN_FUNC_MASK 36#define PIN_FUNC_SEL_2 BIT(4) 37#define PIN_FUNC_SEL_3 BIT(5) 38#define PIN_FUNC_SEL_4 PIN_FUNC_MASK 39 40#define AP_SLEEP_MODE BIT(13) 41#define PUBCP_SLEEP_MODE BIT(14) 42#define TGLDSP_SLEEP_MODE BIT(15) 43#define AGDSP_SLEEP_MODE BIT(16) 44#define CM4_SLEEP_MODE BIT(17) 45#define SLEEP_MODE_MASK GENMASK(5, 0) 46#define SLEEP_MODE_SHIFT 13 47 48#define SLEEP_INPUT BIT(1) 49#define SLEEP_INPUT_MASK 0x1 50#define SLEEP_INPUT_SHIFT 1 51 52#define SLEEP_OUTPUT BIT(0) 53#define SLEEP_OUTPUT_MASK 0x1 54#define SLEEP_OUTPUT_SHIFT 0 55 56#define DRIVE_STRENGTH_MASK GENMASK(3, 0) 57#define DRIVE_STRENGTH_SHIFT 19 58 59#define SLEEP_PULL_DOWN BIT(2) 60#define SLEEP_PULL_DOWN_MASK 0x1 61#define SLEEP_PULL_DOWN_SHIFT 2 62 63#define PULL_DOWN BIT(6) 64#define PULL_DOWN_MASK 0x1 65#define PULL_DOWN_SHIFT 6 66 67#define SLEEP_PULL_UP BIT(3) 68#define SLEEP_PULL_UP_MASK 0x1 69#define SLEEP_PULL_UP_SHIFT 3 70 71#define PULL_UP_4_7K (BIT(12) | BIT(7)) 72#define PULL_UP_20K BIT(7) 73#define PULL_UP_MASK 0x21 74#define PULL_UP_SHIFT 7 75 76#define INPUT_SCHMITT BIT(11) 77#define INPUT_SCHMITT_MASK 0x1 78#define INPUT_SCHMITT_SHIFT 11 79 80enum pin_sleep_mode { 81 AP_SLEEP = BIT(0), 82 PUBCP_SLEEP = BIT(1), 83 TGLDSP_SLEEP = BIT(2), 84 AGDSP_SLEEP = BIT(3), 85 CM4_SLEEP = BIT(4), 86}; 87 88enum pin_func_sel { 89 PIN_FUNC_1, 90 PIN_FUNC_2, 91 PIN_FUNC_3, 92 PIN_FUNC_4, 93 PIN_FUNC_MAX, 94}; 95 96/** 97 * struct sprd_pin: represent one pin's description 98 * @name: pin name 99 * @number: pin number 100 * @type: pin type, can be GLOBAL_CTRL_PIN/COMMON_PIN/MISC_PIN 101 * @reg: pin register address 102 * @bit_offset: bit offset in pin register 103 * @bit_width: bit width in pin register 104 */ 105struct sprd_pin { 106 const char *name; 107 unsigned int number; 108 enum pin_type type; 109 unsigned long reg; 110 unsigned long bit_offset; 111 unsigned long bit_width; 112}; 113 114/** 115 * struct sprd_pin_group: represent one group's description 116 * @name: group name 117 * @npins: pin numbers of this group 118 * @pins: pointer to pins array 119 */ 120struct sprd_pin_group { 121 const char *name; 122 unsigned int npins; 123 unsigned int *pins; 124}; 125 126/** 127 * struct sprd_pinctrl_soc_info: represent the SoC's pins description 128 * @groups: pointer to groups of pins 129 * @ngroups: group numbers of the whole SoC 130 * @pins: pointer to pins description 131 * @npins: pin numbers of the whole SoC 132 * @grp_names: pointer to group names array 133 */ 134struct sprd_pinctrl_soc_info { 135 struct sprd_pin_group *groups; 136 unsigned int ngroups; 137 struct sprd_pin *pins; 138 unsigned int npins; 139 const char **grp_names; 140}; 141 142/** 143 * struct sprd_pinctrl: represent the pin controller device 144 * @dev: pointer to the device structure 145 * @pctl: pointer to the pinctrl handle 146 * @base: base address of the controller 147 * @info: pointer to SoC's pins description information 148 */ 149struct sprd_pinctrl { 150 struct device *dev; 151 struct pinctrl_dev *pctl; 152 void __iomem *base; 153 struct sprd_pinctrl_soc_info *info; 154}; 155 156#define SPRD_PIN_CONFIG_CONTROL (PIN_CONFIG_END + 1) 157#define SPRD_PIN_CONFIG_SLEEP_MODE (PIN_CONFIG_END + 2) 158 159static int sprd_pinctrl_get_id_by_name(struct sprd_pinctrl *sprd_pctl, 160 const char *name) 161{ 162 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; 163 int i; 164 165 for (i = 0; i < info->npins; i++) { 166 if (!strcmp(info->pins[i].name, name)) 167 return info->pins[i].number; 168 } 169 170 return -ENODEV; 171} 172 173static struct sprd_pin * 174sprd_pinctrl_get_pin_by_id(struct sprd_pinctrl *sprd_pctl, unsigned int id) 175{ 176 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; 177 struct sprd_pin *pin = NULL; 178 int i; 179 180 for (i = 0; i < info->npins; i++) { 181 if (info->pins[i].number == id) { 182 pin = &info->pins[i]; 183 break; 184 } 185 } 186 187 return pin; 188} 189 190static const struct sprd_pin_group * 191sprd_pinctrl_find_group_by_name(struct sprd_pinctrl *sprd_pctl, 192 const char *name) 193{ 194 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; 195 const struct sprd_pin_group *grp = NULL; 196 int i; 197 198 for (i = 0; i < info->ngroups; i++) { 199 if (!strcmp(info->groups[i].name, name)) { 200 grp = &info->groups[i]; 201 break; 202 } 203 } 204 205 return grp; 206} 207 208static int sprd_pctrl_group_count(struct pinctrl_dev *pctldev) 209{ 210 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 211 struct sprd_pinctrl_soc_info *info = pctl->info; 212 213 return info->ngroups; 214} 215 216static const char *sprd_pctrl_group_name(struct pinctrl_dev *pctldev, 217 unsigned int selector) 218{ 219 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 220 struct sprd_pinctrl_soc_info *info = pctl->info; 221 222 return info->groups[selector].name; 223} 224 225static int sprd_pctrl_group_pins(struct pinctrl_dev *pctldev, 226 unsigned int selector, 227 const unsigned int **pins, 228 unsigned int *npins) 229{ 230 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 231 struct sprd_pinctrl_soc_info *info = pctl->info; 232 233 if (selector >= info->ngroups) 234 return -EINVAL; 235 236 *pins = info->groups[selector].pins; 237 *npins = info->groups[selector].npins; 238 239 return 0; 240} 241 242static int sprd_dt_node_to_map(struct pinctrl_dev *pctldev, 243 struct device_node *np, 244 struct pinctrl_map **map, 245 unsigned int *num_maps) 246{ 247 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 248 const struct sprd_pin_group *grp; 249 unsigned long *configs = NULL; 250 unsigned int num_configs = 0; 251 unsigned int reserved_maps = 0; 252 unsigned int reserve = 0; 253 const char *function; 254 enum pinctrl_map_type type; 255 int ret; 256 257 grp = sprd_pinctrl_find_group_by_name(pctl, np->name); 258 if (!grp) { 259 dev_err(pctl->dev, "unable to find group for node %s\n", 260 of_node_full_name(np)); 261 return -EINVAL; 262 } 263 264 ret = of_property_count_strings(np, "pins"); 265 if (ret < 0) 266 return ret; 267 268 if (ret == 1) 269 type = PIN_MAP_TYPE_CONFIGS_PIN; 270 else 271 type = PIN_MAP_TYPE_CONFIGS_GROUP; 272 273 ret = of_property_read_string(np, "function", &function); 274 if (ret < 0) { 275 if (ret != -EINVAL) 276 dev_err(pctl->dev, 277 "%s: could not parse property function\n", 278 of_node_full_name(np)); 279 function = NULL; 280 } 281 282 ret = pinconf_generic_parse_dt_config(np, pctldev, &configs, 283 &num_configs); 284 if (ret < 0) { 285 dev_err(pctl->dev, "%s: could not parse node property\n", 286 of_node_full_name(np)); 287 return ret; 288 } 289 290 *map = NULL; 291 *num_maps = 0; 292 293 if (function != NULL) 294 reserve++; 295 if (num_configs) 296 reserve++; 297 298 ret = pinctrl_utils_reserve_map(pctldev, map, &reserved_maps, 299 num_maps, reserve); 300 if (ret < 0) 301 goto out; 302 303 if (function) { 304 ret = pinctrl_utils_add_map_mux(pctldev, map, 305 &reserved_maps, num_maps, 306 grp->name, function); 307 if (ret < 0) 308 goto out; 309 } 310 311 if (num_configs) { 312 const char *group_or_pin; 313 unsigned int pin_id; 314 315 if (type == PIN_MAP_TYPE_CONFIGS_PIN) { 316 pin_id = grp->pins[0]; 317 group_or_pin = pin_get_name(pctldev, pin_id); 318 } else { 319 group_or_pin = grp->name; 320 } 321 322 ret = pinctrl_utils_add_map_configs(pctldev, map, 323 &reserved_maps, num_maps, 324 group_or_pin, configs, 325 num_configs, type); 326 } 327 328out: 329 kfree(configs); 330 return ret; 331} 332 333static void sprd_pctrl_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, 334 unsigned int offset) 335{ 336 seq_printf(s, "%s", dev_name(pctldev->dev)); 337} 338 339static const struct pinctrl_ops sprd_pctrl_ops = { 340 .get_groups_count = sprd_pctrl_group_count, 341 .get_group_name = sprd_pctrl_group_name, 342 .get_group_pins = sprd_pctrl_group_pins, 343 .pin_dbg_show = sprd_pctrl_dbg_show, 344 .dt_node_to_map = sprd_dt_node_to_map, 345 .dt_free_map = pinctrl_utils_free_map, 346}; 347 348static int sprd_pmx_get_function_count(struct pinctrl_dev *pctldev) 349{ 350 return PIN_FUNC_MAX; 351} 352 353static const char *sprd_pmx_get_function_name(struct pinctrl_dev *pctldev, 354 unsigned int selector) 355{ 356 switch (selector) { 357 case PIN_FUNC_1: 358 return "func1"; 359 case PIN_FUNC_2: 360 return "func2"; 361 case PIN_FUNC_3: 362 return "func3"; 363 case PIN_FUNC_4: 364 return "func4"; 365 default: 366 return "null"; 367 } 368} 369 370static int sprd_pmx_get_function_groups(struct pinctrl_dev *pctldev, 371 unsigned int selector, 372 const char * const **groups, 373 unsigned int * const num_groups) 374{ 375 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 376 struct sprd_pinctrl_soc_info *info = pctl->info; 377 378 *groups = info->grp_names; 379 *num_groups = info->ngroups; 380 381 return 0; 382} 383 384static int sprd_pmx_set_mux(struct pinctrl_dev *pctldev, 385 unsigned int func_selector, 386 unsigned int group_selector) 387{ 388 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 389 struct sprd_pinctrl_soc_info *info = pctl->info; 390 struct sprd_pin_group *grp = &info->groups[group_selector]; 391 unsigned int i, grp_pins = grp->npins; 392 unsigned long reg; 393 unsigned int val = 0; 394 395 if (group_selector >= info->ngroups) 396 return -EINVAL; 397 398 switch (func_selector) { 399 case PIN_FUNC_1: 400 val &= PIN_FUNC_SEL_1; 401 break; 402 case PIN_FUNC_2: 403 val |= PIN_FUNC_SEL_2; 404 break; 405 case PIN_FUNC_3: 406 val |= PIN_FUNC_SEL_3; 407 break; 408 case PIN_FUNC_4: 409 val |= PIN_FUNC_SEL_4; 410 break; 411 default: 412 break; 413 } 414 415 for (i = 0; i < grp_pins; i++) { 416 unsigned int pin_id = grp->pins[i]; 417 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); 418 419 if (!pin || pin->type != COMMON_PIN) 420 continue; 421 422 reg = readl((void __iomem *)pin->reg); 423 reg &= ~PIN_FUNC_MASK; 424 reg |= val; 425 writel(reg, (void __iomem *)pin->reg); 426 } 427 428 return 0; 429} 430 431static const struct pinmux_ops sprd_pmx_ops = { 432 .get_functions_count = sprd_pmx_get_function_count, 433 .get_function_name = sprd_pmx_get_function_name, 434 .get_function_groups = sprd_pmx_get_function_groups, 435 .set_mux = sprd_pmx_set_mux, 436}; 437 438static int sprd_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin_id, 439 unsigned long *config) 440{ 441 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 442 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); 443 unsigned int param = pinconf_to_config_param(*config); 444 unsigned int reg, arg; 445 446 if (!pin) 447 return -EINVAL; 448 449 if (pin->type == GLOBAL_CTRL_PIN) { 450 reg = (readl((void __iomem *)pin->reg) >> 451 pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); 452 } else { 453 reg = readl((void __iomem *)pin->reg); 454 } 455 456 if (pin->type == GLOBAL_CTRL_PIN && 457 param == SPRD_PIN_CONFIG_CONTROL) { 458 arg = reg; 459 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { 460 switch (param) { 461 case SPRD_PIN_CONFIG_SLEEP_MODE: 462 arg = (reg >> SLEEP_MODE_SHIFT) & SLEEP_MODE_MASK; 463 break; 464 case PIN_CONFIG_INPUT_ENABLE: 465 arg = (reg >> SLEEP_INPUT_SHIFT) & SLEEP_INPUT_MASK; 466 break; 467 case PIN_CONFIG_OUTPUT_ENABLE: 468 arg = reg & SLEEP_OUTPUT_MASK; 469 break; 470 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: 471 if ((reg & SLEEP_OUTPUT) || (reg & SLEEP_INPUT)) 472 return -EINVAL; 473 474 arg = 1; 475 break; 476 case PIN_CONFIG_DRIVE_STRENGTH: 477 arg = (reg >> DRIVE_STRENGTH_SHIFT) & 478 DRIVE_STRENGTH_MASK; 479 break; 480 case PIN_CONFIG_BIAS_PULL_DOWN: 481 /* combine sleep pull down and pull down config */ 482 arg = ((reg >> SLEEP_PULL_DOWN_SHIFT) & 483 SLEEP_PULL_DOWN_MASK) << 16; 484 arg |= (reg >> PULL_DOWN_SHIFT) & PULL_DOWN_MASK; 485 break; 486 case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 487 arg = (reg >> INPUT_SCHMITT_SHIFT) & INPUT_SCHMITT_MASK; 488 break; 489 case PIN_CONFIG_BIAS_PULL_UP: 490 /* combine sleep pull up and pull up config */ 491 arg = ((reg >> SLEEP_PULL_UP_SHIFT) & 492 SLEEP_PULL_UP_MASK) << 16; 493 arg |= (reg >> PULL_UP_SHIFT) & PULL_UP_MASK; 494 break; 495 case PIN_CONFIG_BIAS_DISABLE: 496 if ((reg & (SLEEP_PULL_DOWN | SLEEP_PULL_UP)) || 497 (reg & (PULL_DOWN | PULL_UP_4_7K | PULL_UP_20K))) 498 return -EINVAL; 499 500 arg = 1; 501 break; 502 case PIN_CONFIG_SLEEP_HARDWARE_STATE: 503 arg = 0; 504 break; 505 default: 506 return -ENOTSUPP; 507 } 508 } else { 509 return -ENOTSUPP; 510 } 511 512 *config = pinconf_to_config_packed(param, arg); 513 return 0; 514} 515 516static unsigned int sprd_pinconf_drive(unsigned int mA) 517{ 518 unsigned int val = 0; 519 520 switch (mA) { 521 case 2: 522 break; 523 case 4: 524 val |= BIT(19); 525 break; 526 case 6: 527 val |= BIT(20); 528 break; 529 case 8: 530 val |= BIT(19) | BIT(20); 531 break; 532 case 10: 533 val |= BIT(21); 534 break; 535 case 12: 536 val |= BIT(21) | BIT(19); 537 break; 538 case 14: 539 val |= BIT(21) | BIT(20); 540 break; 541 case 16: 542 val |= BIT(19) | BIT(20) | BIT(21); 543 break; 544 case 20: 545 val |= BIT(22); 546 break; 547 case 21: 548 val |= BIT(22) | BIT(19); 549 break; 550 case 24: 551 val |= BIT(22) | BIT(20); 552 break; 553 case 25: 554 val |= BIT(22) | BIT(20) | BIT(19); 555 break; 556 case 27: 557 val |= BIT(22) | BIT(21); 558 break; 559 case 29: 560 val |= BIT(22) | BIT(21) | BIT(19); 561 break; 562 case 31: 563 val |= BIT(22) | BIT(21) | BIT(20); 564 break; 565 case 33: 566 val |= BIT(22) | BIT(21) | BIT(20) | BIT(19); 567 break; 568 default: 569 break; 570 } 571 572 return val; 573} 574 575static bool sprd_pinctrl_check_sleep_config(unsigned long *configs, 576 unsigned int num_configs) 577{ 578 unsigned int param; 579 int i; 580 581 for (i = 0; i < num_configs; i++) { 582 param = pinconf_to_config_param(configs[i]); 583 if (param == PIN_CONFIG_SLEEP_HARDWARE_STATE) 584 return true; 585 } 586 587 return false; 588} 589 590static int sprd_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin_id, 591 unsigned long *configs, unsigned int num_configs) 592{ 593 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 594 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); 595 bool is_sleep_config; 596 unsigned long reg; 597 int i; 598 599 if (!pin) 600 return -EINVAL; 601 602 is_sleep_config = sprd_pinctrl_check_sleep_config(configs, num_configs); 603 604 for (i = 0; i < num_configs; i++) { 605 unsigned int param, arg, shift, mask, val; 606 607 param = pinconf_to_config_param(configs[i]); 608 arg = pinconf_to_config_argument(configs[i]); 609 610 val = 0; 611 shift = 0; 612 mask = 0; 613 if (pin->type == GLOBAL_CTRL_PIN && 614 param == SPRD_PIN_CONFIG_CONTROL) { 615 val = arg; 616 } else if (pin->type == COMMON_PIN || pin->type == MISC_PIN) { 617 switch (param) { 618 case SPRD_PIN_CONFIG_SLEEP_MODE: 619 if (arg & AP_SLEEP) 620 val |= AP_SLEEP_MODE; 621 if (arg & PUBCP_SLEEP) 622 val |= PUBCP_SLEEP_MODE; 623 if (arg & TGLDSP_SLEEP) 624 val |= TGLDSP_SLEEP_MODE; 625 if (arg & AGDSP_SLEEP) 626 val |= AGDSP_SLEEP_MODE; 627 if (arg & CM4_SLEEP) 628 val |= CM4_SLEEP_MODE; 629 630 mask = SLEEP_MODE_MASK; 631 shift = SLEEP_MODE_SHIFT; 632 break; 633 case PIN_CONFIG_INPUT_ENABLE: 634 if (is_sleep_config == true) { 635 if (arg > 0) 636 val |= SLEEP_INPUT; 637 else 638 val &= ~SLEEP_INPUT; 639 640 mask = SLEEP_INPUT_MASK; 641 shift = SLEEP_INPUT_SHIFT; 642 } 643 break; 644 case PIN_CONFIG_OUTPUT_ENABLE: 645 if (is_sleep_config == true) { 646 if (arg > 0) 647 val |= SLEEP_OUTPUT; 648 else 649 val &= ~SLEEP_OUTPUT; 650 651 mask = SLEEP_OUTPUT_MASK; 652 shift = SLEEP_OUTPUT_SHIFT; 653 } 654 break; 655 case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: 656 if (is_sleep_config == true) { 657 val = shift = 0; 658 mask = SLEEP_OUTPUT | SLEEP_INPUT; 659 } 660 break; 661 case PIN_CONFIG_DRIVE_STRENGTH: 662 if (arg < 2 || arg > 60) 663 return -EINVAL; 664 665 val = sprd_pinconf_drive(arg); 666 mask = DRIVE_STRENGTH_MASK; 667 shift = DRIVE_STRENGTH_SHIFT; 668 break; 669 case PIN_CONFIG_BIAS_PULL_DOWN: 670 if (is_sleep_config == true) { 671 val |= SLEEP_PULL_DOWN; 672 mask = SLEEP_PULL_DOWN_MASK; 673 shift = SLEEP_PULL_DOWN_SHIFT; 674 } else { 675 val |= PULL_DOWN; 676 mask = PULL_DOWN_MASK; 677 shift = PULL_DOWN_SHIFT; 678 } 679 break; 680 case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 681 if (arg > 0) 682 val |= INPUT_SCHMITT; 683 else 684 val &= ~INPUT_SCHMITT; 685 686 mask = INPUT_SCHMITT_MASK; 687 shift = INPUT_SCHMITT_SHIFT; 688 break; 689 case PIN_CONFIG_BIAS_PULL_UP: 690 if (is_sleep_config) { 691 val |= SLEEP_PULL_UP; 692 mask = SLEEP_PULL_UP_MASK; 693 shift = SLEEP_PULL_UP_SHIFT; 694 } else { 695 if (arg == 20000) 696 val |= PULL_UP_20K; 697 else if (arg == 4700) 698 val |= PULL_UP_4_7K; 699 700 mask = PULL_UP_MASK; 701 shift = PULL_UP_SHIFT; 702 } 703 break; 704 case PIN_CONFIG_BIAS_DISABLE: 705 if (is_sleep_config == true) { 706 val = shift = 0; 707 mask = SLEEP_PULL_DOWN | SLEEP_PULL_UP; 708 } else { 709 val = shift = 0; 710 mask = PULL_DOWN | PULL_UP_20K | 711 PULL_UP_4_7K; 712 } 713 break; 714 case PIN_CONFIG_SLEEP_HARDWARE_STATE: 715 continue; 716 default: 717 return -ENOTSUPP; 718 } 719 } else { 720 return -ENOTSUPP; 721 } 722 723 if (pin->type == GLOBAL_CTRL_PIN) { 724 reg = readl((void __iomem *)pin->reg); 725 reg &= ~(PINCTRL_BIT_MASK(pin->bit_width) 726 << pin->bit_offset); 727 reg |= (val & PINCTRL_BIT_MASK(pin->bit_width)) 728 << pin->bit_offset; 729 writel(reg, (void __iomem *)pin->reg); 730 } else { 731 reg = readl((void __iomem *)pin->reg); 732 reg &= ~(mask << shift); 733 reg |= val; 734 writel(reg, (void __iomem *)pin->reg); 735 } 736 } 737 738 return 0; 739} 740 741static int sprd_pinconf_group_get(struct pinctrl_dev *pctldev, 742 unsigned int selector, unsigned long *config) 743{ 744 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 745 struct sprd_pinctrl_soc_info *info = pctl->info; 746 struct sprd_pin_group *grp; 747 unsigned int pin_id; 748 749 if (selector >= info->ngroups) 750 return -EINVAL; 751 752 grp = &info->groups[selector]; 753 pin_id = grp->pins[0]; 754 755 return sprd_pinconf_get(pctldev, pin_id, config); 756} 757 758static int sprd_pinconf_group_set(struct pinctrl_dev *pctldev, 759 unsigned int selector, 760 unsigned long *configs, 761 unsigned int num_configs) 762{ 763 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 764 struct sprd_pinctrl_soc_info *info = pctl->info; 765 struct sprd_pin_group *grp; 766 int ret, i; 767 768 if (selector >= info->ngroups) 769 return -EINVAL; 770 771 grp = &info->groups[selector]; 772 773 for (i = 0; i < grp->npins; i++) { 774 unsigned int pin_id = grp->pins[i]; 775 776 ret = sprd_pinconf_set(pctldev, pin_id, configs, num_configs); 777 if (ret) 778 return ret; 779 } 780 781 return 0; 782} 783 784static int sprd_pinconf_get_config(struct pinctrl_dev *pctldev, 785 unsigned int pin_id, 786 unsigned long *config) 787{ 788 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 789 struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); 790 791 if (!pin) 792 return -EINVAL; 793 794 if (pin->type == GLOBAL_CTRL_PIN) { 795 *config = (readl((void __iomem *)pin->reg) >> 796 pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); 797 } else { 798 *config = readl((void __iomem *)pin->reg); 799 } 800 801 return 0; 802} 803 804static void sprd_pinconf_dbg_show(struct pinctrl_dev *pctldev, 805 struct seq_file *s, unsigned int pin_id) 806{ 807 unsigned long config; 808 int ret; 809 810 ret = sprd_pinconf_get_config(pctldev, pin_id, &config); 811 if (ret) 812 return; 813 814 seq_printf(s, "0x%lx", config); 815} 816 817static void sprd_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, 818 struct seq_file *s, 819 unsigned int selector) 820{ 821 struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); 822 struct sprd_pinctrl_soc_info *info = pctl->info; 823 struct sprd_pin_group *grp; 824 unsigned long config; 825 const char *name; 826 int i, ret; 827 828 if (selector >= info->ngroups) 829 return; 830 831 grp = &info->groups[selector]; 832 833 seq_putc(s, '\n'); 834 for (i = 0; i < grp->npins; i++, config++) { 835 unsigned int pin_id = grp->pins[i]; 836 837 name = pin_get_name(pctldev, pin_id); 838 ret = sprd_pinconf_get_config(pctldev, pin_id, &config); 839 if (ret) 840 return; 841 842 seq_printf(s, "%s: 0x%lx ", name, config); 843 } 844} 845 846static const struct pinconf_ops sprd_pinconf_ops = { 847 .is_generic = true, 848 .pin_config_get = sprd_pinconf_get, 849 .pin_config_set = sprd_pinconf_set, 850 .pin_config_group_get = sprd_pinconf_group_get, 851 .pin_config_group_set = sprd_pinconf_group_set, 852 .pin_config_dbg_show = sprd_pinconf_dbg_show, 853 .pin_config_group_dbg_show = sprd_pinconf_group_dbg_show, 854}; 855 856static const struct pinconf_generic_params sprd_dt_params[] = { 857 {"sprd,control", SPRD_PIN_CONFIG_CONTROL, 0}, 858 {"sprd,sleep-mode", SPRD_PIN_CONFIG_SLEEP_MODE, 0}, 859}; 860 861#ifdef CONFIG_DEBUG_FS 862static const struct pin_config_item sprd_conf_items[] = { 863 PCONFDUMP(SPRD_PIN_CONFIG_CONTROL, "global control", NULL, true), 864 PCONFDUMP(SPRD_PIN_CONFIG_SLEEP_MODE, "sleep mode", NULL, true), 865}; 866#endif 867 868static struct pinctrl_desc sprd_pinctrl_desc = { 869 .pctlops = &sprd_pctrl_ops, 870 .pmxops = &sprd_pmx_ops, 871 .confops = &sprd_pinconf_ops, 872 .num_custom_params = ARRAY_SIZE(sprd_dt_params), 873 .custom_params = sprd_dt_params, 874#ifdef CONFIG_DEBUG_FS 875 .custom_conf_items = sprd_conf_items, 876#endif 877 .owner = THIS_MODULE, 878}; 879 880static int sprd_pinctrl_parse_groups(struct device_node *np, 881 struct sprd_pinctrl *sprd_pctl, 882 struct sprd_pin_group *grp) 883{ 884 struct property *prop; 885 const char *pin_name; 886 int ret, i = 0; 887 888 ret = of_property_count_strings(np, "pins"); 889 if (ret < 0) 890 return ret; 891 892 grp->name = np->name; 893 grp->npins = ret; 894 grp->pins = devm_kcalloc(sprd_pctl->dev, 895 grp->npins, sizeof(unsigned int), 896 GFP_KERNEL); 897 if (!grp->pins) 898 return -ENOMEM; 899 900 of_property_for_each_string(np, "pins", prop, pin_name) { 901 ret = sprd_pinctrl_get_id_by_name(sprd_pctl, pin_name); 902 if (ret >= 0) 903 grp->pins[i++] = ret; 904 } 905 906 for (i = 0; i < grp->npins; i++) { 907 dev_dbg(sprd_pctl->dev, 908 "Group[%s] contains [%d] pins: id = %d\n", 909 grp->name, grp->npins, grp->pins[i]); 910 } 911 912 return 0; 913} 914 915static unsigned int sprd_pinctrl_get_groups(struct device_node *np) 916{ 917 struct device_node *child; 918 unsigned int group_cnt, cnt; 919 920 group_cnt = of_get_child_count(np); 921 922 for_each_child_of_node(np, child) { 923 cnt = of_get_child_count(child); 924 if (cnt > 0) 925 group_cnt += cnt; 926 } 927 928 return group_cnt; 929} 930 931static int sprd_pinctrl_parse_dt(struct sprd_pinctrl *sprd_pctl) 932{ 933 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; 934 struct device_node *np = sprd_pctl->dev->of_node; 935 struct device_node *child, *sub_child; 936 struct sprd_pin_group *grp; 937 const char **temp; 938 int ret; 939 940 if (!np) 941 return -ENODEV; 942 943 info->ngroups = sprd_pinctrl_get_groups(np); 944 if (!info->ngroups) 945 return 0; 946 947 info->groups = devm_kcalloc(sprd_pctl->dev, 948 info->ngroups, 949 sizeof(struct sprd_pin_group), 950 GFP_KERNEL); 951 if (!info->groups) 952 return -ENOMEM; 953 954 info->grp_names = devm_kcalloc(sprd_pctl->dev, 955 info->ngroups, sizeof(char *), 956 GFP_KERNEL); 957 if (!info->grp_names) 958 return -ENOMEM; 959 960 temp = info->grp_names; 961 grp = info->groups; 962 963 for_each_child_of_node(np, child) { 964 ret = sprd_pinctrl_parse_groups(child, sprd_pctl, grp); 965 if (ret) { 966 of_node_put(child); 967 return ret; 968 } 969 970 *temp++ = grp->name; 971 grp++; 972 973 if (of_get_child_count(child) > 0) { 974 for_each_child_of_node(child, sub_child) { 975 ret = sprd_pinctrl_parse_groups(sub_child, 976 sprd_pctl, grp); 977 if (ret) { 978 of_node_put(sub_child); 979 of_node_put(child); 980 return ret; 981 } 982 983 *temp++ = grp->name; 984 grp++; 985 } 986 } 987 } 988 989 return 0; 990} 991 992static int sprd_pinctrl_add_pins(struct sprd_pinctrl *sprd_pctl, 993 struct sprd_pins_info *sprd_soc_pin_info, 994 int pins_cnt) 995{ 996 struct sprd_pinctrl_soc_info *info = sprd_pctl->info; 997 unsigned int ctrl_pin = 0, com_pin = 0; 998 struct sprd_pin *pin; 999 int i; 1000 1001 info->npins = pins_cnt; 1002 info->pins = devm_kcalloc(sprd_pctl->dev, 1003 info->npins, sizeof(struct sprd_pin), 1004 GFP_KERNEL); 1005 if (!info->pins) 1006 return -ENOMEM; 1007 1008 for (i = 0, pin = info->pins; i < info->npins; i++, pin++) { 1009 unsigned int reg; 1010 1011 pin->name = sprd_soc_pin_info[i].name; 1012 pin->type = sprd_soc_pin_info[i].type; 1013 pin->number = sprd_soc_pin_info[i].num; 1014 reg = sprd_soc_pin_info[i].reg; 1015 if (pin->type == GLOBAL_CTRL_PIN) { 1016 pin->reg = (unsigned long)sprd_pctl->base + 1017 PINCTRL_REG_LEN * reg; 1018 pin->bit_offset = sprd_soc_pin_info[i].bit_offset; 1019 pin->bit_width = sprd_soc_pin_info[i].bit_width; 1020 ctrl_pin++; 1021 } else if (pin->type == COMMON_PIN) { 1022 pin->reg = (unsigned long)sprd_pctl->base + 1023 PINCTRL_REG_OFFSET + PINCTRL_REG_LEN * 1024 (i - ctrl_pin); 1025 com_pin++; 1026 } else if (pin->type == MISC_PIN) { 1027 pin->reg = (unsigned long)sprd_pctl->base + 1028 PINCTRL_REG_MISC_OFFSET + PINCTRL_REG_LEN * 1029 (i - ctrl_pin - com_pin); 1030 } 1031 } 1032 1033 for (i = 0, pin = info->pins; i < info->npins; pin++, i++) { 1034 dev_dbg(sprd_pctl->dev, "pin name[%s-%d], type = %d, " 1035 "bit offset = %ld, bit width = %ld, reg = 0x%lx\n", 1036 pin->name, pin->number, pin->type, 1037 pin->bit_offset, pin->bit_width, pin->reg); 1038 } 1039 1040 return 0; 1041} 1042 1043int sprd_pinctrl_core_probe(struct platform_device *pdev, 1044 struct sprd_pins_info *sprd_soc_pin_info, 1045 int pins_cnt) 1046{ 1047 struct sprd_pinctrl *sprd_pctl; 1048 struct sprd_pinctrl_soc_info *pinctrl_info; 1049 struct pinctrl_pin_desc *pin_desc; 1050 int ret, i; 1051 1052 sprd_pctl = devm_kzalloc(&pdev->dev, sizeof(struct sprd_pinctrl), 1053 GFP_KERNEL); 1054 if (!sprd_pctl) 1055 return -ENOMEM; 1056 1057 sprd_pctl->base = devm_platform_ioremap_resource(pdev, 0); 1058 if (IS_ERR(sprd_pctl->base)) 1059 return PTR_ERR(sprd_pctl->base); 1060 1061 pinctrl_info = devm_kzalloc(&pdev->dev, 1062 sizeof(struct sprd_pinctrl_soc_info), 1063 GFP_KERNEL); 1064 if (!pinctrl_info) 1065 return -ENOMEM; 1066 1067 sprd_pctl->info = pinctrl_info; 1068 sprd_pctl->dev = &pdev->dev; 1069 platform_set_drvdata(pdev, sprd_pctl); 1070 1071 ret = sprd_pinctrl_add_pins(sprd_pctl, sprd_soc_pin_info, pins_cnt); 1072 if (ret) { 1073 dev_err(&pdev->dev, "fail to add pins information\n"); 1074 return ret; 1075 } 1076 1077 ret = sprd_pinctrl_parse_dt(sprd_pctl); 1078 if (ret) { 1079 dev_err(&pdev->dev, "fail to parse dt properties\n"); 1080 return ret; 1081 } 1082 1083 pin_desc = devm_kcalloc(&pdev->dev, 1084 pinctrl_info->npins, 1085 sizeof(struct pinctrl_pin_desc), 1086 GFP_KERNEL); 1087 if (!pin_desc) 1088 return -ENOMEM; 1089 1090 for (i = 0; i < pinctrl_info->npins; i++) { 1091 pin_desc[i].number = pinctrl_info->pins[i].number; 1092 pin_desc[i].name = pinctrl_info->pins[i].name; 1093 pin_desc[i].drv_data = pinctrl_info; 1094 } 1095 1096 sprd_pinctrl_desc.pins = pin_desc; 1097 sprd_pinctrl_desc.name = dev_name(&pdev->dev); 1098 sprd_pinctrl_desc.npins = pinctrl_info->npins; 1099 1100 sprd_pctl->pctl = pinctrl_register(&sprd_pinctrl_desc, 1101 &pdev->dev, (void *)sprd_pctl); 1102 if (IS_ERR(sprd_pctl->pctl)) { 1103 dev_err(&pdev->dev, "could not register pinctrl driver\n"); 1104 return PTR_ERR(sprd_pctl->pctl); 1105 } 1106 1107 return 0; 1108} 1109EXPORT_SYMBOL_GPL(sprd_pinctrl_core_probe); 1110 1111int sprd_pinctrl_remove(struct platform_device *pdev) 1112{ 1113 struct sprd_pinctrl *sprd_pctl = platform_get_drvdata(pdev); 1114 1115 pinctrl_unregister(sprd_pctl->pctl); 1116 return 0; 1117} 1118EXPORT_SYMBOL_GPL(sprd_pinctrl_remove); 1119 1120void sprd_pinctrl_shutdown(struct platform_device *pdev) 1121{ 1122 struct pinctrl *pinctl; 1123 struct pinctrl_state *state; 1124 1125 pinctl = devm_pinctrl_get(&pdev->dev); 1126 if (IS_ERR(pinctl)) 1127 return; 1128 state = pinctrl_lookup_state(pinctl, "shutdown"); 1129 if (IS_ERR(state)) 1130 return; 1131 pinctrl_select_state(pinctl, state); 1132} 1133EXPORT_SYMBOL_GPL(sprd_pinctrl_shutdown); 1134 1135MODULE_DESCRIPTION("SPREADTRUM Pin Controller Driver"); 1136MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>"); 1137MODULE_LICENSE("GPL v2");