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>
This commit is contained in:
parent
eb1567f7ad
commit
09d71ff194
|
@ -70,6 +70,35 @@ int devm_gpio_request(struct device *dev, unsigned gpio, const char *label)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(devm_gpio_request);
|
EXPORT_SYMBOL(devm_gpio_request);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* devm_gpio_request_one - request a single GPIO with initial setup
|
||||||
|
* @dev: device to request for
|
||||||
|
* @gpio: the GPIO number
|
||||||
|
* @flags: GPIO configuration as specified by GPIOF_*
|
||||||
|
* @label: a literal description string of this GPIO
|
||||||
|
*/
|
||||||
|
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_one(gpio, flags, label);
|
||||||
|
if (rc) {
|
||||||
|
devres_free(dr);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dr = gpio;
|
||||||
|
devres_add(dev, dr);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* devm_gpio_free - free an interrupt
|
* devm_gpio_free - free an interrupt
|
||||||
* @dev: device to free gpio for
|
* @dev: device to free gpio for
|
||||||
|
|
|
@ -179,6 +179,8 @@ extern void gpio_free_array(const struct gpio *array, size_t num);
|
||||||
|
|
||||||
/* bindings for managed devices that want to request gpios */
|
/* bindings for managed devices that want to request gpios */
|
||||||
int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
|
int devm_gpio_request(struct device *dev, unsigned gpio, const char *label);
|
||||||
|
int devm_gpio_request_one(struct device *dev, unsigned gpio,
|
||||||
|
unsigned long flags, const char *label);
|
||||||
void devm_gpio_free(struct device *dev, unsigned int gpio);
|
void devm_gpio_free(struct device *dev, unsigned int gpio);
|
||||||
|
|
||||||
#ifdef CONFIG_GPIO_SYSFS
|
#ifdef CONFIG_GPIO_SYSFS
|
||||||
|
|
|
@ -106,6 +106,12 @@ static inline int gpio_request_one(unsigned gpio,
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int devm_gpio_request_one(struct device *dev, unsigned gpio,
|
||||||
|
unsigned long flags, const char *label)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int gpio_request_array(const struct gpio *array, size_t num)
|
static inline int gpio_request_array(const struct gpio *array, size_t num)
|
||||||
{
|
{
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
|
|
Loading…
Reference in New Issue