]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform: cznic: use new GPIO line value setter callbacks
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 10 Jun 2025 09:43:58 +0000 (11:43 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 19 Jun 2025 07:15:05 +0000 (09:15 +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.

Signed-off-by: Marek BehĂșn <kabel@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Marek BehĂșn <kabel@kernel.org>
Link: https://lore.kernel.org/r/20250610-gpiochip-set-rv-platform-cznic-v1-1-30afd2444756@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/platform/cznic/turris-omnia-mcu-gpio.c

index c2df24ea8686782c18b7cbdc62e3ff6aecd9503a..77184c8b42ea21a2e4194074bdb1eef1806a7ba7 100644 (file)
@@ -439,27 +439,28 @@ static int omnia_gpio_get_multiple(struct gpio_chip *gc, unsigned long *mask,
        return 0;
 }
 
-static void omnia_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)
+static int omnia_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)
 {
        const struct omnia_gpio *gpio = &omnia_gpios[offset];
        struct omnia_mcu *mcu = gpiochip_get_data(gc);
        u16 val, mask;
 
        if (!gpio->ctl_cmd)
-               return;
+               return -EINVAL;
 
        mask = BIT(gpio->ctl_bit);
        val = value ? mask : 0;
 
-       omnia_ctl_cmd(mcu, gpio->ctl_cmd, val, mask);
+       return omnia_ctl_cmd(mcu, gpio->ctl_cmd, val, mask);
 }
 
-static void omnia_gpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
-                                   unsigned long *bits)
+static int omnia_gpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
+                                  unsigned long *bits)
 {
        unsigned long ctl = 0, ctl_mask = 0, ext_ctl = 0, ext_ctl_mask = 0;
        struct omnia_mcu *mcu = gpiochip_get_data(gc);
        unsigned int i;
+       int err;
 
        for_each_set_bit(i, mask, ARRAY_SIZE(omnia_gpios)) {
                unsigned long *field, *field_mask;
@@ -488,13 +489,21 @@ static void omnia_gpio_set_multiple(struct gpio_chip *gc, unsigned long *mask,
 
        guard(mutex)(&mcu->lock);
 
-       if (ctl_mask)
-               omnia_ctl_cmd_locked(mcu, OMNIA_CMD_GENERAL_CONTROL,
-                                    ctl, ctl_mask);
+       if (ctl_mask) {
+               err = omnia_ctl_cmd_locked(mcu, OMNIA_CMD_GENERAL_CONTROL,
+                                          ctl, ctl_mask);
+               if (err)
+                       return err;
+       }
+
+       if (ext_ctl_mask) {
+               err = omnia_ctl_cmd_locked(mcu, OMNIA_CMD_EXT_CONTROL,
+                                          ext_ctl, ext_ctl_mask);
+               if (err)
+                       return err;
+       }
 
-       if (ext_ctl_mask)
-               omnia_ctl_cmd_locked(mcu, OMNIA_CMD_EXT_CONTROL,
-                                    ext_ctl, ext_ctl_mask);
+       return 0;
 }
 
 static bool omnia_gpio_available(struct omnia_mcu *mcu,
@@ -1015,8 +1024,8 @@ int omnia_mcu_register_gpiochip(struct omnia_mcu *mcu)
        mcu->gc.direction_output = omnia_gpio_direction_output;
        mcu->gc.get = omnia_gpio_get;
        mcu->gc.get_multiple = omnia_gpio_get_multiple;
-       mcu->gc.set = omnia_gpio_set;
-       mcu->gc.set_multiple = omnia_gpio_set_multiple;
+       mcu->gc.set_rv = omnia_gpio_set;
+       mcu->gc.set_multiple_rv = omnia_gpio_set_multiple;
        mcu->gc.init_valid_mask = omnia_gpio_init_valid_mask;
        mcu->gc.can_sleep = true;
        mcu->gc.names = omnia_mcu_gpio_names;