aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-single.c
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@linaro.org>2013-03-13 04:01:26 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-03-13 14:50:19 -0400
commit7cba5b3f5fdfcb0be4f15b54a1f3a7455f973c16 (patch)
treeeea16f4109c72e0cd5ecf2c8c8b8472317393987 /drivers/pinctrl/pinctrl-single.c
parentee341a99de7386434a0d5cf4bc4329c3ab972a13 (diff)
pinctrl: single: correct argument for pinconf
pcs_pinconf_set() is always using "arg << shift" to configure two parameters case. But pcs_add_conf2() didn't remove shift for config argument. So correct it. Signed-off-by: Haojian Zhuang <haojian.zhuang@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-single.c')
-rw-r--r--drivers/pinctrl/pinctrl-single.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index e35dabd3135d..5f2d2bfd356e 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -623,8 +623,8 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev,
623{ 623{
624 struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev); 624 struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
625 struct pcs_function *func; 625 struct pcs_function *func;
626 unsigned offset = 0, shift = 0, arg = 0, i, data, ret; 626 unsigned offset = 0, shift = 0, i, data, ret;
627 u16 argument; 627 u16 arg;
628 628
629 ret = pcs_get_function(pctldev, pin, &func); 629 ret = pcs_get_function(pctldev, pin, &func);
630 if (ret) 630 if (ret)
@@ -634,14 +634,13 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev,
634 if (pinconf_to_config_param(config) == func->conf[i].param) { 634 if (pinconf_to_config_param(config) == func->conf[i].param) {
635 offset = pin * (pcs->width / BITS_PER_BYTE); 635 offset = pin * (pcs->width / BITS_PER_BYTE);
636 data = pcs->read(pcs->base + offset); 636 data = pcs->read(pcs->base + offset);
637 argument = pinconf_to_config_argument(config); 637 arg = pinconf_to_config_argument(config);
638 switch (func->conf[i].param) { 638 switch (func->conf[i].param) {
639 /* 2 parameters */ 639 /* 2 parameters */
640 case PIN_CONFIG_INPUT_SCHMITT: 640 case PIN_CONFIG_INPUT_SCHMITT:
641 case PIN_CONFIG_DRIVE_STRENGTH: 641 case PIN_CONFIG_DRIVE_STRENGTH:
642 case PIN_CONFIG_SLEW_RATE: 642 case PIN_CONFIG_SLEW_RATE:
643 shift = ffs(func->conf[i].mask) - 1; 643 shift = ffs(func->conf[i].mask) - 1;
644 arg = pinconf_to_config_argument(config);
645 data &= ~func->conf[i].mask; 644 data &= ~func->conf[i].mask;
646 data |= (arg << shift) & func->conf[i].mask; 645 data |= (arg << shift) & func->conf[i].mask;
647 break; 646 break;
@@ -651,12 +650,12 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev,
651 break; 650 break;
652 case PIN_CONFIG_BIAS_PULL_DOWN: 651 case PIN_CONFIG_BIAS_PULL_DOWN:
653 case PIN_CONFIG_BIAS_PULL_UP: 652 case PIN_CONFIG_BIAS_PULL_UP:
654 if (argument) 653 if (arg)
655 pcs_pinconf_clear_bias(pctldev, pin); 654 pcs_pinconf_clear_bias(pctldev, pin);
656 /* fall through */ 655 /* fall through */
657 case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 656 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
658 data &= ~func->conf[i].mask; 657 data &= ~func->conf[i].mask;
659 if (argument) 658 if (arg)
660 data |= func->conf[i].enable; 659 data |= func->conf[i].enable;
661 else 660 else
662 data |= func->conf[i].disable; 661 data |= func->conf[i].disable;
@@ -965,7 +964,7 @@ static void pcs_add_conf2(struct pcs_device *pcs, struct device_node *np,
965 const char *name, enum pin_config_param param, 964 const char *name, enum pin_config_param param,
966 struct pcs_conf_vals **conf, unsigned long **settings) 965 struct pcs_conf_vals **conf, unsigned long **settings)
967{ 966{
968 unsigned value[2]; 967 unsigned value[2], shift;
969 int ret; 968 int ret;
970 969
971 ret = of_property_read_u32_array(np, name, value, 2); 970 ret = of_property_read_u32_array(np, name, value, 2);
@@ -973,9 +972,10 @@ static void pcs_add_conf2(struct pcs_device *pcs, struct device_node *np,
973 return; 972 return;
974 /* set value & mask */ 973 /* set value & mask */
975 value[0] &= value[1]; 974 value[0] &= value[1];
975 shift = ffs(value[1]) - 1;
976 /* skip enable & disable */ 976 /* skip enable & disable */
977 add_config(conf, param, value[0], 0, 0, value[1]); 977 add_config(conf, param, value[0], 0, 0, value[1]);
978 add_setting(settings, param, value[0]); 978 add_setting(settings, param, value[0] >> shift);
979} 979}
980 980
981/* add pinconf setting with 4 parameters */ 981/* add pinconf setting with 4 parameters */