pinctrl: mediatek: rewrite mtk_pinconf_set and related functions
authorSam Shih <sam.shih@mediatek.com>
Thu, 21 Apr 2022 06:23:51 +0000 (14:23 +0800)
committerTom Rini <trini@konsulko.com>
Thu, 5 May 2022 13:29:57 +0000 (09:29 -0400)
There are many pins in a SoCs, and different pin may belong
to different "io_type", For example: some pins of MT7622 belongs
to "io_type A", the other belongs to "io_type B", and pinctrl "V0"
means handle pinconf via "io_type A" or "io_type B", so SoCs that
contain "io_type A" and "io_type B" pins, use "V0" in pinctrl driver.

This patch separates the implementation of register operations
(e.g: "bias-pull-up/down", "driving" and "input-enable") into
different functions, and lets the original V0/V1
ops to call the new functions.

Signed-off-by: Sam Shih <sam.shih@mediatek.com>
drivers/pinctrl/mediatek/pinctrl-mtk-common.c
drivers/pinctrl/mediatek/pinctrl-mtk-common.h

index a9cedda..4ae3286 100644 (file)
@@ -308,13 +308,31 @@ static const struct pinconf_param mtk_conf_params[] = {
        { "drive-strength", PIN_CONFIG_DRIVE_STRENGTH, 0 },
 };
 
+int mtk_pinconf_bias_set_v0(struct udevice *dev, u32 pin, bool disable,
+                           bool pullup, u32 val)
+{
+       return mtk_pinconf_bias_set_pu_pd(dev, pin, disable, pullup, val);
+}
 
-int mtk_pinconf_bias_set_v0(struct udevice *dev, u32 pin, u32 arg, u32 val)
+int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, bool disable,
+                           bool pullup, u32 val)
 {
-       int err, disable, pullup;
+       int err;
 
-       disable = (arg == PIN_CONFIG_BIAS_DISABLE);
-       pullup = (arg == PIN_CONFIG_BIAS_PULL_UP);
+       /* try pupd_r1_r0 if pullen_pullsel return error */
+       err = mtk_pinconf_bias_set_pullen_pullsel(dev, pin, disable, pullup,
+                                                 val);
+       if (err)
+               return mtk_pinconf_bias_set_pupd_r1_r0(dev, pin, disable,
+                                                      pullup, val);
+
+       return err;
+}
+
+int mtk_pinconf_bias_set_pu_pd(struct udevice *dev, u32 pin, bool disable,
+                              bool pullup, u32 val)
+{
+       int err;
 
        if (disable) {
                err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PU, 0);
@@ -323,7 +341,6 @@ int mtk_pinconf_bias_set_v0(struct udevice *dev, u32 pin, u32 arg, u32 val)
                err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PD, 0);
                if (err)
                        return err;
-
        } else {
                err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PU, pullup);
                if (err)
@@ -336,14 +353,10 @@ int mtk_pinconf_bias_set_v0(struct udevice *dev, u32 pin, u32 arg, u32 val)
        return 0;
 }
 
-int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, u32 arg, u32 val)
+int mtk_pinconf_bias_set_pullen_pullsel(struct udevice *dev, u32 pin,
+                                       bool disable, bool pullup, u32 val)
 {
-       int err, disable, pullup, r0, r1;
-
-       disable = (arg == PIN_CONFIG_BIAS_DISABLE);
-       pullup = (arg == PIN_CONFIG_BIAS_PULL_UP);
-       r0 = !!(val & 1);
-       r1 = !!(val & 2);
+       int err;
 
        if (disable) {
                err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PULLEN, 0);
@@ -359,16 +372,53 @@ int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, u32 arg, u32 val)
                        return err;
        }
 
-       /* Also set PUPD/R0/R1 if the pin has them */
-       err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PUPD, !pullup);
-       if (err != -EINVAL) {
-               mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_R0, r0);
-               mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_R1, r1);
+       return 0;
+}
+
+int mtk_pinconf_bias_set_pupd_r1_r0(struct udevice *dev, u32 pin, bool disable,
+                                   bool pullup, u32 val)
+{
+       int err, r0, r1;
+
+       r0 = !!(val & 1);
+       r1 = !!(val & 2);
+
+       if (disable) {
+               pullup = 0;
+               r0 = 0;
+               r1 = 0;
        }
 
+       /* MTK HW PUPD bit: 1 for pull-down, 0 for pull-up */
+       err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_PUPD, !pullup);
+       if (err)
+               return err;
+
+       /* Also set PUPD/R0/R1 if the pin has them */
+       mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_R0, r0);
+       mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_R1, r1);
+
        return 0;
 }
 
+int mtk_pinconf_bias_set(struct udevice *dev, u32 pin, u32 arg, u32 val)
+{
+       int err;
+       struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
+       int rev = priv->soc->rev;
+       bool disable, pullup;
+
+       disable = (arg == PIN_CONFIG_BIAS_DISABLE);
+       pullup = (arg == PIN_CONFIG_BIAS_PULL_UP);
+
+       if (rev == MTK_PINCTRL_V0)
+               err = mtk_pinconf_bias_set_v0(dev, pin, disable, pullup, val);
+       else
+               err = mtk_pinconf_bias_set_v1(dev, pin, disable, pullup, val);
+
+       return err;
+}
+
 int mtk_pinconf_input_enable_v1(struct udevice *dev, u32 pin, u32 arg)
 {
        int err;
@@ -379,6 +429,18 @@ int mtk_pinconf_input_enable_v1(struct udevice *dev, u32 pin, u32 arg)
        err = mtk_hw_set_value(dev, pin, PINCTRL_PIN_REG_DIR, 0);
        if (err)
                return err;
+
+       return 0;
+}
+
+int mtk_pinconf_input_enable(struct udevice *dev, u32 pin, u32 arg)
+{
+       struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
+       int rev = priv->soc->rev;
+
+       if (rev == MTK_PINCTRL_V1)
+               return mtk_pinconf_input_enable_v1(dev, pin, arg);
+
        return 0;
 }
 
@@ -410,7 +472,6 @@ int mtk_pinconf_drive_set_v0(struct udevice *dev, u32 pin, u32 arg)
        return 0;
 }
 
-
 int mtk_pinconf_drive_set_v1(struct udevice *dev, u32 pin, u32 arg)
 {
        struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
@@ -429,21 +490,30 @@ int mtk_pinconf_drive_set_v1(struct udevice *dev, u32 pin, u32 arg)
        return 0;
 }
 
+int mtk_pinconf_drive_set(struct udevice *dev, u32 pin, u32 arg)
+{
+       int err;
+       struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
+       int rev = priv->soc->rev;
+
+       if (rev == MTK_PINCTRL_V0)
+               err = mtk_pinconf_drive_set_v0(dev, pin, arg);
+       else
+               err = mtk_pinconf_drive_set_v1(dev, pin, arg);
+
+       return err;
+}
+
 static int mtk_pinconf_set(struct udevice *dev, unsigned int pin,
                           unsigned int param, unsigned int arg)
 {
        int err = 0;
-       struct mtk_pinctrl_priv *priv = dev_get_priv(dev);
-       int rev = priv->soc->rev;
 
        switch (param) {
        case PIN_CONFIG_BIAS_DISABLE:
        case PIN_CONFIG_BIAS_PULL_UP:
        case PIN_CONFIG_BIAS_PULL_DOWN:
-               if (rev == MTK_PINCTRL_V0)
-                       err = mtk_pinconf_bias_set_v0(dev, pin, param, arg);
-               else
-                       err = mtk_pinconf_bias_set_v1(dev, pin, param, arg);
+               err = mtk_pinconf_bias_set(dev, pin, param, arg);
                if (err)
                        goto err;
                break;
@@ -456,8 +526,7 @@ static int mtk_pinconf_set(struct udevice *dev, unsigned int pin,
                        goto err;
                break;
        case PIN_CONFIG_INPUT_ENABLE:
-               if (rev == MTK_PINCTRL_V1)
-                       err = mtk_pinconf_input_enable_v1(dev, pin, param);
+               err = mtk_pinconf_input_enable(dev, pin, param);
                if (err)
                        goto err;
                break;
@@ -486,10 +555,7 @@ static int mtk_pinconf_set(struct udevice *dev, unsigned int pin,
                        goto err;
                break;
        case PIN_CONFIG_DRIVE_STRENGTH:
-               if (rev == MTK_PINCTRL_V0)
-                       err = mtk_pinconf_drive_set_v0(dev, pin, arg);
-               else
-                       err = mtk_pinconf_drive_set_v1(dev, pin, arg);
+               err = mtk_pinconf_drive_set(dev, pin, arg);
                if (err)
                        goto err;
                break;
index 5e51a9a..735fb6f 100644 (file)
@@ -192,4 +192,22 @@ void mtk_rmw(struct udevice *dev, u32 reg, u32 mask, u32 set);
 int mtk_pinctrl_common_probe(struct udevice *dev,
                             struct mtk_pinctrl_soc *soc);
 
+#if CONFIG_IS_ENABLED(PINCONF)
+
+int mtk_pinconf_bias_set_pu_pd(struct udevice *dev, u32 pin, bool disable,
+                              bool pullup, u32 val);
+int mtk_pinconf_bias_set_pullen_pullsel(struct udevice *dev, u32 pin,
+                                       bool disable, bool pullup, u32 val);
+int mtk_pinconf_bias_set_pupd_r1_r0(struct udevice *dev, u32 pin, bool disable,
+                                   bool pullup, u32 val);
+int mtk_pinconf_bias_set_v0(struct udevice *dev, u32 pin, bool disable,
+                           bool pullup, u32 val);
+int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, bool disable,
+                           bool pullup, u32 val);
+int mtk_pinconf_input_enable_v1(struct udevice *dev, u32 pin, u32 arg);
+int mtk_pinconf_drive_set_v0(struct udevice *dev, u32 pin, u32 arg);
+int mtk_pinconf_drive_set_v1(struct udevice *dev, u32 pin, u32 arg);
+
+#endif
+
 #endif /* __PINCTRL_MEDIATEK_H__ */