summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-xway.c
diff options
context:
space:
mode:
authorSherman Yin <syin@broadcom.com>2013-08-27 14:32:12 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-08-28 07:34:41 -0400
commit03b054e9696c3cbd3d5905ec96da15acd0a2fe8d (patch)
tree7123b780c194d350b3e5134c267e17262effb385 /drivers/pinctrl/pinctrl-xway.c
parentf5ba9c52bf1e236c4698c240955e5f119db62a28 (diff)
pinctrl: Pass all configs to driver on pin_config_set()
When setting pin configuration in the pinctrl framework, pin_config_set() or pin_config_group_set() is called in a loop to set one configuration at a time for the specified pin or group. This patch 1) removes the loop and 2) changes the API to pass the whole pin config array to the driver. It is now up to the driver to loop through the configs. This allows the driver to potentially combine configs and reduce the number of writes to pin config registers. All c files changed have been build-tested to verify the change compiles and that the corresponding .o is successfully generated. Signed-off-by: Sherman Yin <syin@broadcom.com> Reviewed-by: Christian Daudt <csd@broadcom.com> Reviewed-by: Matt Porter <matt.porter@linaro.org> Tested-by: Stephen Warren <swarren@nvidia.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-xway.c')
-rw-r--r--drivers/pinctrl/pinctrl-xway.c119
1 files changed, 73 insertions, 46 deletions
diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c
index 86c8cf82105b..ed2d1ba69cef 100644
--- a/drivers/pinctrl/pinctrl-xway.c
+++ b/drivers/pinctrl/pinctrl-xway.c
@@ -499,74 +499,101 @@ static int xway_pinconf_get(struct pinctrl_dev *pctldev,
499 499
500static int xway_pinconf_set(struct pinctrl_dev *pctldev, 500static int xway_pinconf_set(struct pinctrl_dev *pctldev,
501 unsigned pin, 501 unsigned pin,
502 unsigned long config) 502 unsigned long *configs,
503 unsigned num_configs)
503{ 504{
504 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev); 505 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
505 enum ltq_pinconf_param param = LTQ_PINCONF_UNPACK_PARAM(config); 506 enum ltq_pinconf_param param;
506 int arg = LTQ_PINCONF_UNPACK_ARG(config); 507 int arg;
507 int port = PORT(pin); 508 int port = PORT(pin);
508 u32 reg; 509 u32 reg;
510 int i;
511
512 for (i = 0; i < num_configs; i++) {
513 param = LTQ_PINCONF_UNPACK_PARAM(configs[i]);
514 arg = LTQ_PINCONF_UNPACK_ARG(configs[i]);
515
516 switch (param) {
517 case LTQ_PINCONF_PARAM_OPEN_DRAIN:
518 if (port == PORT3)
519 reg = GPIO3_OD;
520 else
521 reg = GPIO_OD(pin);
522 if (arg == 0)
523 gpio_setbit(info->membase[0],
524 reg,
525 PORT_PIN(pin));
526 else
527 gpio_clearbit(info->membase[0],
528 reg,
529 PORT_PIN(pin));
530 break;
509 531
510 switch (param) { 532 case LTQ_PINCONF_PARAM_PULL:
511 case LTQ_PINCONF_PARAM_OPEN_DRAIN: 533 if (port == PORT3)
512 if (port == PORT3) 534 reg = GPIO3_PUDEN;
513 reg = GPIO3_OD; 535 else
514 else 536 reg = GPIO_PUDEN(pin);
515 reg = GPIO_OD(pin); 537 if (arg == 0) {
516 if (arg == 0) 538 gpio_clearbit(info->membase[0],
539 reg,
540 PORT_PIN(pin));
541 break;
542 }
517 gpio_setbit(info->membase[0], reg, PORT_PIN(pin)); 543 gpio_setbit(info->membase[0], reg, PORT_PIN(pin));
518 else
519 gpio_clearbit(info->membase[0], reg, PORT_PIN(pin));
520 break;
521 544
522 case LTQ_PINCONF_PARAM_PULL: 545 if (port == PORT3)
523 if (port == PORT3) 546 reg = GPIO3_PUDSEL;
524 reg = GPIO3_PUDEN; 547 else
525 else 548 reg = GPIO_PUDSEL(pin);
526 reg = GPIO_PUDEN(pin); 549 if (arg == 1)
527 if (arg == 0) { 550 gpio_clearbit(info->membase[0],
528 gpio_clearbit(info->membase[0], reg, PORT_PIN(pin)); 551 reg,
552 PORT_PIN(pin));
553 else if (arg == 2)
554 gpio_setbit(info->membase[0],
555 reg,
556 PORT_PIN(pin));
557 else
558 dev_err(pctldev->dev,
559 "Invalid pull value %d\n", arg);
529 break; 560 break;
530 }
531 gpio_setbit(info->membase[0], reg, PORT_PIN(pin));
532 561
533 if (port == PORT3) 562 case LTQ_PINCONF_PARAM_OUTPUT:
534 reg = GPIO3_PUDSEL; 563 reg = GPIO_DIR(pin);
535 else 564 if (arg == 0)
536 reg = GPIO_PUDSEL(pin); 565 gpio_clearbit(info->membase[0],
537 if (arg == 1) 566 reg,
538 gpio_clearbit(info->membase[0], reg, PORT_PIN(pin)); 567 PORT_PIN(pin));
539 else if (arg == 2) 568 else
540 gpio_setbit(info->membase[0], reg, PORT_PIN(pin)); 569 gpio_setbit(info->membase[0],
541 else 570 reg,
542 dev_err(pctldev->dev, "Invalid pull value %d\n", arg); 571 PORT_PIN(pin));
543 break; 572 break;
544 573
545 case LTQ_PINCONF_PARAM_OUTPUT: 574 default:
546 reg = GPIO_DIR(pin); 575 dev_err(pctldev->dev,
547 if (arg == 0) 576 "Invalid config param %04x\n", param);
548 gpio_clearbit(info->membase[0], reg, PORT_PIN(pin)); 577 return -ENOTSUPP;
549 else 578 }
550 gpio_setbit(info->membase[0], reg, PORT_PIN(pin)); 579 } /* for each config */
551 break;
552 580
553 default:
554 dev_err(pctldev->dev, "Invalid config param %04x\n", param);
555 return -ENOTSUPP;
556 }
557 return 0; 581 return 0;
558} 582}
559 583
560int xway_pinconf_group_set(struct pinctrl_dev *pctldev, 584int xway_pinconf_group_set(struct pinctrl_dev *pctldev,
561 unsigned selector, 585 unsigned selector,
562 unsigned long config) 586 unsigned long *configs,
587 unsigned num_configs)
563{ 588{
564 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev); 589 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
565 int i, ret = 0; 590 int i, ret = 0;
566 591
567 for (i = 0; i < info->grps[selector].npins && !ret; i++) 592 for (i = 0; i < info->grps[selector].npins && !ret; i++)
568 ret = xway_pinconf_set(pctldev, 593 ret = xway_pinconf_set(pctldev,
569 info->grps[selector].pins[i], config); 594 info->grps[selector].pins[i],
595 configs,
596 num_configs);
570 597
571 return ret; 598 return ret;
572} 599}