greybus: gpio: refuse to set value of input pins
authorJohan Hovold <johan@hovoldconsulting.com>
Thu, 19 Mar 2015 15:55:22 +0000 (16:55 +0100)
committerGreg Kroah-Hartman <greg@kroah.com>
Thu, 19 Mar 2015 16:30:38 +0000 (17:30 +0100)
Add warning and refuse to set output value for pin configured as input,
as the result of such an operation is undefined.

Remove incorrect todo-comment suggesting that the driver could
implicitly switch direction as part of the call.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/gpio.c

index b18fb7e..7e51840 100644 (file)
@@ -273,14 +273,18 @@ static void gb_gpio_set_value_operation(struct gb_gpio_controller *ggc,
        struct gb_gpio_set_value_request request;
        int ret;
 
+       if (ggc->lines[which].direction == 1) {
+               dev_warn(ggc->chip.dev,
+                        "refusing to set value of input gpio %u\n", which);
+               return;
+       }
+
        request.which = which;
        request.value = value_high ? 1 : 0;
        ret = gb_operation_sync(ggc->connection, GB_GPIO_TYPE_SET_VALUE,
                                &request, sizeof(request), NULL, 0);
-       if (!ret) {
-               /* XXX should this set direction to out? */
+       if (!ret)
                ggc->lines[which].value = request.value;
-       }
 }
 
 static int gb_gpio_set_debounce_operation(struct gb_gpio_controller *ggc,