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

gpiolib: Implement devm_gpio_request_one()

Allow drivers to use the modern request and configure idiom together
with devres.

As with plain gpio_request() and gpio_request_one() we can't implement
the old school version in terms of _one() as this would force the
explicit selection of a direction in gpio_request() which could break
systems if we pick the wrong one. Implementing devm_gpio_request_one()
in terms of devm_gpio_request() would needlessly complicate things or
lead to duplication from the unmanaged version depending on how it's
done.

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>

authored by

Mark Brown and committed by
Grant Likely
09d71ff1 eb1567f7

+37
+29
drivers/gpio/devres.c
··· 71 71 EXPORT_SYMBOL(devm_gpio_request); 72 72 73 73 /** 74 + * devm_gpio_request_one - request a single GPIO with initial setup 75 + * @dev: device to request for 76 + * @gpio: the GPIO number 77 + * @flags: GPIO configuration as specified by GPIOF_* 78 + * @label: a literal description string of this GPIO 79 + */ 80 + int devm_gpio_request_one(struct device *dev, unsigned gpio, 81 + unsigned long flags, const char *label) 82 + { 83 + unsigned *dr; 84 + int rc; 85 + 86 + dr = devres_alloc(devm_gpio_release, sizeof(unsigned), GFP_KERNEL); 87 + if (!dr) 88 + return -ENOMEM; 89 + 90 + rc = gpio_request_one(gpio, flags, label); 91 + if (rc) { 92 + devres_free(dr); 93 + return rc; 94 + } 95 + 96 + *dr = gpio; 97 + devres_add(dev, dr); 98 + 99 + return 0; 100 + } 101 + 102 + /** 74 103 * devm_gpio_free - free an interrupt 75 104 * @dev: device to free gpio for 76 105 * @gpio: gpio to free
+2
include/asm-generic/gpio.h
··· 179 179 180 180 /* bindings for managed devices that want to request gpios */ 181 181 int devm_gpio_request(struct device *dev, unsigned gpio, const char *label); 182 + int devm_gpio_request_one(struct device *dev, unsigned gpio, 183 + unsigned long flags, const char *label); 182 184 void devm_gpio_free(struct device *dev, unsigned int gpio); 183 185 184 186 #ifdef CONFIG_GPIO_SYSFS
+6
include/linux/gpio.h
··· 106 106 return -ENOSYS; 107 107 } 108 108 109 + static inline int devm_gpio_request_one(struct device *dev, unsigned gpio, 110 + unsigned long flags, const char *label) 111 + { 112 + return -ENOSYS; 113 + } 114 + 109 115 static inline int gpio_request_array(const struct gpio *array, size_t num) 110 116 { 111 117 return -ENOSYS;