pinctrl: merrifield: Fix open-drain pin mode configuration
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 5 Jun 2023 15:45:08 +0000 (18:45 +0300)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 6 Jun 2023 13:07:33 +0000 (16:07 +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-merrifield.c

index 365c391..f1d0b75 100644 (file)
@@ -710,6 +710,11 @@ static int mrfld_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;
@@ -791,10 +796,14 @@ static int mrfld_config_set_pin(struct mrfld_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:
@@ -826,6 +835,7 @@ static int mrfld_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 = mrfld_config_set_pin(mp, pin, configs[i]);