diff mbox series

[SRU,focal:linux-bluefield,1/1] gpiolib: acpi: Allow to find GpioInt() resource by name and index

Message ID 20220418182439.1763030-2-zachary.tahenakos@canonical.com
State New
Headers show
Series linux-bluefield: Fix | expand

Commit Message

Zachary Tahenakos April 18, 2022, 6:24 p.m. UTC
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>
---
 drivers/gpio/gpiolib-acpi.c | 12 ++++++++----
 include/linux/acpi.h        | 10 ++++++++--
 2 files changed, 16 insertions(+), 6 deletions(-)

Comments

Kleber Sacilotto de Souza April 19, 2022, 1:10 p.m. UTC | #1
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 mbox series

Patch

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