2019-01-04 12:37:07

by Matti Vaittinen

[permalink] [raw]
Subject: [PATCH] regmap: regmap-irq: Make irq-type callbak optional

Do not register type setting callback if HW does not support
setting the irq type. IRQ core can then handle cases where
type setting is not supported and no regmap-irq specific handling
is required.

Signed-off-by: Matti Vaittinen <[email protected]>
---
drivers/base/regmap/regmap-irq.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c
index d2d0014b0d23..a387ee499b5c 100644
--- a/drivers/base/regmap/regmap-irq.c
+++ b/drivers/base/regmap/regmap-irq.c
@@ -322,7 +322,6 @@ static const struct irq_chip regmap_irq_chip = {
.irq_bus_sync_unlock = regmap_irq_sync_unlock,
.irq_disable = regmap_irq_disable,
.irq_enable = regmap_irq_enable,
- .irq_set_type = regmap_irq_set_type,
.irq_set_wake = regmap_irq_set_wake,
};

@@ -560,6 +559,9 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
d->chip = chip;
d->irq_base = irq_base;

+ if (num_type_reg)
+ d->irq_chip.irq_set_type = regmap_irq_set_type;
+
if (chip->irq_reg_stride)
d->irq_reg_stride = chip->irq_reg_stride;
else
--
2.14.3


--
Matti Vaittinen
ROHM Semiconductors

~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~


2019-01-04 12:49:11

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH] regmap: regmap-irq: Make irq-type callbak optional

On Fri, Jan 04, 2019 at 12:31:15PM +0200, Matti Vaittinen wrote:
> Do not register type setting callback if HW does not support
> setting the irq type. IRQ core can then handle cases where
> type setting is not supported and no regmap-irq specific handling
> is required.
>
> Signed-off-by: Matti Vaittinen <[email protected]>
> ---
> drivers/base/regmap/regmap-irq.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c
> index d2d0014b0d23..a387ee499b5c 100644
> --- a/drivers/base/regmap/regmap-irq.c
> +++ b/drivers/base/regmap/regmap-irq.c
> @@ -322,7 +322,6 @@ static const struct irq_chip regmap_irq_chip = {
> .irq_bus_sync_unlock = regmap_irq_sync_unlock,
> .irq_disable = regmap_irq_disable,
> .irq_enable = regmap_irq_enable,
> - .irq_set_type = regmap_irq_set_type,
> .irq_set_wake = regmap_irq_set_wake,
> };
>
> @@ -560,6 +559,9 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,
> d->chip = chip;
> d->irq_base = irq_base;
>
> + if (num_type_reg)
> + d->irq_chip.irq_set_type = regmap_irq_set_type;
> +
> if (chip->irq_reg_stride)
> d->irq_reg_stride = chip->irq_reg_stride;
> else

Afraid this also causes regressions at my end, still having a bit
of a look but it looks like some how this prevents properties of the
IRQ getting passed along which causes my system to not probe
properly with:

genirq: Flags mismatch irq 58. 00002088 (cs35l35) vs. 00002088 (cs35l35)
cs35l35 0-0041: Failed to request IRQ: -16

Thanks,
Charles

> --
> 2.14.3
>
>
> --
> Matti Vaittinen
> ROHM Semiconductors
>
> ~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~

2019-01-04 13:43:36

by Matti Vaittinen

[permalink] [raw]
Subject: Re: [PATCH] regmap: regmap-irq: Make irq-type callbak optional

Big thanks for testing this so early Charles =) It's nice to get this
report before I broke things more widely!

On Fri, Jan 04, 2019 at 11:32:07AM +0000, Charles Keepax wrote:
> On Fri, Jan 04, 2019 at 11:14:43AM +0000, Charles Keepax wrote:
> > On Fri, Jan 04, 2019 at 12:31:15PM +0200, Matti Vaittinen wrote:
> > > + if (num_type_reg)
> > > + d->irq_chip.irq_set_type = regmap_irq_set_type;
> > > +
> >
> > Afraid this also causes regressions at my end, still having a bit
> > of a look but it looks like some how this prevents properties of the
> > IRQ getting passed along which causes my system to not probe
> > properly with:
> >
> > genirq: Flags mismatch irq 58. 00002088 (cs35l35) vs. 00002088 (cs35l35)
> > cs35l35 0-0041: Failed to request IRQ: -16
> >
>
> My case is a shared IRQ with 2 amps (cs35l35) connected to a CODEC
> (wm8280).
>
> So looks like the issue is if you don't have a set_type callback
> then the IRQ ends up as IRQF_TRIGGER_NONE, which causes the
> second IRQ to fail the middle check here in __setup_irq:
>
> if (!((old->flags & new->flags) & IRQF_SHARED) ||
> (oldtype != (new->flags & IRQF_TRIGGER_MASK)) ||
> ((old->flags ^ new->flags) & IRQF_ONESHOT)) {

Right. Thanks for pinpointing the issue. This thing is a bit fishy.
There should not be a need for a 'fake type setting callback' when we
have shared IRQ with two or more devices who actually agree on IRQ type
- assuming the HW default irq type is correct.

For me the correct thing would that the HW default type should be
stored in desc and returned by irqd_get_trigger_type instead of
IRQF_TRIGGER_NONE. But I have no idea how that would be nicely
implemented w/o going trough all the irqchips.

The other option would be being more permissive when IRQF_TRIGGER_NONE
is set as oldtype. But I am not feeling like an expert on this area.

> Kinda inclined to just leave the fix as currently submitted and
> just drop this patch? But I can do more testing etc. if we want
> to push further down this road.

Huge thanks for the offer Charles - I do really appreciate the testing.
Touching the IRQ core sounds quite scary to me. Changing it feels risky
and would probably involve bunch of other people too. 10-years ago I
would have taken the challenge and tried to get this "correct" - but
nowadays I have learned to accept some small shortcuts :p

I will gladly follow things and participate the discussions/development
if someone wants to see how this should be done - but I don't think I
have the energy and time to drive this change further... So Mark, please
just drop this patch and keep the original fix unless you want to drive
this further yourself =)


Br,
Matti Vaittinen

>
> Thanks,
> Charles

--
Matti Vaittinen
ROHM Semiconductors

~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~

2019-01-04 13:43:49

by Charles Keepax

[permalink] [raw]
Subject: Re: [PATCH] regmap: regmap-irq: Make irq-type callbak optional

On Fri, Jan 04, 2019 at 11:14:43AM +0000, Charles Keepax wrote:
> On Fri, Jan 04, 2019 at 12:31:15PM +0200, Matti Vaittinen wrote:
> > + if (num_type_reg)
> > + d->irq_chip.irq_set_type = regmap_irq_set_type;
> > +
>
> Afraid this also causes regressions at my end, still having a bit
> of a look but it looks like some how this prevents properties of the
> IRQ getting passed along which causes my system to not probe
> properly with:
>
> genirq: Flags mismatch irq 58. 00002088 (cs35l35) vs. 00002088 (cs35l35)
> cs35l35 0-0041: Failed to request IRQ: -16
>

My case is a shared IRQ with 2 amps (cs35l35) connected to a CODEC
(wm8280).

So looks like the issue is if you don't have a set_type callback
then the IRQ ends up as IRQF_TRIGGER_NONE, which causes the
second IRQ to fail the middle check here in __setup_irq:

if (!((old->flags & new->flags) & IRQF_SHARED) ||
(oldtype != (new->flags & IRQF_TRIGGER_MASK)) ||
((old->flags ^ new->flags) & IRQF_ONESHOT)) {

Kinda inclined to just leave the fix as currently submitted and
just drop this patch? But I can do more testing etc. if we want
to push further down this road.

Thanks,
Charles