pinctrl: moorefield: Fix open-drain pin mode configuration
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 5 Jun 2023 15:45:22 +0000 (18:45 +0300)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 6 Jun 2023 13:08:20 +0000 (16:08 +0300)
Currently the pin may not be configured as open-drain in some
cases because the argument may be 0 for the boolean types of
the pin configurations. Fix this by ignoring the argument.

With that, allow to actually restore pin to the push-pull mode.

Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
drivers/pinctrl/intel/pinctrl-moorefield.c

index 3c9a848..7656a5e 100644 (file)
@@ -661,6 +661,11 @@ static int mofld_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
 
                break;
 
+       case PIN_CONFIG_DRIVE_PUSH_PULL:
+               if (value & BUFCFG_OD_EN)
+                       return -EINVAL;
+               break;
+
        case PIN_CONFIG_DRIVE_OPEN_DRAIN:
                if (!(value & BUFCFG_OD_EN))
                        return -EINVAL;
@@ -734,10 +739,14 @@ static int mofld_config_set_pin(struct mofld_pinctrl *mp, unsigned int pin,
 
                break;
 
+       case PIN_CONFIG_DRIVE_PUSH_PULL:
+               mask |= BUFCFG_OD_EN;
+               bits &= ~BUFCFG_OD_EN;
+               break;
+
        case PIN_CONFIG_DRIVE_OPEN_DRAIN:
                mask |= BUFCFG_OD_EN;
-               if (arg)
-                       bits |= BUFCFG_OD_EN;
+               bits |= BUFCFG_OD_EN;
                break;
 
        case PIN_CONFIG_SLEW_RATE:
@@ -769,6 +778,7 @@ static int mofld_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
                case PIN_CONFIG_BIAS_DISABLE:
                case PIN_CONFIG_BIAS_PULL_UP:
                case PIN_CONFIG_BIAS_PULL_DOWN:
+               case PIN_CONFIG_DRIVE_PUSH_PULL:
                case PIN_CONFIG_DRIVE_OPEN_DRAIN:
                case PIN_CONFIG_SLEW_RATE:
                        ret = mofld_config_set_pin(mp, pin, configs[i]);