Prepare v2023.10
[platform/kernel/u-boot.git] / drivers / pinctrl / pinctrl_stm32.c
index a1f53a7..b06da50 100644 (file)
@@ -10,7 +10,6 @@
 #include <hwspinlock.h>
 #include <log.h>
 #include <malloc.h>
-#include <asm/arch/gpio.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <dm/device_compat.h>
@@ -20,6 +19,8 @@
 #include <linux/err.h>
 #include <linux/libfdt.h>
 
+#include "../gpio/stm32_gpio_priv.h"
+
 #define MAX_PINS_ONE_IP                        70
 #define MODE_BITS_MASK                 3
 #define OSPEED_MASK                    3
@@ -41,13 +42,12 @@ struct stm32_gpio_bank {
 #ifndef CONFIG_SPL_BUILD
 
 static char pin_name[PINNAME_SIZE];
-#define PINMUX_MODE_COUNT              5
-static const char * const pinmux_mode[PINMUX_MODE_COUNT] = {
-       "gpio input",
-       "gpio output",
-       "analog",
-       "unknown",
-       "alt function",
+static const char * const pinmux_mode[GPIOF_COUNT] = {
+       [GPIOF_INPUT] = "gpio input",
+       [GPIOF_OUTPUT] = "gpio output",
+       [GPIOF_UNUSED] = "analog",
+       [GPIOF_UNKNOWN] = "unknown",
+       [GPIOF_FUNC] = "alt function",
 };
 
 static const char * const pinmux_bias[] = {
@@ -56,11 +56,18 @@ static const char * const pinmux_bias[] = {
        [STM32_GPIO_PUPD_DOWN] = "pull-down",
 };
 
-static const char * const pinmux_input[] = {
+static const char * const pinmux_otype[] = {
        [STM32_GPIO_OTYPE_PP] = "push-pull",
        [STM32_GPIO_OTYPE_OD] = "open-drain",
 };
 
+static const char * const pinmux_speed[] = {
+       [STM32_GPIO_SPEED_2M] = "Low speed",
+       [STM32_GPIO_SPEED_25M] = "Medium speed",
+       [STM32_GPIO_SPEED_50M] = "High speed",
+       [STM32_GPIO_SPEED_100M] = "Very-high speed",
+};
+
 static int stm32_pinctrl_get_af(struct udevice *dev, unsigned int offset)
 {
        struct stm32_gpio_priv *priv = dev_get_priv(dev);
@@ -157,10 +164,7 @@ static struct udevice *stm32_pinctrl_get_gpio_dev(struct udevice *dev,
                         * we found the bank, convert pin selector to
                         * gpio bank index
                         */
-                       *idx = stm32_offset_to_index(gpio_bank->gpio_dev,
-                                                    selector - pin_count);
-                       if (IS_ERR_VALUE(*idx))
-                               return NULL;
+                       *idx = selector - pin_count;
 
                        return gpio_bank->gpio_dev;
                }
@@ -204,6 +208,7 @@ static int stm32_pinctrl_get_pin_muxing(struct udevice *dev,
        int af_num;
        unsigned int gpio_idx;
        u32 pupd, otype;
+       u8 speed;
 
        /* look up for the bank which owns the requested pin */
        gpio_dev = stm32_pinctrl_get_gpio_dev(dev, selector, &gpio_idx);
@@ -216,29 +221,28 @@ static int stm32_pinctrl_get_pin_muxing(struct udevice *dev,
                selector, gpio_idx, mode);
        priv = dev_get_priv(gpio_dev);
        pupd = (readl(&priv->regs->pupdr) >> (gpio_idx * 2)) & PUPD_MASK;
-
+       otype = (readl(&priv->regs->otyper) >> gpio_idx) & OTYPE_MSK;
+       speed = (readl(&priv->regs->ospeedr) >> gpio_idx * 2) & OSPEED_MASK;
 
        switch (mode) {
        case GPIOF_UNKNOWN:
-               /* should never happen */
-               return -EINVAL;
        case GPIOF_UNUSED:
                snprintf(buf, size, "%s", pinmux_mode[mode]);
                break;
        case GPIOF_FUNC:
                af_num = stm32_pinctrl_get_af(gpio_dev, gpio_idx);
-               snprintf(buf, size, "%s %d %s", pinmux_mode[mode], af_num,
-                        pinmux_bias[pupd]);
+               snprintf(buf, size, "%s %d %s %s %s", pinmux_mode[mode], af_num,
+                        pinmux_otype[otype], pinmux_bias[pupd],
+                        pinmux_speed[speed]);
                break;
        case GPIOF_OUTPUT:
-               snprintf(buf, size, "%s %s %s",
-                        pinmux_mode[mode], pinmux_bias[pupd],
-                        label ? label : "");
+               snprintf(buf, size, "%s %s %s %s %s",
+                        pinmux_mode[mode], pinmux_otype[otype],
+                        pinmux_bias[pupd], label ? label : "",
+                        pinmux_speed[speed]);
                break;
        case GPIOF_INPUT:
-               otype = (readl(&priv->regs->otyper) >> gpio_idx) & OTYPE_MSK;
-               snprintf(buf, size, "%s %s %s %s",
-                        pinmux_mode[mode], pinmux_input[otype],
+               snprintf(buf, size, "%s %s %s", pinmux_mode[mode],
                         pinmux_bias[pupd], label ? label : "");
                break;
        }
@@ -264,10 +268,12 @@ static int stm32_pinctrl_probe(struct udevice *dev)
        return 0;
 }
 
-static int stm32_gpio_config(struct gpio_desc *desc,
+static int stm32_gpio_config(ofnode node,
+                            struct gpio_desc *desc,
                             const struct stm32_gpio_ctl *ctl)
 {
        struct stm32_gpio_priv *priv = dev_get_priv(desc->dev);
+       struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(desc->dev);
        struct stm32_gpio_regs *regs = priv->regs;
        struct stm32_pinctrl_priv *ctrl_priv;
        int ret;
@@ -298,6 +304,8 @@ static int stm32_gpio_config(struct gpio_desc *desc,
        index = desc->offset;
        clrsetbits_le32(&regs->otyper, OTYPE_MSK << index, ctl->otype << index);
 
+       uc_priv->name[desc->offset] = strdup(ofnode_get_name(node));
+
        hwspinlock_unlock(&ctrl_priv->hws);
 
        return 0;
@@ -392,7 +400,7 @@ static int stm32_pinctrl_config(ofnode node)
                        if (rv)
                                return rv;
                        desc.offset = gpio_dsc.pin;
-                       rv = stm32_gpio_config(&desc, &gpio_ctl);
+                       rv = stm32_gpio_config(node, &desc, &gpio_ctl);
                        log_debug("rv = %d\n\n", rv);
                        if (rv)
                                return rv;
@@ -411,6 +419,9 @@ static int stm32_pinctrl_bind(struct udevice *dev)
        dev_for_each_subnode(node, dev) {
                dev_dbg(dev, "bind %s\n", ofnode_get_name(node));
 
+               if (!ofnode_is_enabled(node))
+                       continue;
+
                ofnode_get_property(node, "gpio-controller", &ret);
                if (ret < 0)
                        continue;
@@ -492,6 +503,7 @@ static const struct udevice_id stm32_pinctrl_ids[] = {
        { .compatible = "st,stm32h743-pinctrl" },
        { .compatible = "st,stm32mp157-pinctrl" },
        { .compatible = "st,stm32mp157-z-pinctrl" },
+       { .compatible = "st,stm32mp135-pinctrl" },
        { }
 };