mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
iio: adc: ti-ads7950: do not clobber gpio state in ti_ads7950_get()
GPIO state was inadvertently overwritten by the result of spi_sync(),
resulting in ti_ads7950_get() only returning 0 as GPIO state (or error).
Fix this by introducing a separate variable to hold the state.
Fixes: c97dce792d ("iio: adc: ti-ads7950: add GPIO support")
Reported-by: David Lechner <dlechner@baylibre.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
committed by
Jonathan Cameron
parent
e2fa075d5c
commit
d20bbae6e5
@@ -427,13 +427,15 @@ static int ti_ads7950_set(struct gpio_chip *chip, unsigned int offset,
|
||||
static int ti_ads7950_get(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
struct ti_ads7950_state *st = gpiochip_get_data(chip);
|
||||
bool state;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&st->slock);
|
||||
|
||||
/* If set as output, return the output */
|
||||
if (st->gpio_cmd_settings_bitmask & BIT(offset)) {
|
||||
ret = (st->cmd_settings_bitmask & BIT(offset)) ? 1 : 0;
|
||||
state = st->cmd_settings_bitmask & BIT(offset);
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -444,7 +446,7 @@ static int ti_ads7950_get(struct gpio_chip *chip, unsigned int offset)
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = ((st->single_rx >> 12) & BIT(offset)) ? 1 : 0;
|
||||
state = (st->single_rx >> 12) & BIT(offset);
|
||||
|
||||
/* Revert back to original settings */
|
||||
st->cmd_settings_bitmask &= ~TI_ADS7950_CR_GPIO_DATA;
|
||||
@@ -456,7 +458,7 @@ static int ti_ads7950_get(struct gpio_chip *chip, unsigned int offset)
|
||||
out:
|
||||
mutex_unlock(&st->slock);
|
||||
|
||||
return ret;
|
||||
return ret ?: state;
|
||||
}
|
||||
|
||||
static int ti_ads7950_get_direction(struct gpio_chip *chip,
|
||||
|
||||
Reference in New Issue
Block a user