forked from Minki/linux
gpio: palmas: Fix misreported GPIO out value
It seems that the value read back from the PALMAS_GPIO_DATA_IN register isn't valid if the GPIO direction is out. When that's the case, we can read back the PALMAS_GPIO_DATA_OUT register to get the proper output value. Signed-off-by: Andrew Chew <achew@nvidia.com> Acked-by: Laxman Dewangan <ldewangan@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
5763318f56
commit
8b628c659c
@ -43,9 +43,22 @@ static int palmas_gpio_get(struct gpio_chip *gc, unsigned offset)
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
ret = palmas_read(palmas, PALMAS_GPIO_BASE, PALMAS_GPIO_DATA_IN, &val);
|
||||
ret = palmas_read(palmas, PALMAS_GPIO_BASE, PALMAS_GPIO_DATA_DIR, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(gc->dev, "GPIO_DATA_IN read failed, err = %d\n", ret);
|
||||
dev_err(gc->dev, "GPIO_DATA_DIR read failed, err = %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (val & (1 << offset)) {
|
||||
ret = palmas_read(palmas, PALMAS_GPIO_BASE,
|
||||
PALMAS_GPIO_DATA_OUT, &val);
|
||||
} else {
|
||||
ret = palmas_read(palmas, PALMAS_GPIO_BASE,
|
||||
PALMAS_GPIO_DATA_IN, &val);
|
||||
}
|
||||
if (ret < 0) {
|
||||
dev_err(gc->dev, "GPIO_DATA_IN/OUT read failed, err = %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
return !!(val & BIT(offset));
|
||||
|
Loading…
Reference in New Issue
Block a user