[PATCH 1/9] gpiolib: Fix buggy flag detection code

Andrey Smirnov andrew.smirnov at gmail.com
Mon Jul 24 07:53:52 PDT 2017


Both GPIOF_ACTIVE_LOW and GPIOF_INIT_ACTIVE are multi-bit constants so
detecting their assertion using simple bit-wise and is incorrect and
would lead to false positives.

Fixes: bbc499914 ("gpiolib: Add code to support "active low" GPIOs")

Signed-off-by: Andrey Smirnov <andrew.smirnov at gmail.com>
---
 drivers/gpio/gpiolib.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 1a373ef14..6337a3a47 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -119,12 +119,13 @@ void gpio_free(unsigned gpio)
 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
 {
 	int err;
+	const bool active_low = (flags & GPIOF_ACTIVE_LOW) == GPIOF_ACTIVE_LOW;
 
 	err = gpio_request(gpio, label);
 	if (err)
 		return err;
 
-	if (flags & GPIOF_ACTIVE_LOW) {
+	if (active_low) {
 		struct gpio_info *gi = gpio_to_desc(gpio);
 		gi->active_low = true;
 	}
@@ -132,8 +133,9 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
 	if (flags & GPIOF_DIR_IN) {
 		err = gpio_direction_input(gpio);
 	} else if (flags & GPIOF_LOGICAL) {
-		err = gpio_direction_active(gpio,
-					    !!(flags & GPIOF_INIT_ACTIVE));
+		const bool value =
+			(flags & GPIOF_INIT_ACTIVE) == GPIOF_INIT_ACTIVE;
+		err = gpio_direction_active(gpio, value);
 	} else {
 		err = gpio_direction_output(gpio,
 					    !!(flags & GPIOF_INIT_HIGH));
-- 
2.13.3




More information about the barebox mailing list