Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpiolib: legacy: Allow to kill devm_gpio_request_one() independently

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>

authored by

Andy Shevchenko and committed by
Bartosz Golaszewski
ade570c1 61e1fd2a

+12 -14
+12 -14
drivers/gpio/gpiolib-legacy.c
··· 68 68 } 69 69 EXPORT_SYMBOL_GPL(gpio_request); 70 70 71 - static void devm_gpio_release(struct device *dev, void *res) 71 + static void devm_gpio_release(void *gpio) 72 72 { 73 - unsigned *gpio = res; 74 - 75 - gpio_free(*gpio); 73 + gpio_free((unsigned)(unsigned long)gpio); 76 74 } 77 75 78 76 /** ··· 88 90 int devm_gpio_request_one(struct device *dev, unsigned gpio, 89 91 unsigned long flags, const char *label) 90 92 { 91 - unsigned *dr; 92 93 int rc; 93 94 94 - dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); 95 - if (!dr) 96 - return -ENOMEM; 95 + rc = gpio_request(gpio, label); 96 + if (rc) 97 + return rc; 97 98 98 - rc = gpio_request_one(gpio, flags, label); 99 + if (flags & GPIOF_IN) 100 + rc = gpio_direction_input(gpio); 101 + else 102 + rc = gpio_direction_output(gpio, !!(flags & GPIOF_OUT_INIT_HIGH)); 103 + 99 104 if (rc) { 100 - devres_free(dr); 105 + gpio_free(gpio); 101 106 return rc; 102 107 } 103 108 104 - *dr = gpio; 105 - devres_add(dev, dr); 106 - 107 - return 0; 109 + return devm_add_action_or_reset(dev, devm_gpio_release, (void *)(unsigned long)gpio); 108 110 } 109 111 EXPORT_SYMBOL_GPL(devm_gpio_request_one);