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
1 changed files with 15 additions and 2 deletions
|
@ -43,9 +43,22 @@ static int palmas_gpio_get(struct gpio_chip *gc, unsigned offset)
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
int ret;
|
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) {
|
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 ret;
|
||||||
}
|
}
|
||||||
return !!(val & BIT(offset));
|
return !!(val & BIT(offset));
|
||||||
|
|
Loading…
Add table
Reference in a new issue