]> git.baikalelectronics.ru Git - kernel.git/commitdiff
gpio: pca953x: Improve bias setting
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 23 Sep 2021 22:46:40 +0000 (01:46 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Oct 2021 09:40:15 +0000 (11:40 +0200)
commit 55a9968c7e139209a9e93d4ca4321731bea5fc95 upstream.

The commit 09c8d214152b ("gpio: pca953x: add ->set_config implementation")
introduced support for bias setting. However this, due to being half-baked,
brought potential issues:
 - the turning bias via disabling makes the pin floating for a while;
 - once enabled, bias can't be disabled.

Fix all these by adding support for bias disabling and move the disabling
part under the corresponding conditional.

While at it, add support for default setting, since it's cheap to add.

Fixes: 09c8d214152b ("gpio: pca953x: add ->set_config implementation")
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpio/gpio-pca953x.c

index d9193ffa17a1e2497bff77ae2874dcdbd7413ed0..54da66d02b0e50f7b7b9a1ae8e0789280b9c10f2 100644 (file)
@@ -583,21 +583,21 @@ static int pca953x_gpio_set_pull_up_down(struct pca953x_chip *chip,
 
        mutex_lock(&chip->i2c_lock);
 
-       /* Disable pull-up/pull-down */
-       ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, 0);
-       if (ret)
-               goto exit;
-
        /* Configure pull-up/pull-down */
        if (config == PIN_CONFIG_BIAS_PULL_UP)
                ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, bit);
        else if (config == PIN_CONFIG_BIAS_PULL_DOWN)
                ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, 0);
+       else
+               ret = 0;
        if (ret)
                goto exit;
 
-       /* Enable pull-up/pull-down */
-       ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, bit);
+       /* Disable/Enable pull-up/pull-down */
+       if (config == PIN_CONFIG_BIAS_DISABLE)
+               ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, 0);
+       else
+               ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, bit);
 
 exit:
        mutex_unlock(&chip->i2c_lock);
@@ -611,7 +611,9 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
 
        switch (pinconf_to_config_param(config)) {
        case PIN_CONFIG_BIAS_PULL_UP:
+       case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
        case PIN_CONFIG_BIAS_PULL_DOWN:
+       case PIN_CONFIG_BIAS_DISABLE:
                return pca953x_gpio_set_pull_up_down(chip, offset, config);
        default:
                return -ENOTSUPP;