* [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration
@ 2020-05-19 13:12 Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 2/4] gpio: dwapb: avoid error message for optional IRQ Andy Shevchenko
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Andy Shevchenko @ 2020-05-19 13:12 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, linux-gpio
Cc: Andy Shevchenko, Serge Semin
Add missed acpi_gpiochip_free_interrupts() call when unregistering ports.
While at it, drop extra check to call acpi_gpiochip_request_interrupts().
There is no need to have an additional check to call
acpi_gpiochip_request_interrupts(). Even without any interrupts available
the registered ACPI Event handlers can be useful for debugging purposes.
Fixes: e6cb3486f5a1 ("gpio: dwapb: add gpio-signaled acpi event support")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Serge Semin <fancer.lancer@gmail.com>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
---
v3: appended tags (Serge)
drivers/gpio/gpio-dwapb.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index 8639c4a7f469..e5d844304f8d 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -505,26 +505,33 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
dwapb_configure_irqs(gpio, port, pp);
err = gpiochip_add_data(&port->gc, port);
- if (err)
+ if (err) {
dev_err(gpio->dev, "failed to register gpiochip for port%d\n",
port->idx);
- else
- port->is_registered = true;
+ return err;
+ }
/* Add GPIO-signaled ACPI event support */
- if (pp->has_irq)
- acpi_gpiochip_request_interrupts(&port->gc);
+ acpi_gpiochip_request_interrupts(&port->gc);
- return err;
+ port->is_registered = true;
+
+ return 0;
}
static void dwapb_gpio_unregister(struct dwapb_gpio *gpio)
{
unsigned int m;
- for (m = 0; m < gpio->nr_ports; ++m)
- if (gpio->ports[m].is_registered)
- gpiochip_remove(&gpio->ports[m].gc);
+ for (m = 0; m < gpio->nr_ports; ++m) {
+ struct dwapb_gpio_port *port = &gpio->ports[m];
+
+ if (!port->is_registered)
+ continue;
+
+ acpi_gpiochip_free_interrupts(&port->gc);
+ gpiochip_remove(&port->gc);
+ }
}
static void dwapb_get_irq(struct device *dev, struct fwnode_handle *fwnode,
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 2/4] gpio: dwapb: avoid error message for optional IRQ
2020-05-19 13:12 [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Andy Shevchenko
@ 2020-05-19 13:12 ` Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 3/4] gpio: dwapb: Don't use IRQ 0 as valid Linux interrupt Andy Shevchenko
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Andy Shevchenko @ 2020-05-19 13:12 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, linux-gpio
Cc: Andy Shevchenko, Serge Semin
platform_get_irq() will generate an error message if the requested IRQ
is not present. Use platform_get_irq_optional() to avoid the error message
being generated.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Serge Semin <fancer.lancer@gmail.com>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
---
v3: appended tags (Serge)
drivers/gpio/gpio-dwapb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index e5d844304f8d..944dae80d687 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -549,7 +549,7 @@ static void dwapb_get_irq(struct device *dev, struct fwnode_handle *fwnode,
if (np)
pp->irq[j] = of_irq_get(np, j);
else if (has_acpi_companion(dev))
- pp->irq[j] = platform_get_irq(to_platform_device(dev), j);
+ pp->irq[j] = platform_get_irq_optional(to_platform_device(dev), j);
if (pp->irq[j] >= 0)
pp->has_irq = true;
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 3/4] gpio: dwapb: Don't use IRQ 0 as valid Linux interrupt
2020-05-19 13:12 [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 2/4] gpio: dwapb: avoid error message for optional IRQ Andy Shevchenko
@ 2020-05-19 13:12 ` Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 4/4] gpio: dwapb: Remove unneeded has_irq member in struct dwapb_port_property Andy Shevchenko
2020-05-25 9:05 ` [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Linus Walleij
3 siblings, 0 replies; 5+ messages in thread
From: Andy Shevchenko @ 2020-05-19 13:12 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, linux-gpio
Cc: Andy Shevchenko, Serge Semin
IRQ 0 is not valid in Linux interrupt number space.
Refactor the code with this kept in mind.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Serge Semin <fancer.lancer@gmail.com>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
---
v3: appended tags (Serge)
drivers/gpio/gpio-dwapb.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index 944dae80d687..d3765672c42b 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -417,7 +417,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
int i;
for (i = 0; i < pp->ngpio; i++) {
- if (pp->irq[i] >= 0)
+ if (pp->irq[i])
irq_set_chained_handler_and_data(pp->irq[i],
dwapb_irq_handler, gpio);
}
@@ -538,20 +538,20 @@ static void dwapb_get_irq(struct device *dev, struct fwnode_handle *fwnode,
struct dwapb_port_property *pp)
{
struct device_node *np = NULL;
- int j;
+ int irq = -ENXIO, j;
if (fwnode_property_read_bool(fwnode, "interrupt-controller"))
np = to_of_node(fwnode);
for (j = 0; j < pp->ngpio; j++) {
- pp->irq[j] = -ENXIO;
-
if (np)
- pp->irq[j] = of_irq_get(np, j);
+ irq = of_irq_get(np, j);
else if (has_acpi_companion(dev))
- pp->irq[j] = platform_get_irq_optional(to_platform_device(dev), j);
+ irq = platform_get_irq_optional(to_platform_device(dev), j);
+ if (irq > 0)
+ pp->irq[j] = irq;
- if (pp->irq[j] >= 0)
+ if (pp->irq[j])
pp->has_irq = true;
}
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 4/4] gpio: dwapb: Remove unneeded has_irq member in struct dwapb_port_property
2020-05-19 13:12 [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 2/4] gpio: dwapb: avoid error message for optional IRQ Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 3/4] gpio: dwapb: Don't use IRQ 0 as valid Linux interrupt Andy Shevchenko
@ 2020-05-19 13:12 ` Andy Shevchenko
2020-05-25 9:05 ` [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Linus Walleij
3 siblings, 0 replies; 5+ messages in thread
From: Andy Shevchenko @ 2020-05-19 13:12 UTC (permalink / raw)
To: Linus Walleij, Bartosz Golaszewski, linux-gpio
Cc: Andy Shevchenko, Lee Jones, Serge Semin
has_irq member of struct dwapb_port_property is used only in one place,
so, make it local test instead and remove from the structure.
This local test is using memchr_inv() which is quite efficient in comparison
to the original loop and possible little overhead can be neglected.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Serge Semin <fancer.lancer@gmail.com>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
---
v3: appended tags (Serge, Lee)
drivers/gpio/gpio-dwapb.c | 14 +++++++-------
drivers/mfd/intel_quark_i2c_gpio.c | 1 -
include/linux/platform_data/gpio-dwapb.h | 1 -
3 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index d3765672c42b..1d8d55bd63aa 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -366,6 +366,11 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
irq_hw_number_t hwirq;
int err, i;
+ if (memchr_inv(pp->irq, 0, sizeof(pp->irq)) == NULL) {
+ dev_warn(gpio->dev, "no IRQ for port%d\n", pp->idx);
+ return;
+ }
+
gpio->domain = irq_domain_create_linear(fwnode, ngpio,
&irq_generic_chip_ops, gpio);
if (!gpio->domain)
@@ -501,7 +506,8 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
if (pp->idx == 0)
port->gc.set_config = dwapb_gpio_set_config;
- if (pp->has_irq)
+ /* Only port A can provide interrupts in all configurations of the IP */
+ if (pp->idx == 0)
dwapb_configure_irqs(gpio, port, pp);
err = gpiochip_add_data(&port->gc, port);
@@ -550,13 +556,7 @@ static void dwapb_get_irq(struct device *dev, struct fwnode_handle *fwnode,
irq = platform_get_irq_optional(to_platform_device(dev), j);
if (irq > 0)
pp->irq[j] = irq;
-
- if (pp->irq[j])
- pp->has_irq = true;
}
-
- if (!pp->has_irq)
- dev_warn(dev, "no irq for port%d\n", pp->idx);
}
static struct dwapb_platform_data *dwapb_gpio_get_pdata(struct device *dev)
diff --git a/drivers/mfd/intel_quark_i2c_gpio.c b/drivers/mfd/intel_quark_i2c_gpio.c
index 41326b48da55..84ca7902e1df 100644
--- a/drivers/mfd/intel_quark_i2c_gpio.c
+++ b/drivers/mfd/intel_quark_i2c_gpio.c
@@ -216,7 +216,6 @@ static int intel_quark_gpio_setup(struct pci_dev *pdev, struct mfd_cell *cell)
pdata->properties->ngpio = INTEL_QUARK_MFD_NGPIO;
pdata->properties->gpio_base = INTEL_QUARK_MFD_GPIO_BASE;
pdata->properties->irq[0] = pdev->irq;
- pdata->properties->has_irq = true;
pdata->properties->irq_shared = true;
cell->platform_data = pdata;
diff --git a/include/linux/platform_data/gpio-dwapb.h b/include/linux/platform_data/gpio-dwapb.h
index 3c606c450d05..ff1be737bad6 100644
--- a/include/linux/platform_data/gpio-dwapb.h
+++ b/include/linux/platform_data/gpio-dwapb.h
@@ -12,7 +12,6 @@ struct dwapb_port_property {
unsigned int ngpio;
unsigned int gpio_base;
int irq[32];
- bool has_irq;
bool irq_shared;
};
--
2.26.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration
2020-05-19 13:12 [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Andy Shevchenko
` (2 preceding siblings ...)
2020-05-19 13:12 ` [PATCH v3 4/4] gpio: dwapb: Remove unneeded has_irq member in struct dwapb_port_property Andy Shevchenko
@ 2020-05-25 9:05 ` Linus Walleij
3 siblings, 0 replies; 5+ messages in thread
From: Linus Walleij @ 2020-05-25 9:05 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Bartosz Golaszewski, open list:GPIO SUBSYSTEM, Serge Semin
On Tue, May 19, 2020 at 3:12 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> Add missed acpi_gpiochip_free_interrupts() call when unregistering ports.
>
> While at it, drop extra check to call acpi_gpiochip_request_interrupts().
> There is no need to have an additional check to call
> acpi_gpiochip_request_interrupts(). Even without any interrupts available
> the registered ACPI Event handlers can be useful for debugging purposes.
>
> Fixes: e6cb3486f5a1 ("gpio: dwapb: add gpio-signaled acpi event support")
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Acked-by: Serge Semin <fancer.lancer@gmail.com>
> Tested-by: Serge Semin <fancer.lancer@gmail.com>
> ---
> v3: appended tags (Serge)
All four patches applied, thanks!
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-05-25 9:05 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-19 13:12 [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 2/4] gpio: dwapb: avoid error message for optional IRQ Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 3/4] gpio: dwapb: Don't use IRQ 0 as valid Linux interrupt Andy Shevchenko
2020-05-19 13:12 ` [PATCH v3 4/4] gpio: dwapb: Remove unneeded has_irq member in struct dwapb_port_property Andy Shevchenko
2020-05-25 9:05 ` [PATCH v3 1/4] gpio: dwapb: Call acpi_gpiochip_free_interrupts() on GPIO chip de-registration Linus Walleij
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.