pinctrl: sunxi: Handle bias disable
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Tue, 11 Oct 2016 15:46:01 +0000 (17:46 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 24 Oct 2016 14:30:14 +0000 (16:30 +0200)
So far, putting NO_PULL in allwinner,pull was ignored, behaving like if
that property was not there at all.

Obviously, this is not the right thing to do, and in that case, we really
need to just disable the bias.

Acked-by: Chen-Yu Tsai <wens@csie.org>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/sunxi/pinctrl-sunxi.c

index 62a9d012b35f5990e149691021f0536444c47cf3..c44bf1320e0884957e755d336499ab7c3280b84c 100644 (file)
@@ -165,6 +165,8 @@ static int sunxi_pctrl_parse_bias_prop(struct device_node *node)
                return -EINVAL;
 
        switch (val) {
+       case SUN4I_PINCTRL_NO_PULL:
+               return PIN_CONFIG_BIAS_DISABLE;
        case SUN4I_PINCTRL_PULL_UP:
                return PIN_CONFIG_BIAS_PULL_UP;
        case SUN4I_PINCTRL_PULL_DOWN:
@@ -401,6 +403,12 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
                                | dlevel << sunxi_dlevel_offset(pin),
                                pctl->membase + sunxi_dlevel_reg(pin));
                        break;
+               case PIN_CONFIG_BIAS_DISABLE:
+                       val = readl(pctl->membase + sunxi_pull_reg(pin));
+                       mask = PULL_PINS_MASK << sunxi_pull_offset(pin);
+                       writel((val & ~mask),
+                              pctl->membase + sunxi_pull_reg(pin));
+                       break;
                case PIN_CONFIG_BIAS_PULL_UP:
                        val = readl(pctl->membase + sunxi_pull_reg(pin));
                        mask = PULL_PINS_MASK << sunxi_pull_offset(pin);