]> git.hungrycats.org Git - linux/commitdiff
Input: adp5589-keys - fix adp5589_gpio_get_value()
authorNuno Sa <nuno.sa@analog.com>
Tue, 1 Oct 2024 14:47:23 +0000 (07:47 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Oct 2024 10:01:03 +0000 (12:01 +0200)
commit c684771630e64bc39bddffeb65dd8a6612a6b249 upstream.

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>
Link: https://lore.kernel.org/r/20241001-b4-dev-adp5589-fw-conversion-v1-2-fca0149dfc47@analog.com
Cc: stable@vger.kernel.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/input/keyboard/adp5589-keys.c

index 68a29d67be57fc22088a912694e3e6e16e46d956..922d3ab998f3a5dfbaf277f10eb19e5cd1b35415 100644 (file)
@@ -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,