diff options
author | Max Krummenacher <max.krummenacher@toradex.com> | 2018-09-13 14:08:13 +0200 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2019-06-21 14:30:49 +0200 |
commit | 3cbe22dabe851d61e7f2071c6329ab6c2da1f960 (patch) | |
tree | 563d557bce32e859a4154de7f117ce7850a7ca12 /drivers | |
parent | 3696fc94130cc14ca6652f67dde59279cfa9a425 (diff) |
gpio-fxl6408.c: fix output setting and output readback
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
(cherry picked from commit f8df25d5785377f11fe8a757346ba8241847fb8d)
(cherry picked from commit 2d24d0eecddbc85c84f58e70b4d32778fbbcb9ec)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpio/gpio-fxl6408.c | 14 |
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); |