Merge tag 'u-boot-atmel-fixes-2021.01-b' of https://gitlab.denx.de/u-boot/custodians...
[platform/kernel/u-boot.git] / drivers / pinctrl / pinctrl-stmfx.c
index 1d326ec..a62be44 100644 (file)
@@ -343,8 +343,8 @@ static int stmfx_pinctrl_get_pins_count(struct udevice *dev)
 }
 
 /*
- * STMFX pins[15:0] are called "gpio[15:0]"
- * and STMFX pins[23:16] are called "agpio[7:0]"
+ * STMFX pins[15:0] are called "stmfx_gpio[15:0]"
+ * and STMFX pins[23:16] are called "stmfx_agpio[7:0]"
  */
 #define MAX_PIN_NAME_LEN 7
 static char pin_name[MAX_PIN_NAME_LEN];
@@ -352,12 +352,40 @@ static const char *stmfx_pinctrl_get_pin_name(struct udevice *dev,
                                              unsigned int selector)
 {
        if (selector < STMFX_MAX_GPIO)
-               snprintf(pin_name, MAX_PIN_NAME_LEN, "gpio%u", selector);
+               snprintf(pin_name, MAX_PIN_NAME_LEN, "stmfx_gpio%u", selector);
        else
-               snprintf(pin_name, MAX_PIN_NAME_LEN, "agpio%u", selector - 16);
+               snprintf(pin_name, MAX_PIN_NAME_LEN, "stmfx_agpio%u", selector - 16);
        return pin_name;
 }
 
+static const char *stmfx_pinctrl_get_pin_conf(struct udevice *dev,
+                                             unsigned int pin, int func)
+{
+       int pupd, type;
+
+       type = stmfx_conf_get_type(dev, pin);
+       if (type < 0)
+               return "";
+
+       if (func == GPIOF_OUTPUT) {
+               if (type)
+                       return "drive-open-drain";
+               else
+                       return ""; /* default: push-pull*/
+       }
+       if (!type)
+               return ""; /* default: bias-disable*/
+
+       pupd = stmfx_conf_get_pupd(dev, pin);
+       if (pupd < 0)
+               return "";
+
+       if (pupd)
+               return "bias-pull-up";
+       else
+               return "bias-pull-down";
+}
+
 static int stmfx_pinctrl_get_pin_muxing(struct udevice *dev,
                                        unsigned int selector,
                                        char *buf, int size)
@@ -369,7 +397,9 @@ static int stmfx_pinctrl_get_pin_muxing(struct udevice *dev,
        if (func < 0)
                return func;
 
-       snprintf(buf, size, "%s", func == GPIOF_INPUT ? "input" : "output");
+       snprintf(buf, size, "%s ", func == GPIOF_INPUT ? "input" : "output");
+
+       strncat(buf, stmfx_pinctrl_get_pin_conf(dev, selector, func), size);
 
        return 0;
 }
@@ -378,8 +408,11 @@ static int stmfx_pinctrl_bind(struct udevice *dev)
 {
        struct stmfx_pinctrl *plat = dev_get_platdata(dev);
 
+       /* subnode name is not explicit: use father name */
+       device_set_name(dev, dev->parent->name);
+
        return device_bind_driver_to_node(dev->parent,
-                                         "stmfx-gpio", "stmfx-gpio",
+                                         "stmfx-gpio", dev->parent->name,
                                          dev_ofnode(dev), &plat->gpio);
 };