Add functionality to be able to print pin bias settings along with the
pinmux setting.

This can be useful to debug why pins might not be working correctly.

Signed-off-by: David Lechner <[email protected]>
---
 drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 96 ++++++++++++++++++++++++++-
 drivers/pinctrl/mediatek/pinctrl-mtk-common.h |  4 ++
 2 files changed, 98 insertions(+), 2 deletions(-)

diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c 
b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 1028b8a93f5..ef4acc946a8 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -237,9 +237,39 @@ static int mtk_get_pin_io_type(struct udevice *dev, int 
pin,
        io_type->bias_set = priv->soc->io_type[io_n].bias_set;
        io_type->drive_set = priv->soc->io_type[io_n].drive_set;
        io_type->input_enable = priv->soc->io_type[io_n].input_enable;
+       io_type->get_pinconf = priv->soc->io_type[io_n].get_pinconf;
 
        return 0;
 }
+
+static int mtk_pinconf_get(struct udevice *dev, u32 pin, char *buf, size_t 
size)
+{
+       struct mtk_io_type_desc io_type;
+       int err, pos = 0;
+
+       if (!mtk_get_pin_io_type(dev, pin, &io_type)) {
+               pos += snprintf(buf + pos, size - pos, " (%s)", io_type.name);
+               if (pos >= size)
+                       return pos;
+
+               if (io_type.get_pinconf) {
+                       err = io_type.get_pinconf(dev, pin, buf + pos, size - 
pos);
+                       if (err < 0)
+                               return err;
+
+                       pos += err;
+                       if (pos >= size)
+                               return pos;
+               }
+       }
+
+       return pos;
+}
+#else
+static int mtk_pinconf_get(struct udevice *dev, u32 pin, char *buf, size_t 
size)
+{
+       return 0;
+}
 #endif
 
 static int mtk_get_groups_count(struct udevice *dev)
@@ -270,12 +300,22 @@ static int mtk_get_pins_count(struct udevice *dev)
 static int mtk_get_pin_muxing(struct udevice *dev, unsigned int selector,
                              char *buf, int size)
 {
-       int val, err;
+       int val, err, pos;
+
        err = mtk_hw_get_value(dev, selector, PINCTRL_PIN_REG_MODE, &val);
        if (err)
                return err;
 
-       snprintf(buf, size, "Aux Func.%d", val);
+       pos = snprintf(buf, size, "Aux Func.%d", val);
+       if (pos >= size)
+               return 0;
+
+       if (CONFIG_IS_ENABLED(PINCONF)) {
+               err = mtk_pinconf_get(dev, selector, buf + pos, size - pos);
+               if (err < 0)
+                       return err;
+       }
+
        return 0;
 }
 
@@ -670,6 +710,58 @@ static int mtk_pinconf_group_set(struct udevice *dev,
 
        return 0;
 }
+
+int mtk_pinconf_get_pu_pd(struct udevice *dev, u32 pin, char *buf, size_t size)
+{
+       int err, pu, pd;
+
+       err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_PU, &pu);
+       if (err)
+               return err;
+
+       err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_PD, &pd);
+       if (err)
+               return err;
+
+       return snprintf(buf, size, " PU:%d PD:%d", pu, pd);
+}
+
+int mtk_pinconf_get_pupd_r1_r0(struct udevice *dev, u32 pin, char *buf, size_t 
size)
+{
+       int err, r0, r1, pupd;
+
+       err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_PUPD, &pupd);
+       if (err)
+               return err;
+
+       err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_R1, &r1);
+       if (err)
+               return err;
+
+       err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_R0, &r0);
+       if (err)
+               return err;
+
+       return snprintf(buf, size, " PUPD:%d R1:%d R0:%d", pupd, r1, r0);
+}
+
+int mtk_pinconf_get_pu_pd_rsel(struct udevice *dev, u32 pin, char *buf, size_t 
size)
+{
+       int pos, err, rsel;
+
+       pos = mtk_pinconf_get_pu_pd(dev, pin, buf, size);
+       if (pos < 0)
+               return pos;
+
+       if (pos >= size)
+               return pos;
+
+       err = mtk_hw_get_value(dev, pin, PINCTRL_PIN_REG_RSEL, &rsel);
+       if (err)
+               return err;
+
+       return pos + snprintf(buf + pos, size - pos, " RSEL:%d", rsel);
+}
 #endif
 
 static int mtk_pinctrl_pinmux_property_set(struct udevice *dev, u32 
pinmux_group)
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h 
b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
index 1215fb7094b..bd17964090a 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.h
@@ -204,6 +204,7 @@ struct mtk_io_type_desc {
                        bool pullup, u32 val);
        int (*drive_set)(struct udevice *dev, u32 pin, u32 arg);
        int (*input_enable)(struct udevice *dev, u32 pin, u32 arg);
+       int (*get_pinconf)(struct udevice *dev, u32 pin, char *buf, size_t 
size);
 #endif
 };
 
@@ -263,6 +264,9 @@ int mtk_pinconf_bias_set_v1(struct udevice *dev, u32 pin, 
bool disable,
 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);
+int mtk_pinconf_get_pu_pd(struct udevice *dev, u32 pin, char *buf, size_t 
size);
+int mtk_pinconf_get_pupd_r1_r0(struct udevice *dev, u32 pin, char *buf, size_t 
size);
+int mtk_pinconf_get_pu_pd_rsel(struct udevice *dev, u32 pin, char *buf, size_t 
size);
 
 #endif
 

-- 
2.43.0

Reply via email to