gpio: Propagate errors from chip->get()
It's possible to have gpio chips hanging off unreliable remote buses where the get() operation will fail to acquire a readout of the current gpio state. Propagate these errors to the consumer so that they can act on, retry or ignore these failing reads, instead of treating them as the line being held high. Signed-off-by: Bjorn Andersson <bjorn.andersson@sonymobile.com> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
aad38b75fb
commit
e20538b82f
|
@ -1174,15 +1174,16 @@ EXPORT_SYMBOL_GPL(gpiod_is_active_low);
|
||||||
* that the GPIO was actually requested.
|
* that the GPIO was actually requested.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool _gpiod_get_raw_value(const struct gpio_desc *desc)
|
static int _gpiod_get_raw_value(const struct gpio_desc *desc)
|
||||||
{
|
{
|
||||||
struct gpio_chip *chip;
|
struct gpio_chip *chip;
|
||||||
bool value;
|
|
||||||
int offset;
|
int offset;
|
||||||
|
int value;
|
||||||
|
|
||||||
chip = desc->chip;
|
chip = desc->chip;
|
||||||
offset = gpio_chip_hwgpio(desc);
|
offset = gpio_chip_hwgpio(desc);
|
||||||
value = chip->get ? chip->get(chip, offset) : false;
|
value = chip->get ? chip->get(chip, offset) : -EIO;
|
||||||
|
value = value < 0 ? value : !!value;
|
||||||
trace_gpio_value(desc_to_gpio(desc), 1, value);
|
trace_gpio_value(desc_to_gpio(desc), 1, value);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -1192,7 +1193,7 @@ static bool _gpiod_get_raw_value(const struct gpio_desc *desc)
|
||||||
* @desc: gpio whose value will be returned
|
* @desc: gpio whose value will be returned
|
||||||
*
|
*
|
||||||
* Return the GPIO's raw value, i.e. the value of the physical line disregarding
|
* Return the GPIO's raw value, i.e. the value of the physical line disregarding
|
||||||
* its ACTIVE_LOW status.
|
* its ACTIVE_LOW status, or negative errno on failure.
|
||||||
*
|
*
|
||||||
* This function should be called from contexts where we cannot sleep, and will
|
* This function should be called from contexts where we cannot sleep, and will
|
||||||
* complain if the GPIO chip functions potentially sleep.
|
* complain if the GPIO chip functions potentially sleep.
|
||||||
|
@ -1212,7 +1213,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_value);
|
||||||
* @desc: gpio whose value will be returned
|
* @desc: gpio whose value will be returned
|
||||||
*
|
*
|
||||||
* Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
|
* Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
|
||||||
* account.
|
* account, or negative errno on failure.
|
||||||
*
|
*
|
||||||
* This function should be called from contexts where we cannot sleep, and will
|
* This function should be called from contexts where we cannot sleep, and will
|
||||||
* complain if the GPIO chip functions potentially sleep.
|
* complain if the GPIO chip functions potentially sleep.
|
||||||
|
@ -1226,6 +1227,9 @@ int gpiod_get_value(const struct gpio_desc *desc)
|
||||||
WARN_ON(desc->chip->can_sleep);
|
WARN_ON(desc->chip->can_sleep);
|
||||||
|
|
||||||
value = _gpiod_get_raw_value(desc);
|
value = _gpiod_get_raw_value(desc);
|
||||||
|
if (value < 0)
|
||||||
|
return value;
|
||||||
|
|
||||||
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
||||||
value = !value;
|
value = !value;
|
||||||
|
|
||||||
|
@ -1548,7 +1552,7 @@ EXPORT_SYMBOL_GPL(gpiochip_unlock_as_irq);
|
||||||
* @desc: gpio whose value will be returned
|
* @desc: gpio whose value will be returned
|
||||||
*
|
*
|
||||||
* Return the GPIO's raw value, i.e. the value of the physical line disregarding
|
* Return the GPIO's raw value, i.e. the value of the physical line disregarding
|
||||||
* its ACTIVE_LOW status.
|
* its ACTIVE_LOW status, or negative errno on failure.
|
||||||
*
|
*
|
||||||
* This function is to be called from contexts that can sleep.
|
* This function is to be called from contexts that can sleep.
|
||||||
*/
|
*/
|
||||||
|
@ -1566,7 +1570,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_value_cansleep);
|
||||||
* @desc: gpio whose value will be returned
|
* @desc: gpio whose value will be returned
|
||||||
*
|
*
|
||||||
* Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
|
* Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
|
||||||
* account.
|
* account, or negative errno on failure.
|
||||||
*
|
*
|
||||||
* This function is to be called from contexts that can sleep.
|
* This function is to be called from contexts that can sleep.
|
||||||
*/
|
*/
|
||||||
|
@ -1579,6 +1583,9 @@ int gpiod_get_value_cansleep(const struct gpio_desc *desc)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
value = _gpiod_get_raw_value(desc);
|
value = _gpiod_get_raw_value(desc);
|
||||||
|
if (value < 0)
|
||||||
|
return value;
|
||||||
|
|
||||||
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
|
||||||
value = !value;
|
value = !value;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue