]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpiolib: wrap gpio_chip::set()
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Thu, 20 Feb 2025 09:57:00 +0000 (10:57 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 26 Feb 2025 10:17:39 +0000 (11:17 +0100)
We have three places where we dereference the gpio_chip::set() callback.
In order to make it easier to incorporate the upcoming new variant of
this callback (one returning an integer value), wrap it in a helper so
that the dereferencing only happens once.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Acked-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/20250220-gpio-set-retval-v2-3-bc4cfd38dae3@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib.c

index f659437710c174f75e77ae91798a2a567e8f5d3c..a83494dd3e123d8d4f31685bffe669b3a6b05bcf 100644 (file)
@@ -2825,6 +2825,17 @@ int gpiod_direction_input_nonotify(struct gpio_desc *desc)
        return ret;
 }
 
+static int gpiochip_set(struct gpio_chip *gc, unsigned int offset, int value)
+{
+       lockdep_assert_held(&gc->gpiodev->srcu);
+
+       if (WARN_ON(unlikely(!gc->set)))
+               return -EOPNOTSUPP;
+
+       gc->set(gc, offset, value);
+       return 0;
+}
+
 static int gpiod_direction_output_raw_commit(struct gpio_desc *desc, int value)
 {
        int val = !!value, ret = 0;
@@ -2867,7 +2878,9 @@ static int gpiod_direction_output_raw_commit(struct gpio_desc *desc, int value)
                 * If we can't actively set the direction, we are some
                 * output-only chip, so just drive the output as desired.
                 */
-               guard.gc->set(guard.gc, gpio_chip_hwgpio(desc), val);
+               ret = gpiochip_set(guard.gc, gpio_chip_hwgpio(desc), val);
+               if (ret)
+                       return ret;
        }
 
        if (!ret)
@@ -3557,9 +3570,7 @@ static int gpiod_set_raw_value_commit(struct gpio_desc *desc, bool value)
                return -ENODEV;
 
        trace_gpio_value(desc_to_gpio(desc), 0, value);
-       guard.gc->set(guard.gc, gpio_chip_hwgpio(desc), value);
-
-       return 0;
+       return gpiochip_set(guard.gc, gpio_chip_hwgpio(desc), value);
 }
 
 /*
@@ -3584,7 +3595,7 @@ static void gpio_chip_set_multiple(struct gpio_chip *gc,
 
                /* set outputs if the corresponding mask bit is set */
                for_each_set_bit(i, mask, gc->ngpio)
-                       gc->set(gc, i, test_bit(i, bits));
+                       gpiochip_set(gc, i, test_bit(i, bits));
        }
 }