Message ID | 20220418182439.1763030-2-zachary.tahenakos@canonical.com |
---|---|
State | New |
Headers | show |
Series | linux-bluefield: Fix | expand |
On 18.04.22 20:24, Zachary Tahenakos wrote: > From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > > https://bugs.launchpad.net/bugs/1969374 > > Currently only search by index is supported. However, in some cases > we might need to pass the quirks to the acpi_dev_gpio_irq_get(). > > For this, split out acpi_dev_gpio_irq_get_by() and replace > acpi_dev_gpio_irq_get() by calling above with NULL for name parameter. > > Fixes: ba8c90c61847 ("gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2") > Depends-on: 0ea683931adb ("gpio: dwapb: Convert driver to using the GPIO-lib-based IRQ-chip") > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> > Acked-by: Linus Walleij <linus.walleij@linaro.org> > (cherry-picked from commit 809390219fb9c2421239afe5c9eb862d73978ba0) > Signed-off-by: Zachary Tahenakos <zachary.tahenakos@canonical.com> Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com> Thanks > --- > drivers/gpio/gpiolib-acpi.c | 12 ++++++++---- > include/linux/acpi.h | 10 ++++++++-- > 2 files changed, 16 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c > index 13c6eee481da..260237881e69 100644 > --- a/drivers/gpio/gpiolib-acpi.c > +++ b/drivers/gpio/gpiolib-acpi.c > @@ -904,8 +904,9 @@ struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, > } > > /** > - * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number > + * acpi_dev_gpio_irq_get_by() - Find GpioInt and translate it to Linux IRQ number > * @adev: pointer to a ACPI device to get IRQ from > + * @name: optional name of GpioInt resource > * @index: index of GpioInt resource (starting from %0) > * > * If the device has one or more GpioInt resources, this function can be > @@ -915,9 +916,12 @@ struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, > * The function is idempotent, though each time it runs it will configure GPIO > * pin direction according to the flags in GpioInt resource. > * > + * The function takes optional @name parameter. If the resource has a property > + * name, then only those will be taken into account. > + * > * Return: Linux IRQ number (> %0) on success, negative errno on failure. > */ > -int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) > +int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index) > { > int idx, i; > unsigned int irq_flags; > @@ -927,7 +931,7 @@ int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) > struct acpi_gpio_info info; > struct gpio_desc *desc; > > - desc = acpi_get_gpiod_by_index(adev, NULL, i, &info); > + desc = acpi_get_gpiod_by_index(adev, name, i, &info); > > /* Ignore -EPROBE_DEFER, it only matters if idx matches */ > if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER) > @@ -971,7 +975,7 @@ int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) > } > return -ENOENT; > } > -EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get); > +EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get_by); > > static acpi_status > acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index c708fd831565..2d701573d51c 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -1026,19 +1026,25 @@ void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const c > #if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB) > bool acpi_gpio_get_irq_resource(struct acpi_resource *ares, > struct acpi_resource_gpio **agpio); > -int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index); > +int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index); > #else > static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares, > struct acpi_resource_gpio **agpio) > { > return false; > } > -static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) > +static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, > + const char *name, int index) > { > return -ENXIO; > } > #endif > > +static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) > +{ > + return acpi_dev_gpio_irq_get_by(adev, NULL, index); > +} > + > /* Device properties */ > > #ifdef CONFIG_ACPI
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index 13c6eee481da..260237881e69 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -904,8 +904,9 @@ struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, } /** - * acpi_dev_gpio_irq_get() - Find GpioInt and translate it to Linux IRQ number + * acpi_dev_gpio_irq_get_by() - Find GpioInt and translate it to Linux IRQ number * @adev: pointer to a ACPI device to get IRQ from + * @name: optional name of GpioInt resource * @index: index of GpioInt resource (starting from %0) * * If the device has one or more GpioInt resources, this function can be @@ -915,9 +916,12 @@ struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, * The function is idempotent, though each time it runs it will configure GPIO * pin direction according to the flags in GpioInt resource. * + * The function takes optional @name parameter. If the resource has a property + * name, then only those will be taken into account. + * * Return: Linux IRQ number (> %0) on success, negative errno on failure. */ -int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) +int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index) { int idx, i; unsigned int irq_flags; @@ -927,7 +931,7 @@ int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) struct acpi_gpio_info info; struct gpio_desc *desc; - desc = acpi_get_gpiod_by_index(adev, NULL, i, &info); + desc = acpi_get_gpiod_by_index(adev, name, i, &info); /* Ignore -EPROBE_DEFER, it only matters if idx matches */ if (IS_ERR(desc) && PTR_ERR(desc) != -EPROBE_DEFER) @@ -971,7 +975,7 @@ int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) } return -ENOENT; } -EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get); +EXPORT_SYMBOL_GPL(acpi_dev_gpio_irq_get_by); static acpi_status acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, diff --git a/include/linux/acpi.h b/include/linux/acpi.h index c708fd831565..2d701573d51c 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -1026,19 +1026,25 @@ void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const c #if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB) bool acpi_gpio_get_irq_resource(struct acpi_resource *ares, struct acpi_resource_gpio **agpio); -int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index); +int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index); #else static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares, struct acpi_resource_gpio **agpio) { return false; } -static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) +static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, + const char *name, int index) { return -ENXIO; } #endif +static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index) +{ + return acpi_dev_gpio_irq_get_by(adev, NULL, index); +} + /* Device properties */ #ifdef CONFIG_ACPI