summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Krummenacher <max.krummenacher@toradex.com>2018-09-13 14:08:13 +0200
committerMax Krummenacher <max.krummenacher@toradex.com>2018-11-08 11:31:52 +0100
commitf8df25d5785377f11fe8a757346ba8241847fb8d (patch)
treeb4ecb15012b36bc05c4d6b4e932e199467c0ee66
parentca11f963f8c10dfd74392131cfde0fa653cdc80a (diff)
gpio-fxl6408.c: fix output setting and output readback
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
-rw-r--r--drivers/gpio/gpio-fxl6408.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/gpio/gpio-fxl6408.c b/drivers/gpio/gpio-fxl6408.c
index f9db20461013..e68c8a49f868 100644
--- a/drivers/gpio/gpio-fxl6408.c
+++ b/drivers/gpio/gpio-fxl6408.c
@@ -109,10 +109,14 @@ static int fxl6408_gpio_get_value(struct gpio_chip *gc, unsigned off)
struct fxl6408_chip *chip = gpiochip_get_data(gc);
u8 reg;
- mutex_lock(&chip->i2c_lock);
- reg = i2c_smbus_read_byte_data(chip->client, FXL6408_INPUT_STATUS);
- mutex_unlock(&chip->i2c_lock);
-
+ if (fxl6408_gpio_get_direction(gc, off) == 0)
+ {
+ reg = chip->reg_output;
+ } else {
+ mutex_lock(&chip->i2c_lock);
+ reg = i2c_smbus_read_byte_data(chip->client, FXL6408_INPUT_STATUS);
+ mutex_unlock(&chip->i2c_lock);
+ }
return (reg & BIT(off)) != 0;
}
@@ -125,7 +129,7 @@ static void fxl6408_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
if (val)
chip->reg_output |= BIT(off);
else
- chip->reg_output &= BIT(off);
+ chip->reg_output &= ~BIT(off);
i2c_smbus_write_byte_data(chip->client, FXL6408_OUTPUT,
chip->reg_output);