| From 55a9968c7e139209a9e93d4ca4321731bea5fc95 Mon Sep 17 00:00:00 2001 |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| Date: Fri, 24 Sep 2021 01:46:40 +0300 |
| Subject: gpio: pca953x: Improve bias setting |
| |
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> |
| |
| commit 55a9968c7e139209a9e93d4ca4321731bea5fc95 upstream. |
| |
| The commit 15add06841a3 ("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: 15add06841a3 ("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 | 16 +++++++++------- |
| 1 file changed, 9 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/gpio/gpio-pca953x.c |
| +++ b/drivers/gpio/gpio-pca953x.c |
| @@ -558,21 +558,21 @@ static int pca953x_gpio_set_pull_up_down |
| |
| 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); |
| @@ -586,7 +586,9 @@ static int pca953x_gpio_set_config(struc |
| |
| 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; |