diff options
Diffstat (limited to 'drivers/gpio/gpiolib.c')
| -rw-r--r-- | drivers/gpio/gpiolib.c | 21 | 
1 files changed, 14 insertions, 7 deletions
| diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 980c1f87866a..5db3445552b1 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1174,15 +1174,16 @@ EXPORT_SYMBOL_GPL(gpiod_is_active_low);   * 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; -	bool value;  	int offset; +	int value;  	chip = desc->chip;  	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);  	return value;  } @@ -1192,7 +1193,7 @@ static bool _gpiod_get_raw_value(const struct gpio_desc *desc)   * @desc: gpio whose value will be returned   *   * 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   * 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   *   * 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   * 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);  	value = _gpiod_get_raw_value(desc); +	if (value < 0) +		return value; +  	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))  		value = !value; @@ -1548,7 +1552,7 @@ EXPORT_SYMBOL_GPL(gpiochip_unlock_as_irq);   * @desc: gpio whose value will be returned   *   * 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.   */ @@ -1566,7 +1570,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_raw_value_cansleep);   * @desc: gpio whose value will be returned   *   * 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.   */ @@ -1579,6 +1583,9 @@ int gpiod_get_value_cansleep(const struct gpio_desc *desc)  		return 0;  	value = _gpiod_get_raw_value(desc); +	if (value < 0) +		return value; +  	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))  		value = !value; |