rework bias enable/disable part to prepare drive-strength integration

Signed-off-by: Guillaume La Roque <glaro...@baylibre.com>
---
 drivers/pinctrl/meson/pinctrl-meson.c | 79 ++++++++++++++++-----------
 1 file changed, 48 insertions(+), 31 deletions(-)

diff --git a/drivers/pinctrl/meson/pinctrl-meson.c 
b/drivers/pinctrl/meson/pinctrl-meson.c
index 96a4a72708e4..a216a7537564 100644
--- a/drivers/pinctrl/meson/pinctrl-meson.c
+++ b/drivers/pinctrl/meson/pinctrl-meson.c
@@ -174,13 +174,57 @@ int meson_pmx_get_groups(struct pinctrl_dev *pcdev, 
unsigned selector,
        return 0;
 }
 
+static int meson_pinconf_disable_bias(struct meson_pinctrl *pc,
+                                     unsigned int pin)
+{
+       struct meson_bank *bank;
+       unsigned int reg, bit = 0;
+       int ret;
+
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+       meson_calc_reg_and_bit(bank, pin, REG_PULLEN, &reg, &bit);
+       ret = regmap_update_bits(pc->reg_pullen, reg, BIT(bit), 0);
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
+static int meson_pinconf_enable_bias(struct meson_pinctrl *pc, unsigned int 
pin,
+                                    bool pull_up)
+{
+       struct meson_bank *bank;
+       unsigned int reg, bit, val = 0;
+       int ret;
+
+       ret = meson_get_bank(pc, pin, &bank);
+       if (ret)
+               return ret;
+
+       meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
+       if (pull_up)
+               val = BIT(bit);
+
+       ret = regmap_update_bits(pc->reg_pull, reg, BIT(bit), val);
+       if (ret)
+               return ret;
+
+       meson_calc_reg_and_bit(bank, pin, REG_PULLEN, &reg, &bit);
+       ret = regmap_update_bits(pc->reg_pullen, reg, BIT(bit), BIT(bit));
+       if (ret)
+               return ret;
+
+       return 0;
+}
+
 static int meson_pinconf_set(struct pinctrl_dev *pcdev, unsigned int pin,
                             unsigned long *configs, unsigned num_configs)
 {
        struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
        struct meson_bank *bank;
        enum pin_config_param param;
-       unsigned int reg, bit;
        int i, ret;
 
        ret = meson_get_bank(pc, pin, &bank);
@@ -192,44 +236,17 @@ static int meson_pinconf_set(struct pinctrl_dev *pcdev, 
unsigned int pin,
 
                switch (param) {
                case PIN_CONFIG_BIAS_DISABLE:
-                       dev_dbg(pc->dev, "pin %u: disable bias\n", pin);
-
-                       meson_calc_reg_and_bit(bank, pin, REG_PULLEN, &reg,
-                                              &bit);
-                       ret = regmap_update_bits(pc->reg_pullen, reg,
-                                                BIT(bit), 0);
+                       ret = meson_pinconf_disable_bias(pc, pin);
                        if (ret)
                                return ret;
                        break;
                case PIN_CONFIG_BIAS_PULL_UP:
-                       dev_dbg(pc->dev, "pin %u: enable pull-up\n", pin);
-
-                       meson_calc_reg_and_bit(bank, pin, REG_PULLEN,
-                                              &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pullen, reg,
-                                                BIT(bit), BIT(bit));
-                       if (ret)
-                               return ret;
-
-                       meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pull, reg,
-                                                BIT(bit), BIT(bit));
+                       ret = meson_pinconf_enable_bias(pc, pin, 1);
                        if (ret)
                                return ret;
                        break;
                case PIN_CONFIG_BIAS_PULL_DOWN:
-                       dev_dbg(pc->dev, "pin %u: enable pull-down\n", pin);
-
-                       meson_calc_reg_and_bit(bank, pin, REG_PULLEN,
-                                              &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pullen, reg,
-                                                BIT(bit), BIT(bit));
-                       if (ret)
-                               return ret;
-
-                       meson_calc_reg_and_bit(bank, pin, REG_PULL, &reg, &bit);
-                       ret = regmap_update_bits(pc->reg_pull, reg,
-                                                BIT(bit), 0);
+                       ret = meson_pinconf_enable_bias(pc, pin, 0);
                        if (ret)
                                return ret;
                        break;
-- 
2.17.1

Reply via email to