For use in legacy non-DT board code, let's introduce a function that translates an absolute GPIO number into the corresponding GPIO descriptor. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/gpio/gpiolib.c | 26 ++++++++++++++++++++------ include/linux/gpio/consumer.h | 10 ++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 5d5458374869..146eaf9af138 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -642,6 +642,24 @@ static int gpiodesc_request_one(struct gpio_desc *desc, unsigned long lflags, return err; } +struct gpio_desc *gpiod_request_one(unsigned gpio, + unsigned long flags, const char *label) +{ + struct gpio_desc *desc = gpio_to_desc(gpio); + int ret; + + if (!desc) + return ERR_PTR(-ENODEV); + + ret = gpiodesc_request_one(desc, 0, flags, label); + if (ret) + return ERR_PTR(ret); + + return desc; +} +EXPORT_SYMBOL_GPL(gpio_request_one); + + /** * gpio_request_one - request a single GPIO with initial configuration * @gpio: the GPIO number @@ -650,15 +668,11 @@ static int gpiodesc_request_one(struct gpio_desc *desc, unsigned long lflags, */ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) { - struct gpio_desc *desc = gpio_to_desc(gpio); - - if (!desc) - return -ENODEV; - - return gpiodesc_request_one(desc, 0, flags, label); + return PTR_ERR_OR_ZERO(gpiod_request_one(gpio, flags, label)); } EXPORT_SYMBOL_GPL(gpio_request_one); + /** * gpio_request_array - request multiple GPIOs in a single call * @array: array of the 'struct gpio' diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h index 64366a6f3302..f0d5bf7b255b 100644 --- a/include/linux/gpio/consumer.h +++ b/include/linux/gpio/consumer.h @@ -97,6 +97,9 @@ int gpiod_set_array_value(unsigned int array_size, struct gpio_array *array_info, unsigned long *value_bitmap); +struct gpio_desc *gpiod_request_one(unsigned gpio, + unsigned long flags, const char *label); + #else static inline int gpiod_set_config(struct gpio_desc *desc, unsigned long config) @@ -186,6 +189,13 @@ static inline int gpiod_set_array_value(unsigned int array_size, return 0; } +static inline +struct gpio_desc *gpiod_request_one(unsigned gpio, + unsigned long flags, const char *label) +{ + return ERR_PTR(-ENODEV); +} + #endif static inline struct gpio_desc *dev_gpiod_get(struct device *dev, -- 2.39.2