]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
pinctrl: abx500: allow to set pull up
authorPatrice Chotard <patrice.chotard@st.com>
Fri, 24 May 2013 12:06:30 +0000 (14:06 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Sun, 16 Jun 2013 09:56:51 +0000 (11:56 +0200)
On ABx500 chip family, all pins support only pull down except for
AB8540 which supports pull up/down on some pins.
Rework abx500_pin_config_set to be able to set pull up on
pins which support this feature.

Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-abx500.c

index 823e261b4d85d40f7a0d2893561e7685469dd119..363712bad7efd3019a0e9093f00bc75c59c82dfc 100644 (file)
@@ -725,7 +725,7 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev,
        struct pullud *pullud = pct->soc->pullud;
        struct gpio_chip *chip = &pct->chip;
        unsigned offset;
-       int ret;
+       int ret = 0;
        enum pin_config_param param = pinconf_to_config_param(config);
        enum pin_config_param argument = pinconf_to_config_argument(config);
 
@@ -763,6 +763,28 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev,
                                offset, argument ? 0 : 1);
                break;
 
+       case PIN_CONFIG_BIAS_PULL_UP:
+               /*
+                * if argument = 1 set the pull up
+                * else clear the pull up
+                */
+               ret = abx500_gpio_direction_input(chip, offset);
+               /*
+                * Some chips only support pull down, while some actually
+                * support both pull up and pull down. Such chips have
+                * a "pullud" range specified for the pins that support
+                * both features. If the pin is not within that range, do
+                * nothing
+                */
+               if (pullud &&
+                   pin >= pullud->first_pin &&
+                   pin <= pullud->last_pin) {
+                       ret = abx500_config_pull_updown(pct,
+                               pin,
+                               argument ? ABX500_GPIO_PULL_UP : ABX500_GPIO_PULL_NONE);
+               }
+               break;
+
        case PIN_CONFIG_OUTPUT:
                ret = abx500_gpio_direction_output(chip, offset, argument);