diff mbox series

[02/13] Input: adp5589-keys: fix adp5589_gpio_get_value()

Message ID 20241001-b4-dev-adp5589-fw-conversion-v1-2-fca0149dfc47@analog.com (mailing list archive)
State New
Headers show
Series Input: adp5589: refactor and platform_data removal | expand

Commit Message

Nuno Sa Oct. 1, 2024, 1:41 p.m. UTC
The adp5589 seems to have the same behavior as similar devices as
explained in

commit 910a9f5636f5 ("Input: adp5588-keys - get value from data out when
dir is out").

Basically, when the gpio is set as output we need to get the value from
ADP5589_GPO_DATA_OUT_A register instead of ADP5589_GPI_STATUS_A.

Fixes: 9d2e173644bb ("Input: ADP5589 - new driver for I2C Keypad Decoder and I/O Expander")
Signed-off-by: Nuno Sa <nuno.sa@analog.com>
---
 drivers/input/keyboard/adp5589-keys.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

Comments

Dmitry Torokhov Oct. 1, 2024, 2:50 p.m. UTC | #1
On Tue, Oct 01, 2024 at 03:41:33PM +0200, Nuno Sa wrote:
> The adp5589 seems to have the same behavior as similar devices as
> explained in
> 
> commit 910a9f5636f5 ("Input: adp5588-keys - get value from data out when
> dir is out").
> 
> Basically, when the gpio is set as output we need to get the value from
> ADP5589_GPO_DATA_OUT_A register instead of ADP5589_GPI_STATUS_A.
> 
> Fixes: 9d2e173644bb ("Input: ADP5589 - new driver for I2C Keypad Decoder and I/O Expander")
> Signed-off-by: Nuno Sa <nuno.sa@analog.com>

Applied and tagged for stable.

Thanks.
diff mbox series

Patch

diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c
index 68a29d67be57fc22088a912694e3e6e16e46d956..922d3ab998f3a5dfbaf277f10eb19e5cd1b35415 100644
--- a/drivers/input/keyboard/adp5589-keys.c
+++ b/drivers/input/keyboard/adp5589-keys.c
@@ -391,10 +391,17 @@  static int adp5589_gpio_get_value(struct gpio_chip *chip, unsigned off)
 	struct adp5589_kpad *kpad = gpiochip_get_data(chip);
 	unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
 	unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
+	int val;
 
-	return !!(adp5589_read(kpad->client,
-			       kpad->var->reg(ADP5589_GPI_STATUS_A) + bank) &
-			       bit);
+	mutex_lock(&kpad->gpio_lock);
+	if (kpad->dir[bank] & bit)
+		val = kpad->dat_out[bank];
+	else
+		val = adp5589_read(kpad->client,
+				   kpad->var->reg(ADP5589_GPI_STATUS_A) + bank);
+	mutex_unlock(&kpad->gpio_lock);
+
+	return !!(val & bit);
 }
 
 static void adp5589_gpio_set_value(struct gpio_chip *chip,