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 ~~~
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 ~~~
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 ~~~
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