pinctrl: stmfx: update pinconf settings
authorPatrick Delaunay <patrick.delaunay@st.com>
Tue, 30 Jul 2019 17:16:11 +0000 (19:16 +0200)
committerPatrice Chotard <patrice.chotard@st.com>
Tue, 27 Aug 2019 07:36:56 +0000 (09:36 +0200)
Alignment with kernel driver.

According to the following tab (coming from STMFX datasheet), updates
have to done in stmfx_pinctrl_conf_set function:

-"type" has to be set when "bias" is configured as "pull-up or pull-down"
-PIN_CONFIG_DRIVE_PUSH_PULL should only be used when gpio is configured as
 output. There is so no need to check direction.

  DIR | TYPE | PUPD | MFX GPIO configuration
  ----|------|------|---------------------------------------------------
  1   | 1    | 1    | OUTPUT open drain with internal pull-up resistor
  ----|------|------|---------------------------------------------------
  1   | 1    | 0    | OUTPUT open drain with internal pull-down resistor
  ----|------|------|---------------------------------------------------
  1   | 0    | 0/1  | OUTPUT push pull no pull
  ----|------|------|---------------------------------------------------
  0   | 1    | 1    | INPUT with internal pull-up resistor
  ----|------|------|---------------------------------------------------
  0   | 1    | 0    | INPUT with internal pull-down resistor
  ----|------|------|---------------------------------------------------
  0   | 0    | 1    | INPUT floating
  ----|------|------|---------------------------------------------------
  0   | 0    | 0    | analog (GPIO not used, default setting)

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
drivers/pinctrl/pinctrl-stmfx.c

index 5431df9..0b5a043 100644 (file)
@@ -231,23 +231,23 @@ static int stmfx_pinctrl_conf_set(struct udevice *dev, unsigned int pin,
        switch (param) {
        case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
        case PIN_CONFIG_BIAS_DISABLE:
+       case PIN_CONFIG_DRIVE_PUSH_PULL:
+               ret = stmfx_pinctrl_set_type(dev, pin, 0);
+               break;
        case PIN_CONFIG_BIAS_PULL_DOWN:
+               ret = stmfx_pinctrl_set_type(dev, pin, 1);
+               if (ret)
+                       return ret;
                ret = stmfx_pinctrl_set_pupd(dev, pin, 0);
                break;
        case PIN_CONFIG_BIAS_PULL_UP:
+               ret = stmfx_pinctrl_set_type(dev, pin, 1);
+               if (ret)
+                       return ret;
                ret = stmfx_pinctrl_set_pupd(dev, pin, 1);
                break;
        case PIN_CONFIG_DRIVE_OPEN_DRAIN:
-               if (dir == GPIOF_OUTPUT)
-                       ret = stmfx_pinctrl_set_type(dev, pin, 1);
-               else
-                       ret = stmfx_pinctrl_set_type(dev, pin, 0);
-               break;
-       case PIN_CONFIG_DRIVE_PUSH_PULL:
-               if (dir == GPIOF_OUTPUT)
-                       ret = stmfx_pinctrl_set_type(dev, pin, 0);
-               else
-                       ret = stmfx_pinctrl_set_type(dev, pin, 1);
+               ret = stmfx_pinctrl_set_type(dev, pin, 1);
                break;
        case PIN_CONFIG_OUTPUT:
                ret = stmfx_gpio_direction_output(plat->gpio, pin, arg);