* [PATCH] gpio: siox: Pass irqchip when adding gpiochip
@ 2019-06-25 10:53 Linus Walleij
2019-06-25 19:33 ` Uwe Kleine-König
0 siblings, 1 reply; 5+ messages in thread
From: Linus Walleij @ 2019-06-25 10:53 UTC (permalink / raw)
To: linux-gpio
Cc: Bartosz Golaszewski, Linus Walleij, Uwe Kleine-König,
Thierry Reding
We need to convert all old gpio irqchips to pass the irqchip
setup along when adding the gpio_chip.
For chained irqchips this is a pretty straight-forward
conversion.
The siox GPIO driver passes a IRQ_TYPE_EDGE_RISING as
default IRQ trigger type which seems wrong, as consumers
should explicitly set this up, so set IRQ_TYPE_NONE instead.
Also gpiochip_remove() was called on the errorpath if
gpiochip_add() failed: this is wrong, if the chip failed
to add it is not there so it should not be removed.
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Cc: Thierry Reding <treding@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
drivers/gpio/gpio-siox.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
index fb4e318ab028..e5c85dc932e8 100644
--- a/drivers/gpio/gpio-siox.c
+++ b/drivers/gpio/gpio-siox.c
@@ -211,6 +211,7 @@ static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
static int gpio_siox_probe(struct siox_device *sdevice)
{
struct gpio_siox_ddata *ddata;
+ struct gpio_irq_chip *girq;
int ret;
ddata = devm_kzalloc(&sdevice->dev, sizeof(*ddata), GFP_KERNEL);
@@ -239,20 +240,16 @@ static int gpio_siox_probe(struct siox_device *sdevice)
ddata->ichip.irq_unmask = gpio_siox_irq_unmask;
ddata->ichip.irq_set_type = gpio_siox_irq_set_type;
+ girq = &ddata->gchip.irq;
+ girq->chip = &ddata->ichip;
+ girq->default_type = IRQ_TYPE_NONE;
+ girq->handler = handle_level_irq;
+
ret = gpiochip_add(&ddata->gchip);
if (ret) {
dev_err(&sdevice->dev,
"Failed to register gpio chip (%d)\n", ret);
- goto err_gpiochip;
- }
-
- ret = gpiochip_irqchip_add(&ddata->gchip, &ddata->ichip,
- 0, handle_level_irq, IRQ_TYPE_EDGE_RISING);
- if (ret) {
- dev_err(&sdevice->dev,
- "Failed to register irq chip (%d)\n", ret);
-err_gpiochip:
- gpiochip_remove(&ddata->gchip);
+ return ret;
}
return ret;
--
2.20.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: siox: Pass irqchip when adding gpiochip
2019-06-25 10:53 [PATCH] gpio: siox: Pass irqchip when adding gpiochip Linus Walleij
@ 2019-06-25 19:33 ` Uwe Kleine-König
2019-06-26 8:05 ` Linus Walleij
2019-06-26 19:36 ` Thorsten Scherer
0 siblings, 2 replies; 5+ messages in thread
From: Uwe Kleine-König @ 2019-06-25 19:33 UTC (permalink / raw)
To: Linus Walleij
Cc: linux-gpio, Bartosz Golaszewski, Thierry Reding, Thorsten Scherer
Hello Linus,
On Tue, Jun 25, 2019 at 12:53:46PM +0200, Linus Walleij wrote:
> We need to convert all old gpio irqchips to pass the irqchip
> setup along when adding the gpio_chip.
>
> For chained irqchips this is a pretty straight-forward
> conversion.
>
> The siox GPIO driver passes a IRQ_TYPE_EDGE_RISING as
> default IRQ trigger type which seems wrong, as consumers
> should explicitly set this up, so set IRQ_TYPE_NONE instead.
>
> Also gpiochip_remove() was called on the errorpath if
> gpiochip_add() failed: this is wrong, if the chip failed
> to add it is not there so it should not be removed.
So we have a bugfix (gpiochip_remove() in error path), a change of
default behaviour (IRQ_TYPE_EDGE_RISING -> IRQ_TYPE_NONE) and a cleanup
for an API change (I'm guessing here) in a single patch. :-|
@Thorsten: I'm not entirely sure if there is code relying on the default
IRQ_TYPE_EDGE_RISING. Do you know off-hand?
Best regards
Uwe
> diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
> index fb4e318ab028..e5c85dc932e8 100644
> --- a/drivers/gpio/gpio-siox.c
> +++ b/drivers/gpio/gpio-siox.c
> @@ -211,6 +211,7 @@ static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
> static int gpio_siox_probe(struct siox_device *sdevice)
> {
> struct gpio_siox_ddata *ddata;
> + struct gpio_irq_chip *girq;
> int ret;
>
> ddata = devm_kzalloc(&sdevice->dev, sizeof(*ddata), GFP_KERNEL);
> @@ -239,20 +240,16 @@ static int gpio_siox_probe(struct siox_device *sdevice)
> ddata->ichip.irq_unmask = gpio_siox_irq_unmask;
> ddata->ichip.irq_set_type = gpio_siox_irq_set_type;
>
> + girq = &ddata->gchip.irq;
> + girq->chip = &ddata->ichip;
> + girq->default_type = IRQ_TYPE_NONE;
> + girq->handler = handle_level_irq;
> +
> ret = gpiochip_add(&ddata->gchip);
> if (ret) {
> dev_err(&sdevice->dev,
> "Failed to register gpio chip (%d)\n", ret);
> - goto err_gpiochip;
> - }
> -
> - ret = gpiochip_irqchip_add(&ddata->gchip, &ddata->ichip,
> - 0, handle_level_irq, IRQ_TYPE_EDGE_RISING);
> - if (ret) {
> - dev_err(&sdevice->dev,
> - "Failed to register irq chip (%d)\n", ret);
> -err_gpiochip:
> - gpiochip_remove(&ddata->gchip);
> + return ret;
> }
>
> return ret;
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: siox: Pass irqchip when adding gpiochip
2019-06-25 19:33 ` Uwe Kleine-König
@ 2019-06-26 8:05 ` Linus Walleij
2019-06-26 8:10 ` Uwe Kleine-König
2019-06-26 19:36 ` Thorsten Scherer
1 sibling, 1 reply; 5+ messages in thread
From: Linus Walleij @ 2019-06-26 8:05 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Thierry Reding,
Thorsten Scherer
On Tue, Jun 25, 2019 at 9:33 PM Uwe Kleine-König
<u.kleine-koenig@pengutronix.de> wrote:
> On Tue, Jun 25, 2019 at 12:53:46PM +0200, Linus Walleij wrote:
> > The siox GPIO driver passes a IRQ_TYPE_EDGE_RISING as
> > default IRQ trigger type which seems wrong, as consumers
> > should explicitly set this up, so set IRQ_TYPE_NONE instead.
> >
> > Also gpiochip_remove() was called on the errorpath if
> > gpiochip_add() failed: this is wrong, if the chip failed
> > to add it is not there so it should not be removed.
>
> So we have a bugfix (gpiochip_remove() in error path), a change of
> default behaviour (IRQ_TYPE_EDGE_RISING -> IRQ_TYPE_NONE) and a cleanup
> for an API change (I'm guessing here) in a single patch. :-|
Yes I tend to do that to save time because I am a bit overwhelmed
by all the stuff that falls upwards to the GPIO maintainer.
More often than not there is zero feedback from the maintainer(s)
of the drivers, and the kernel looks better after than before.
But since you provide some feedback I'll just go and split
the patch.
> @Thorsten: I'm not entirely sure if there is code relying on the default
> IRQ_TYPE_EDGE_RISING. Do you know off-hand?
I saw that the driver has #include <linux/of.h> (hm seems unused) so
if this is used on devicetree systems with normal twocell irqchips then
there shouldn't be a need for any default type. The default type
is only used with board files. The siox seems not even possible
to use with board files (no platform data path).
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: siox: Pass irqchip when adding gpiochip
2019-06-26 8:05 ` Linus Walleij
@ 2019-06-26 8:10 ` Uwe Kleine-König
0 siblings, 0 replies; 5+ messages in thread
From: Uwe Kleine-König @ 2019-06-26 8:10 UTC (permalink / raw)
To: Linus Walleij
Cc: open list:GPIO SUBSYSTEM, Bartosz Golaszewski, Thierry Reding,
Thorsten Scherer
Hello Linus,
On Wed, Jun 26, 2019 at 10:05:42AM +0200, Linus Walleij wrote:
> On Tue, Jun 25, 2019 at 9:33 PM Uwe Kleine-König
> <u.kleine-koenig@pengutronix.de> wrote:
> > On Tue, Jun 25, 2019 at 12:53:46PM +0200, Linus Walleij wrote:
>
> > > The siox GPIO driver passes a IRQ_TYPE_EDGE_RISING as
> > > default IRQ trigger type which seems wrong, as consumers
> > > should explicitly set this up, so set IRQ_TYPE_NONE instead.
> > >
> > > Also gpiochip_remove() was called on the errorpath if
> > > gpiochip_add() failed: this is wrong, if the chip failed
> > > to add it is not there so it should not be removed.
> >
> > So we have a bugfix (gpiochip_remove() in error path), a change of
> > default behaviour (IRQ_TYPE_EDGE_RISING -> IRQ_TYPE_NONE) and a cleanup
> > for an API change (I'm guessing here) in a single patch. :-|
>
> Yes I tend to do that to save time because I am a bit overwhelmed
> by all the stuff that falls upwards to the GPIO maintainer.
>
> More often than not there is zero feedback from the maintainer(s)
> of the drivers, and the kernel looks better after than before.
>
> But since you provide some feedback I'll just go and split
> the patch.
\o/, thanks.
> > @Thorsten: I'm not entirely sure if there is code relying on the default
> > IRQ_TYPE_EDGE_RISING. Do you know off-hand?
>
> I saw that the driver has #include <linux/of.h> (hm seems unused) so
> if this is used on devicetree systems with normal twocell irqchips then
> there shouldn't be a need for any default type. The default type
> is only used with board files. The siox seems not even possible
> to use with board files (no platform data path).
I think the gpio irq is used from userspace. If you're convinced it
doesn't matter (and you describe that in the commit log) I'm willing to
believe you :-)
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio: siox: Pass irqchip when adding gpiochip
2019-06-25 19:33 ` Uwe Kleine-König
2019-06-26 8:05 ` Linus Walleij
@ 2019-06-26 19:36 ` Thorsten Scherer
1 sibling, 0 replies; 5+ messages in thread
From: Thorsten Scherer @ 2019-06-26 19:36 UTC (permalink / raw)
To: Uwe Kleine-König
Cc: Linus Walleij, linux-gpio, Bartosz Golaszewski, Thierry Reding
Hello,
On Tue, Jun 25, 2019 at 09:33:28PM +0200, Uwe Kleine-König wrote:
> Hello Linus,
>
> On Tue, Jun 25, 2019 at 12:53:46PM +0200, Linus Walleij wrote:
> > We need to convert all old gpio irqchips to pass the irqchip
> > setup along when adding the gpio_chip.
> >
> > For chained irqchips this is a pretty straight-forward
> > conversion.
> >
> > The siox GPIO driver passes a IRQ_TYPE_EDGE_RISING as
> > default IRQ trigger type which seems wrong, as consumers
> > should explicitly set this up, so set IRQ_TYPE_NONE instead.
> >
> > Also gpiochip_remove() was called on the errorpath if
> > gpiochip_add() failed: this is wrong, if the chip failed
> > to add it is not there so it should not be removed.
>
> So we have a bugfix (gpiochip_remove() in error path), a change of
> default behaviour (IRQ_TYPE_EDGE_RISING -> IRQ_TYPE_NONE) and a cleanup
> for an API change (I'm guessing here) in a single patch. :-|
>
> @Thorsten: I'm not entirely sure if there is code relying on the default
> IRQ_TYPE_EDGE_RISING. Do you know off-hand?
Didn't know off the top of my head. So I dug through some application
code. As far as I can tell, nothing relies on edge rising. But I would
not bet on it. And I don't know about code in the other departments.
>
> Best regards
> Uwe
Best regards
Thorsten
>
> > diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
> > index fb4e318ab028..e5c85dc932e8 100644
> > --- a/drivers/gpio/gpio-siox.c
> > +++ b/drivers/gpio/gpio-siox.c
> > @@ -211,6 +211,7 @@ static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
> > static int gpio_siox_probe(struct siox_device *sdevice)
> > {
> > struct gpio_siox_ddata *ddata;
> > + struct gpio_irq_chip *girq;
> > int ret;
> >
> > ddata = devm_kzalloc(&sdevice->dev, sizeof(*ddata), GFP_KERNEL);
> > @@ -239,20 +240,16 @@ static int gpio_siox_probe(struct siox_device *sdevice)
> > ddata->ichip.irq_unmask = gpio_siox_irq_unmask;
> > ddata->ichip.irq_set_type = gpio_siox_irq_set_type;
> >
> > + girq = &ddata->gchip.irq;
> > + girq->chip = &ddata->ichip;
> > + girq->default_type = IRQ_TYPE_NONE;
> > + girq->handler = handle_level_irq;
> > +
> > ret = gpiochip_add(&ddata->gchip);
> > if (ret) {
> > dev_err(&sdevice->dev,
> > "Failed to register gpio chip (%d)\n", ret);
> > - goto err_gpiochip;
> > - }
> > -
> > - ret = gpiochip_irqchip_add(&ddata->gchip, &ddata->ichip,
> > - 0, handle_level_irq, IRQ_TYPE_EDGE_RISING);
> > - if (ret) {
> > - dev_err(&sdevice->dev,
> > - "Failed to register irq chip (%d)\n", ret);
> > -err_gpiochip:
> > - gpiochip_remove(&ddata->gchip);
> > + return ret;
> > }
> >
> > return ret;
>
> --
> Pengutronix e.K. | Uwe Kleine-König |
> Industrial Linux Solutions | http://www.pengutronix.de/ |
--
Thorsten Scherer - Eckelmann AG
https://www.eckelmann.de
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-06-26 19:42 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-06-25 10:53 [PATCH] gpio: siox: Pass irqchip when adding gpiochip Linus Walleij
2019-06-25 19:33 ` Uwe Kleine-König
2019-06-26 8:05 ` Linus Walleij
2019-06-26 8:10 ` Uwe Kleine-König
2019-06-26 19:36 ` Thorsten Scherer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).