summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/vt8500
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/vt8500
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/vt8500')
-rw-r--r--drivers/pinctrl/vt8500/pinctrl-wmt.c54
1 files changed, 30 insertions, 24 deletions
diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c
index 0cc4335bc0f2..39aec0850810 100644
--- a/drivers/pinctrl/vt8500/pinctrl-wmt.c
+++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c
@@ -424,15 +424,16 @@ static int wmt_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
424} 424}
425 425
426static int wmt_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin, 426static int wmt_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
427 unsigned long config) 427 unsigned long *configs, unsigned num_configs)
428{ 428{
429 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev); 429 struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev);
430 enum pin_config_param param = pinconf_to_config_param(config); 430 enum pin_config_param param;
431 u16 arg = pinconf_to_config_argument(config); 431 u16 arg;
432 u32 bank = WMT_BANK_FROM_PIN(pin); 432 u32 bank = WMT_BANK_FROM_PIN(pin);
433 u32 bit = WMT_BIT_FROM_PIN(pin); 433 u32 bit = WMT_BIT_FROM_PIN(pin);
434 u32 reg_pull_en = data->banks[bank].reg_pull_en; 434 u32 reg_pull_en = data->banks[bank].reg_pull_en;
435 u32 reg_pull_cfg = data->banks[bank].reg_pull_cfg; 435 u32 reg_pull_cfg = data->banks[bank].reg_pull_cfg;
436 int i;
436 437
437 if ((reg_pull_en == NO_REG) || (reg_pull_cfg == NO_REG)) { 438 if ((reg_pull_en == NO_REG) || (reg_pull_cfg == NO_REG)) {
438 dev_err(data->dev, "bias functions not supported on pin %d\n", 439 dev_err(data->dev, "bias functions not supported on pin %d\n",
@@ -440,28 +441,33 @@ static int wmt_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
440 return -EINVAL; 441 return -EINVAL;
441 } 442 }
442 443
443 if ((param == PIN_CONFIG_BIAS_PULL_DOWN) || 444 for (i = 0; i < num_configs; i++) {
444 (param == PIN_CONFIG_BIAS_PULL_UP)) { 445 param = pinconf_to_config_param(configs[i]);
445 if (arg == 0) 446 arg = pinconf_to_config_argument(configs[i]);
446 param = PIN_CONFIG_BIAS_DISABLE;
447 }
448 447
449 switch (param) { 448 if ((param == PIN_CONFIG_BIAS_PULL_DOWN) ||
450 case PIN_CONFIG_BIAS_DISABLE: 449 (param == PIN_CONFIG_BIAS_PULL_UP)) {
451 wmt_clearbits(data, reg_pull_en, BIT(bit)); 450 if (arg == 0)
452 break; 451 param = PIN_CONFIG_BIAS_DISABLE;
453 case PIN_CONFIG_BIAS_PULL_DOWN: 452 }
454 wmt_clearbits(data, reg_pull_cfg, BIT(bit)); 453
455 wmt_setbits(data, reg_pull_en, BIT(bit)); 454 switch (param) {
456 break; 455 case PIN_CONFIG_BIAS_DISABLE:
457 case PIN_CONFIG_BIAS_PULL_UP: 456 wmt_clearbits(data, reg_pull_en, BIT(bit));
458 wmt_setbits(data, reg_pull_cfg, BIT(bit)); 457 break;
459 wmt_setbits(data, reg_pull_en, BIT(bit)); 458 case PIN_CONFIG_BIAS_PULL_DOWN:
460 break; 459 wmt_clearbits(data, reg_pull_cfg, BIT(bit));
461 default: 460 wmt_setbits(data, reg_pull_en, BIT(bit));
462 dev_err(data->dev, "unknown pinconf param\n"); 461 break;
463 return -EINVAL; 462 case PIN_CONFIG_BIAS_PULL_UP:
464 } 463 wmt_setbits(data, reg_pull_cfg, BIT(bit));
464 wmt_setbits(data, reg_pull_en, BIT(bit));
465 break;
466 default:
467 dev_err(data->dev, "unknown pinconf param\n");
468 return -EINVAL;
469 }
470 } /* for each config */
465 471
466 return 0; 472 return 0;
467} 473}