aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-rockchip.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-rockchip.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-rockchip.c')
-rw-r--r--drivers/pinctrl/pinctrl-rockchip.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index 51a7c24981d1..abff5895e81f 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -574,32 +574,45 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
574 574
575/* set the pin config settings for a specified pin */ 575/* set the pin config settings for a specified pin */
576static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, 576static int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
577 unsigned long config) 577 unsigned long *configs, unsigned num_configs)
578{ 578{
579 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 579 struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
580 struct rockchip_pin_bank *bank = pin_to_bank(info, pin); 580 struct rockchip_pin_bank *bank = pin_to_bank(info, pin);
581 enum pin_config_param param = pinconf_to_config_param(config); 581 enum pin_config_param param;
582 u16 arg = pinconf_to_config_argument(config); 582 u16 arg;
583 583 int i;
584 switch (param) { 584 int rc;
585 case PIN_CONFIG_BIAS_DISABLE: 585
586 return rockchip_set_pull(bank, pin - bank->pin_base, param); 586 for (i = 0; i < num_configs; i++) {
587 break; 587 param = pinconf_to_config_param(configs[i]);
588 case PIN_CONFIG_BIAS_PULL_UP: 588 arg = pinconf_to_config_argument(configs[i]);
589 case PIN_CONFIG_BIAS_PULL_DOWN: 589
590 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 590 switch (param) {
591 if (!rockchip_pinconf_pull_valid(info->ctrl, param)) 591 case PIN_CONFIG_BIAS_DISABLE:
592 rc = rockchip_set_pull(bank, pin - bank->pin_base,
593 param);
594 if (rc)
595 return rc;
596 break;
597 case PIN_CONFIG_BIAS_PULL_UP:
598 case PIN_CONFIG_BIAS_PULL_DOWN:
599 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
600 if (!rockchip_pinconf_pull_valid(info->ctrl, param))
601 return -ENOTSUPP;
602
603 if (!arg)
604 return -EINVAL;
605
606 rc = rockchip_set_pull(bank, pin - bank->pin_base,
607 param);
608 if (rc)
609 return rc;
610 break;
611 default:
592 return -ENOTSUPP; 612 return -ENOTSUPP;
593 613 break;
594 if (!arg) 614 }
595 return -EINVAL; 615 } /* for each config */
596
597 return rockchip_set_pull(bank, pin - bank->pin_base, param);
598 break;
599 default:
600 return -ENOTSUPP;
601 break;
602 }
603 616
604 return 0; 617 return 0;
605} 618}