]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpio: viperboard: use new GPIO line value setter callbacks
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 7 Jul 2025 07:50:24 +0000 (09:50 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Sun, 13 Jul 2025 08:45:04 +0000 (10:45 +0200)
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.

Link: https://lore.kernel.org/r/20250707-gpiochip-set-rv-gpio-round4-v1-11-35668aaaf6d2@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-viperboard.c

index e55d28a8a66f25dd0949133c4a7f3bca9b5711dc..3eba77f981d3a502b67a0a7cdea51c706d4c3376 100644 (file)
@@ -128,45 +128,50 @@ static int vprbrd_gpioa_get(struct gpio_chip *chip,
        return answer;
 }
 
-static void vprbrd_gpioa_set(struct gpio_chip *chip,
-               unsigned int offset, int value)
+static int vprbrd_gpioa_set(struct gpio_chip *chip, unsigned int offset,
+                           int value)
 {
-       int ret;
+       int ret = 0;
        struct vprbrd_gpio *gpio = gpiochip_get_data(chip);
        struct vprbrd *vb = gpio->vb;
        struct vprbrd_gpioa_msg *gamsg = (struct vprbrd_gpioa_msg *)vb->buf;
 
-       if (gpio->gpioa_out & (1 << offset)) {
-               if (value)
-                       gpio->gpioa_val |= (1 << offset);
-               else
-                       gpio->gpioa_val &= ~(1 << offset);
-
-               mutex_lock(&vb->lock);
-
-               gamsg->cmd = VPRBRD_GPIOA_CMD_SETOUT;
-               gamsg->clk = 0x00;
-               gamsg->offset = offset;
-               gamsg->t1 = 0x00;
-               gamsg->t2 = 0x00;
-               gamsg->invert = 0x00;
-               gamsg->pwmlevel = 0x00;
-               gamsg->outval = value;
-               gamsg->risefall = 0x00;
-               gamsg->answer = 0x00;
-               gamsg->__fill = 0x00;
-
-               ret = usb_control_msg(vb->usb_dev,
-                       usb_sndctrlpipe(vb->usb_dev, 0),
-                       VPRBRD_USB_REQUEST_GPIOA, VPRBRD_USB_TYPE_OUT,
-                       0x0000, 0x0000, gamsg,
-                       sizeof(struct vprbrd_gpioa_msg), VPRBRD_USB_TIMEOUT_MS);
-
-               mutex_unlock(&vb->lock);
-
-               if (ret != sizeof(struct vprbrd_gpioa_msg))
-                       dev_err(chip->parent, "usb error setting pin value\n");
+       if (!(gpio->gpioa_out & (1 << offset)))
+               return 0;
+
+       if (value)
+               gpio->gpioa_val |= (1 << offset);
+       else
+               gpio->gpioa_val &= ~(1 << offset);
+
+       mutex_lock(&vb->lock);
+
+       gamsg->cmd = VPRBRD_GPIOA_CMD_SETOUT;
+       gamsg->clk = 0x00;
+       gamsg->offset = offset;
+       gamsg->t1 = 0x00;
+       gamsg->t2 = 0x00;
+       gamsg->invert = 0x00;
+       gamsg->pwmlevel = 0x00;
+       gamsg->outval = value;
+       gamsg->risefall = 0x00;
+       gamsg->answer = 0x00;
+       gamsg->__fill = 0x00;
+
+       ret = usb_control_msg(vb->usb_dev, usb_sndctrlpipe(vb->usb_dev, 0),
+                             VPRBRD_USB_REQUEST_GPIOA, VPRBRD_USB_TYPE_OUT,
+                             0x0000, 0x0000, gamsg,
+                             sizeof(struct vprbrd_gpioa_msg),
+                             VPRBRD_USB_TIMEOUT_MS);
+
+       mutex_unlock(&vb->lock);
+
+       if (ret != sizeof(struct vprbrd_gpioa_msg)) {
+               dev_err(chip->parent, "usb error setting pin value\n");
+               return -EREMOTEIO;
        }
+
+       return 0;
 }
 
 static int vprbrd_gpioa_direction_input(struct gpio_chip *chip,
@@ -304,37 +309,42 @@ static int vprbrd_gpiob_get(struct gpio_chip *chip,
        return (gpio->gpiob_val >> offset) & 0x1;
 }
 
-static void vprbrd_gpiob_set(struct gpio_chip *chip,
-               unsigned int offset, int value)
+static int vprbrd_gpiob_set(struct gpio_chip *chip, unsigned int offset,
+                           int value)
 {
        int ret;
        struct vprbrd_gpio *gpio = gpiochip_get_data(chip);
        struct vprbrd *vb = gpio->vb;
        struct vprbrd_gpiob_msg *gbmsg = (struct vprbrd_gpiob_msg *)vb->buf;
 
-       if (gpio->gpiob_out & (1 << offset)) {
-               if (value)
-                       gpio->gpiob_val |= (1 << offset);
-               else
-                       gpio->gpiob_val &= ~(1 << offset);
+       if (!(gpio->gpiob_out & (1 << offset)))
+               return 0;
 
-               mutex_lock(&vb->lock);
+       if (value)
+               gpio->gpiob_val |= (1 << offset);
+       else
+               gpio->gpiob_val &= ~(1 << offset);
 
-               gbmsg->cmd = VPRBRD_GPIOB_CMD_SETVAL;
-               gbmsg->val = cpu_to_be16(value << offset);
-               gbmsg->mask = cpu_to_be16(0x0001 << offset);
+       mutex_lock(&vb->lock);
 
-               ret = usb_control_msg(vb->usb_dev,
-                       usb_sndctrlpipe(vb->usb_dev, 0),
-                       VPRBRD_USB_REQUEST_GPIOB, VPRBRD_USB_TYPE_OUT,
-                       0x0000, 0x0000, gbmsg,
-                       sizeof(struct vprbrd_gpiob_msg), VPRBRD_USB_TIMEOUT_MS);
+       gbmsg->cmd = VPRBRD_GPIOB_CMD_SETVAL;
+       gbmsg->val = cpu_to_be16(value << offset);
+       gbmsg->mask = cpu_to_be16(0x0001 << offset);
 
-               mutex_unlock(&vb->lock);
+       ret = usb_control_msg(vb->usb_dev, usb_sndctrlpipe(vb->usb_dev, 0),
+                             VPRBRD_USB_REQUEST_GPIOB, VPRBRD_USB_TYPE_OUT,
+                             0x0000, 0x0000, gbmsg,
+                             sizeof(struct vprbrd_gpiob_msg),
+                             VPRBRD_USB_TIMEOUT_MS);
 
-               if (ret != sizeof(struct vprbrd_gpiob_msg))
-                       dev_err(chip->parent, "usb error setting pin value\n");
+       mutex_unlock(&vb->lock);
+
+       if (ret != sizeof(struct vprbrd_gpiob_msg)) {
+               dev_err(chip->parent, "usb error setting pin value\n");
+               return -EREMOTEIO;
        }
+
+       return 0;
 }
 
 static int vprbrd_gpiob_direction_input(struct gpio_chip *chip,
@@ -370,14 +380,14 @@ static int vprbrd_gpiob_direction_output(struct gpio_chip *chip,
        mutex_lock(&vb->lock);
 
        ret = vprbrd_gpiob_setdir(vb, offset, 1);
-       if (ret)
+       if (ret) {
                dev_err(chip->parent, "usb error setting pin to output\n");
+               return ret;
+       }
 
        mutex_unlock(&vb->lock);
 
-       vprbrd_gpiob_set(chip, offset, value);
-
-       return ret;
+       return vprbrd_gpiob_set(chip, offset, value);
 }
 
 /* ----- end of gpio b chip ---------------------------------------------- */
@@ -400,7 +410,7 @@ static int vprbrd_gpio_probe(struct platform_device *pdev)
        vb_gpio->gpioa.base = -1;
        vb_gpio->gpioa.ngpio = 16;
        vb_gpio->gpioa.can_sleep = true;
-       vb_gpio->gpioa.set = vprbrd_gpioa_set;
+       vb_gpio->gpioa.set_rv = vprbrd_gpioa_set;
        vb_gpio->gpioa.get = vprbrd_gpioa_get;
        vb_gpio->gpioa.direction_input = vprbrd_gpioa_direction_input;
        vb_gpio->gpioa.direction_output = vprbrd_gpioa_direction_output;
@@ -416,7 +426,7 @@ static int vprbrd_gpio_probe(struct platform_device *pdev)
        vb_gpio->gpiob.base = -1;
        vb_gpio->gpiob.ngpio = 16;
        vb_gpio->gpiob.can_sleep = true;
-       vb_gpio->gpiob.set = vprbrd_gpiob_set;
+       vb_gpio->gpiob.set_rv = vprbrd_gpiob_set;
        vb_gpio->gpiob.get = vprbrd_gpiob_get;
        vb_gpio->gpiob.direction_input = vprbrd_gpiob_direction_input;
        vb_gpio->gpiob.direction_output = vprbrd_gpiob_direction_output;