]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpiolib: legacy: Allow to kill devm_gpio_request_one() independently
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 12 Nov 2025 09:32:02 +0000 (10:32 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 17 Nov 2025 09:57:28 +0000 (10:57 +0100)
Allow to kill devm_gpio_request_one() independently by converting it
to use legacy APIs that will be alive a bit longer.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20251112093608.1481030-3-andriy.shevchenko@linux.intel.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-legacy.c

index 35cb7fca634ea1100b0f2ca89b79b3f363f3dabe..ef3f2ef30cf2c9dddc544466c289e3f88ae8828a 100644 (file)
@@ -68,11 +68,9 @@ int gpio_request(unsigned gpio, const char *label)
 }
 EXPORT_SYMBOL_GPL(gpio_request);
 
-static void devm_gpio_release(struct device *dev, void *res)
+static void devm_gpio_release(void *gpio)
 {
-       unsigned *gpio = res;
-
-       gpio_free(*gpio);
+       gpio_free((unsigned)(unsigned long)gpio);
 }
 
 /**
@@ -90,22 +88,22 @@ static void devm_gpio_release(struct device *dev, void *res)
 int devm_gpio_request_one(struct device *dev, unsigned gpio,
                          unsigned long flags, const char *label)
 {
-       unsigned *dr;
        int rc;
 
-       dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL);
-       if (!dr)
-               return -ENOMEM;
+       rc = gpio_request(gpio, label);
+       if (rc)
+               return rc;
+
+       if (flags & GPIOF_IN)
+               rc = gpio_direction_input(gpio);
+       else
+               rc = gpio_direction_output(gpio, !!(flags & GPIOF_OUT_INIT_HIGH));
 
-       rc = gpio_request_one(gpio, flags, label);
        if (rc) {
-               devres_free(dr);
+               gpio_free(gpio);
                return rc;
        }
 
-       *dr = gpio;
-       devres_add(dev, dr);
-
-       return 0;
+       return devm_add_action_or_reset(dev, devm_gpio_release, (void *)(unsigned long)gpio);
 }
 EXPORT_SYMBOL_GPL(devm_gpio_request_one);