Re: [PATCH v3 1/3] irqchip: qcom-pdc: Fix phantom irq when changing between rising/falling
From: Stephen Boyd
Date: Thu Dec 10 2020 - 16:12:33 EST
Quoting Douglas Anderson (2020-12-09 16:41:01)
> We have a problem if we use gpio-keys and configure wakeups such that
> we only want one edge to wake us up. AKA:
> wakeup-event-action = <EV_ACT_DEASSERTED>;
> wakeup-source;
>
> Specifically we end up with a phantom interrupt that blocks suspend if
> the line was already high and we want wakeups on rising edges (AKA we
> want the GPIO to go low and then high again before we wake up). The
> opposite is also problematic.
>
> Specifically, here's what's happening today:
> 1. Normally, gpio-keys configures to look for both edges. Due to the
> current workaround introduced in commit c3c0c2e18d94 ("pinctrl:
> qcom: Handle broken/missing PDC dual edge IRQs on sc7180"), if the
> line was high we'd configure for falling edges.
> 2. At suspend time, we change to look for rising edges.
> 3. After qcom_pdc_gic_set_type() runs, we get a phantom interrupt.
>
> We can solve this by just clearing the phantom interrupt.
>
> NOTE: it is possible that this could cause problems for a client with
> very specific needs, but there's not much we can do with this
> hardware. As an example, let's say the interrupt signal is currently
> high and the client is looking for falling edges. The client now
> changes to look for rising edges. The client could possibly expect
> that if the line has a short pulse low (and back high) that it would
> always be detected. Specifically no matter when the pulse happened,
> it should either have tripped the (old) falling edge trigger or the
> (new) rising edge trigger. We will simply not trip it. We could
> narrow down the race a bit by polling our parent before changing
> types, but no matter what we do there will still be a period of time
> where we can't tell the difference between a real transition (or more
> than one transition) and the phantom.
>
> Fixes: f55c73aef890 ("irqchip/pdc: Add PDC interrupt controller for QCOM SoCs")
> Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
> Reviewed-by: Maulik Shah <mkshah@xxxxxxxxxxxxxx>
> Tested-by: Maulik Shah <mkshah@xxxxxxxxxxxxxx>
> ---
Reviewed-by: Stephen Boyd <swboyd@xxxxxxxxxxxx>