1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (C) 2016 IBM Corp. 4 */ 5 6#include <linux/mfd/syscon.h> 7#include <linux/platform_device.h> 8#include <linux/slab.h> 9#include <linux/string.h> 10#include "../core.h" 11#include "pinctrl-aspeed.h" 12 13int aspeed_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) 14{ 15 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 16 17 return pdata->pinmux.ngroups; 18} 19 20const char *aspeed_pinctrl_get_group_name(struct pinctrl_dev *pctldev, 21 unsigned int group) 22{ 23 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 24 25 return pdata->pinmux.groups[group].name; 26} 27 28int aspeed_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 29 unsigned int group, const unsigned int **pins, 30 unsigned int *npins) 31{ 32 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 33 34 *pins = &pdata->pinmux.groups[group].pins[0]; 35 *npins = pdata->pinmux.groups[group].npins; 36 37 return 0; 38} 39 40void aspeed_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, 41 struct seq_file *s, unsigned int offset) 42{ 43 seq_printf(s, " %s", dev_name(pctldev->dev)); 44} 45 46int aspeed_pinmux_get_fn_count(struct pinctrl_dev *pctldev) 47{ 48 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 49 50 return pdata->pinmux.nfunctions; 51} 52 53const char *aspeed_pinmux_get_fn_name(struct pinctrl_dev *pctldev, 54 unsigned int function) 55{ 56 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 57 58 return pdata->pinmux.functions[function].name; 59} 60 61int aspeed_pinmux_get_fn_groups(struct pinctrl_dev *pctldev, 62 unsigned int function, 63 const char * const **groups, 64 unsigned int * const num_groups) 65{ 66 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 67 68 *groups = pdata->pinmux.functions[function].groups; 69 *num_groups = pdata->pinmux.functions[function].ngroups; 70 71 return 0; 72} 73 74static int aspeed_sig_expr_enable(struct aspeed_pinmux_data *ctx, 75 const struct aspeed_sig_expr *expr) 76{ 77 int ret; 78 79 pr_debug("Enabling signal %s for %s\n", expr->signal, 80 expr->function); 81 82 ret = aspeed_sig_expr_eval(ctx, expr, true); 83 if (ret < 0) 84 return ret; 85 86 if (!ret) 87 return aspeed_sig_expr_set(ctx, expr, true); 88 89 return 0; 90} 91 92static int aspeed_sig_expr_disable(struct aspeed_pinmux_data *ctx, 93 const struct aspeed_sig_expr *expr) 94{ 95 int ret; 96 97 pr_debug("Disabling signal %s for %s\n", expr->signal, 98 expr->function); 99 100 ret = aspeed_sig_expr_eval(ctx, expr, true); 101 if (ret < 0) 102 return ret; 103 104 if (ret) 105 return aspeed_sig_expr_set(ctx, expr, false); 106 107 return 0; 108} 109 110/** 111 * Disable a signal on a pin by disabling all provided signal expressions. 112 * 113 * @ctx: The pinmux context 114 * @exprs: The list of signal expressions (from a priority level on a pin) 115 * 116 * Return: 0 if all expressions are disabled, otherwise a negative error code 117 */ 118static int aspeed_disable_sig(struct aspeed_pinmux_data *ctx, 119 const struct aspeed_sig_expr **exprs) 120{ 121 int ret = 0; 122 123 if (!exprs) 124 return -EINVAL; 125 126 while (*exprs && !ret) { 127 ret = aspeed_sig_expr_disable(ctx, *exprs); 128 exprs++; 129 } 130 131 return ret; 132} 133 134/** 135 * Search for the signal expression needed to enable the pin's signal for the 136 * requested function. 137 * 138 * @exprs: List of signal expressions (haystack) 139 * @name: The name of the requested function (needle) 140 * 141 * Return: A pointer to the signal expression whose function tag matches the 142 * provided name, otherwise NULL. 143 * 144 */ 145static const struct aspeed_sig_expr *aspeed_find_expr_by_name( 146 const struct aspeed_sig_expr **exprs, const char *name) 147{ 148 while (*exprs) { 149 if (strcmp((*exprs)->function, name) == 0) 150 return *exprs; 151 exprs++; 152 } 153 154 return NULL; 155} 156 157static char *get_defined_attribute(const struct aspeed_pin_desc *pdesc, 158 const char *(*get)( 159 const struct aspeed_sig_expr *)) 160{ 161 char *found = NULL; 162 size_t len = 0; 163 const struct aspeed_sig_expr ***prios, **funcs, *expr; 164 165 prios = pdesc->prios; 166 167 while ((funcs = *prios)) { 168 while ((expr = *funcs)) { 169 const char *str = get(expr); 170 size_t delta = strlen(str) + 2; 171 char *expanded; 172 173 expanded = krealloc(found, len + delta + 1, GFP_KERNEL); 174 if (!expanded) { 175 kfree(found); 176 return expanded; 177 } 178 179 found = expanded; 180 found[len] = '\0'; 181 len += delta; 182 183 strcat(found, str); 184 strcat(found, ", "); 185 186 funcs++; 187 } 188 prios++; 189 } 190 191 if (len < 2) { 192 kfree(found); 193 return NULL; 194 } 195 196 found[len - 2] = '\0'; 197 198 return found; 199} 200 201static const char *aspeed_sig_expr_function(const struct aspeed_sig_expr *expr) 202{ 203 return expr->function; 204} 205 206static char *get_defined_functions(const struct aspeed_pin_desc *pdesc) 207{ 208 return get_defined_attribute(pdesc, aspeed_sig_expr_function); 209} 210 211static const char *aspeed_sig_expr_signal(const struct aspeed_sig_expr *expr) 212{ 213 return expr->signal; 214} 215 216static char *get_defined_signals(const struct aspeed_pin_desc *pdesc) 217{ 218 return get_defined_attribute(pdesc, aspeed_sig_expr_signal); 219} 220 221int aspeed_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int function, 222 unsigned int group) 223{ 224 int i; 225 int ret; 226 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 227 const struct aspeed_pin_group *pgroup = &pdata->pinmux.groups[group]; 228 const struct aspeed_pin_function *pfunc = 229 &pdata->pinmux.functions[function]; 230 231 for (i = 0; i < pgroup->npins; i++) { 232 int pin = pgroup->pins[i]; 233 const struct aspeed_pin_desc *pdesc = pdata->pins[pin].drv_data; 234 const struct aspeed_sig_expr *expr = NULL; 235 const struct aspeed_sig_expr **funcs; 236 const struct aspeed_sig_expr ***prios; 237 238 if (!pdesc) 239 return -EINVAL; 240 241 pr_debug("Muxing pin %s for %s\n", pdesc->name, pfunc->name); 242 243 prios = pdesc->prios; 244 245 if (!prios) 246 continue; 247 248 /* Disable functions at a higher priority than that requested */ 249 while ((funcs = *prios)) { 250 expr = aspeed_find_expr_by_name(funcs, pfunc->name); 251 252 if (expr) 253 break; 254 255 ret = aspeed_disable_sig(&pdata->pinmux, funcs); 256 if (ret) 257 return ret; 258 259 prios++; 260 } 261 262 if (!expr) { 263 char *functions = get_defined_functions(pdesc); 264 char *signals = get_defined_signals(pdesc); 265 266 pr_warn("No function %s found on pin %s (%d). Found signal(s) %s for function(s) %s\n", 267 pfunc->name, pdesc->name, pin, signals, 268 functions); 269 kfree(signals); 270 kfree(functions); 271 272 return -ENXIO; 273 } 274 275 ret = aspeed_sig_expr_enable(&pdata->pinmux, expr); 276 if (ret) 277 return ret; 278 279 pr_debug("Muxed pin %s as %s for %s\n", pdesc->name, expr->signal, 280 expr->function); 281 } 282 283 return 0; 284} 285 286static bool aspeed_expr_is_gpio(const struct aspeed_sig_expr *expr) 287{ 288 /* 289 * We need to differentiate between GPIO and non-GPIO signals to 290 * implement the gpio_request_enable() interface. For better or worse 291 * the ASPEED pinctrl driver uses the expression names to determine 292 * whether an expression will mux a pin for GPIO. 293 * 294 * Generally we have the following - A GPIO such as B1 has: 295 * 296 * - expr->signal set to "GPIOB1" 297 * - expr->function set to "GPIOB1" 298 * 299 * Using this fact we can determine whether the provided expression is 300 * a GPIO expression by testing the signal name for the string prefix 301 * "GPIO". 302 * 303 * However, some GPIOs are input-only, and the ASPEED datasheets name 304 * them differently. An input-only GPIO such as T0 has: 305 * 306 * - expr->signal set to "GPIT0" 307 * - expr->function set to "GPIT0" 308 * 309 * It's tempting to generalise the prefix test from "GPIO" to "GPI" to 310 * account for both GPIOs and GPIs, but in doing so we run aground on 311 * another feature: 312 * 313 * Some pins in the ASPEED BMC SoCs have a "pass-through" GPIO 314 * function where the input state of one pin is replicated as the 315 * output state of another (as if they were shorted together - a mux 316 * configuration that is typically enabled by hardware strapping). 317 * This feature allows the BMC to pass e.g. power button state through 318 * to the host while the BMC is yet to boot, but take control of the 319 * button state once the BMC has booted by muxing each pin as a 320 * separate, pin-specific GPIO. 321 * 322 * Conceptually this pass-through mode is a form of GPIO and is named 323 * as such in the datasheets, e.g. "GPID0". This naming similarity 324 * trips us up with the simple GPI-prefixed-signal-name scheme 325 * discussed above, as the pass-through configuration is not what we 326 * want when muxing a pin as GPIO for the GPIO subsystem. 327 * 328 * On e.g. the AST2400, a pass-through function "GPID0" is grouped on 329 * balls A18 and D16, where we have: 330 * 331 * For ball A18: 332 * - expr->signal set to "GPID0IN" 333 * - expr->function set to "GPID0" 334 * 335 * For ball D16: 336 * - expr->signal set to "GPID0OUT" 337 * - expr->function set to "GPID0" 338 * 339 * By contrast, the pin-specific GPIO expressions for the same pins are 340 * as follows: 341 * 342 * For ball A18: 343 * - expr->signal looks like "GPIOD0" 344 * - expr->function looks like "GPIOD0" 345 * 346 * For ball D16: 347 * - expr->signal looks like "GPIOD1" 348 * - expr->function looks like "GPIOD1" 349 * 350 * Testing both the signal _and_ function names gives us the means 351 * differentiate the pass-through GPIO pinmux configuration from the 352 * pin-specific configuration that the GPIO subsystem is after: An 353 * expression is a pin-specific (non-pass-through) GPIO configuration 354 * if the signal prefix is "GPI" and the signal name matches the 355 * function name. 356 */ 357 return !strncmp(expr->signal, "GPI", 3) && 358 !strcmp(expr->signal, expr->function); 359} 360 361static bool aspeed_gpio_in_exprs(const struct aspeed_sig_expr **exprs) 362{ 363 if (!exprs) 364 return false; 365 366 while (*exprs) { 367 if (aspeed_expr_is_gpio(*exprs)) 368 return true; 369 exprs++; 370 } 371 372 return false; 373} 374 375int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev, 376 struct pinctrl_gpio_range *range, 377 unsigned int offset) 378{ 379 int ret; 380 struct aspeed_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev); 381 const struct aspeed_pin_desc *pdesc = pdata->pins[offset].drv_data; 382 const struct aspeed_sig_expr ***prios, **funcs, *expr; 383 384 if (!pdesc) 385 return -EINVAL; 386 387 prios = pdesc->prios; 388 389 if (!prios) 390 return -ENXIO; 391 392 pr_debug("Muxing pin %s for GPIO\n", pdesc->name); 393 394 /* Disable any functions of higher priority than GPIO */ 395 while ((funcs = *prios)) { 396 if (aspeed_gpio_in_exprs(funcs)) 397 break; 398 399 ret = aspeed_disable_sig(&pdata->pinmux, funcs); 400 if (ret) 401 return ret; 402 403 prios++; 404 } 405 406 if (!funcs) { 407 char *signals = get_defined_signals(pdesc); 408 409 pr_warn("No GPIO signal type found on pin %s (%d). Found: %s\n", 410 pdesc->name, offset, signals); 411 kfree(signals); 412 413 return -ENXIO; 414 } 415 416 expr = *funcs; 417 418 /* 419 * Disabling all higher-priority expressions is enough to enable the 420 * lowest-priority signal type. As such it has no associated 421 * expression. 422 */ 423 if (!expr) { 424 pr_debug("Muxed pin %s as GPIO\n", pdesc->name); 425 return 0; 426 } 427 428 /* 429 * If GPIO is not the lowest priority signal type, assume there is only 430 * one expression defined to enable the GPIO function 431 */ 432 ret = aspeed_sig_expr_enable(&pdata->pinmux, expr); 433 if (ret) 434 return ret; 435 436 pr_debug("Muxed pin %s as %s\n", pdesc->name, expr->signal); 437 438 return 0; 439} 440 441int aspeed_pinctrl_probe(struct platform_device *pdev, 442 struct pinctrl_desc *pdesc, 443 struct aspeed_pinctrl_data *pdata) 444{ 445 struct device *parent; 446 struct pinctrl_dev *pctl; 447 448 parent = pdev->dev.parent; 449 if (!parent) { 450 dev_err(&pdev->dev, "No parent for syscon pincontroller\n"); 451 return -ENODEV; 452 } 453 454 pdata->scu = syscon_node_to_regmap(parent->of_node); 455 if (IS_ERR(pdata->scu)) { 456 dev_err(&pdev->dev, "No regmap for syscon pincontroller parent\n"); 457 return PTR_ERR(pdata->scu); 458 } 459 460 pdata->pinmux.maps[ASPEED_IP_SCU] = pdata->scu; 461 462 pctl = pinctrl_register(pdesc, &pdev->dev, pdata); 463 464 if (IS_ERR(pctl)) { 465 dev_err(&pdev->dev, "Failed to register pinctrl\n"); 466 return PTR_ERR(pctl); 467 } 468 469 platform_set_drvdata(pdev, pdata); 470 471 return 0; 472} 473 474static inline bool pin_in_config_range(unsigned int offset, 475 const struct aspeed_pin_config *config) 476{ 477 return offset >= config->pins[0] && offset <= config->pins[1]; 478} 479 480static inline const struct aspeed_pin_config *find_pinconf_config( 481 const struct aspeed_pinctrl_data *pdata, 482 unsigned int offset, 483 enum pin_config_param param) 484{ 485 unsigned int i; 486 487 for (i = 0; i < pdata->nconfigs; i++) { 488 if (param == pdata->configs[i].param && 489 pin_in_config_range(offset, &pdata->configs[i])) 490 return &pdata->configs[i]; 491 } 492 493 return NULL; 494} 495 496enum aspeed_pin_config_map_type { MAP_TYPE_ARG, MAP_TYPE_VAL }; 497 498static const struct aspeed_pin_config_map *find_pinconf_map( 499 const struct aspeed_pinctrl_data *pdata, 500 enum pin_config_param param, 501 enum aspeed_pin_config_map_type type, 502 s64 value) 503{ 504 int i; 505 506 for (i = 0; i < pdata->nconfmaps; i++) { 507 const struct aspeed_pin_config_map *elem; 508 bool match; 509 510 elem = &pdata->confmaps[i]; 511 512 switch (type) { 513 case MAP_TYPE_ARG: 514 match = (elem->arg == -1 || elem->arg == value); 515 break; 516 case MAP_TYPE_VAL: 517 match = (elem->val == value); 518 break; 519 } 520 521 if (param == elem->param && match) 522 return elem; 523 } 524 525 return NULL; 526} 527 528int aspeed_pin_config_get(struct pinctrl_dev *pctldev, unsigned int offset, 529 unsigned long *config) 530{ 531 const enum pin_config_param param = pinconf_to_config_param(*config); 532 const struct aspeed_pin_config_map *pmap; 533 const struct aspeed_pinctrl_data *pdata; 534 const struct aspeed_pin_config *pconf; 535 unsigned int val; 536 int rc = 0; 537 u32 arg; 538 539 pdata = pinctrl_dev_get_drvdata(pctldev); 540 pconf = find_pinconf_config(pdata, offset, param); 541 if (!pconf) 542 return -ENOTSUPP; 543 544 rc = regmap_read(pdata->scu, pconf->reg, &val); 545 if (rc < 0) 546 return rc; 547 548 pmap = find_pinconf_map(pdata, param, MAP_TYPE_VAL, 549 (val & pconf->mask) >> __ffs(pconf->mask)); 550 551 if (!pmap) 552 return -EINVAL; 553 554 if (param == PIN_CONFIG_DRIVE_STRENGTH) 555 arg = (u32) pmap->arg; 556 else if (param == PIN_CONFIG_BIAS_PULL_DOWN) 557 arg = !!pmap->arg; 558 else 559 arg = 1; 560 561 if (!arg) 562 return -EINVAL; 563 564 *config = pinconf_to_config_packed(param, arg); 565 566 return 0; 567} 568 569int aspeed_pin_config_set(struct pinctrl_dev *pctldev, unsigned int offset, 570 unsigned long *configs, unsigned int num_configs) 571{ 572 const struct aspeed_pinctrl_data *pdata; 573 unsigned int i; 574 int rc = 0; 575 576 pdata = pinctrl_dev_get_drvdata(pctldev); 577 578 for (i = 0; i < num_configs; i++) { 579 const struct aspeed_pin_config_map *pmap; 580 const struct aspeed_pin_config *pconf; 581 enum pin_config_param param; 582 unsigned int val; 583 u32 arg; 584 585 param = pinconf_to_config_param(configs[i]); 586 arg = pinconf_to_config_argument(configs[i]); 587 588 pconf = find_pinconf_config(pdata, offset, param); 589 if (!pconf) 590 return -ENOTSUPP; 591 592 pmap = find_pinconf_map(pdata, param, MAP_TYPE_ARG, arg); 593 594 if (WARN_ON(!pmap)) 595 return -EINVAL; 596 597 val = pmap->val << __ffs(pconf->mask); 598 599 rc = regmap_update_bits(pdata->scu, pconf->reg, 600 pconf->mask, val); 601 602 if (rc < 0) 603 return rc; 604 605 pr_debug("%s: Set SCU%02X[0x%08X]=0x%X for param %d(=%d) on pin %d\n", 606 __func__, pconf->reg, pconf->mask, 607 val, param, arg, offset); 608 } 609 610 return 0; 611} 612 613int aspeed_pin_config_group_get(struct pinctrl_dev *pctldev, 614 unsigned int selector, 615 unsigned long *config) 616{ 617 const unsigned int *pins; 618 unsigned int npins; 619 int rc; 620 621 rc = aspeed_pinctrl_get_group_pins(pctldev, selector, &pins, &npins); 622 if (rc < 0) 623 return rc; 624 625 if (!npins) 626 return -ENODEV; 627 628 rc = aspeed_pin_config_get(pctldev, pins[0], config); 629 630 return rc; 631} 632 633int aspeed_pin_config_group_set(struct pinctrl_dev *pctldev, 634 unsigned int selector, 635 unsigned long *configs, 636 unsigned int num_configs) 637{ 638 const unsigned int *pins; 639 unsigned int npins; 640 int rc; 641 int i; 642 643 pr_debug("%s: Fetching pins for group selector %d\n", 644 __func__, selector); 645 rc = aspeed_pinctrl_get_group_pins(pctldev, selector, &pins, &npins); 646 if (rc < 0) 647 return rc; 648 649 for (i = 0; i < npins; i++) { 650 rc = aspeed_pin_config_set(pctldev, pins[i], configs, 651 num_configs); 652 if (rc < 0) 653 return rc; 654 } 655 656 return 0; 657} 658