gpio_of_xlate() already needs the ability to find a struct gpio_chip * via a struct device_d. Exporting this functionality to elsewhere in the code will allow restricting commands to manipulate only a single GPIO bank. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/gpio/gpiolib.c | 28 +++++++++++++++++++--------- include/gpio.h | 1 + 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 97a99b84e32a..cf61213ca12d 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -636,6 +636,18 @@ static int of_gpio_simple_xlate(struct gpio_chip *chip, return chip->base + gpiospec->args[0]; } +struct gpio_chip *gpio_get_chip_by_dev(struct device_d *dev) +{ + struct gpio_chip *chip; + + list_for_each_entry(chip, &chip_list, list) { + if (chip->dev == dev) + return chip; + } + + return NULL; +} + int gpio_of_xlate(struct device_d *dev, struct of_phandle_args *gpiospec, int *flags) { struct gpio_chip *chip; @@ -643,16 +655,14 @@ int gpio_of_xlate(struct device_d *dev, struct of_phandle_args *gpiospec, int *f if (!dev) return -ENODEV; - list_for_each_entry(chip, &chip_list, list) { - if (chip->dev != dev) - continue; - if (chip->ops->of_xlate) - return chip->ops->of_xlate(chip, gpiospec, flags); - else - return of_gpio_simple_xlate(chip, gpiospec, flags); - } + chip = gpio_get_chip_by_dev(dev); + if (!chip) + return -EPROBE_DEFER; - return -EPROBE_DEFER; + if (chip->ops->of_xlate) + return chip->ops->of_xlate(chip, gpiospec, flags); + else + return of_gpio_simple_xlate(chip, gpiospec, flags); } struct gpio_chip *gpio_get_chip(int gpio) diff --git a/include/gpio.h b/include/gpio.h index 8218722dcbf0..82f2eb6b8a34 100644 --- a/include/gpio.h +++ b/include/gpio.h @@ -190,5 +190,6 @@ void gpiochip_remove(struct gpio_chip *chip); int gpio_of_xlate(struct device_d *dev, struct of_phandle_args *gpiospec, int *flags); struct gpio_chip *gpio_get_chip(int gpio); +struct gpio_chip *gpio_get_chip_by_dev(struct device_d *); #endif /* __GPIO_H */ -- 2.30.2