On Wed, Mar 12, 2025 at 2:19 PM Stephan Gerhold <stephan.gerhold@xxxxxxxxxx> wrote: > When submitting the TLMM test driver, Bjorn reported that some of the test > cases are failing for GPIOs that not are backed by PDC (i.e. "non-wakeup" > GPIOs that are handled directly in pinctrl-msm). Basically, lingering > latched interrupt state is still being delivered at IRQ request time, e.g.: > > ok 1 tlmm_test_silent_rising > tlmm_test_silent_falling: ASSERTION FAILED at drivers/pinctrl/qcom/tlmm-test.c:178 > Expected atomic_read(&priv->intr_count) == 0, but > atomic_read(&priv->intr_count) == 1 (0x1) > not ok 2 tlmm_test_silent_falling > tlmm_test_silent_low: ASSERTION FAILED at drivers/pinctrl/qcom/tlmm-test.c:178 > Expected atomic_read(&priv->intr_count) == 0, but > atomic_read(&priv->intr_count) == 1 (0x1) > not ok 3 tlmm_test_silent_low > ok 4 tlmm_test_silent_high > > Whether to report interrupts that came in while the IRQ was unclaimed > doesn't seem to be well-defined in the Linux IRQ API. However, looking > closer at these specific cases, we're actually reporting events that do not > match the interrupt type requested by the driver: > > 1. After "ok 1 tlmm_test_silent_rising", the GPIO is in low state and > configured for IRQF_TRIGGER_RISING. > > 2. (a) In preparation for "tlmm_test_silent_falling", the GPIO is switched > to high state. The rising interrupt gets latched. > (b) The GPIO is re-configured for IRQF_TRIGGER_FALLING, but the latched > interrupt isn't cleared. > (c) The IRQ handler is called for the latched interrupt, but there > wasn't any falling edge. > > 3. (a) For "tlmm_test_silent_low", the GPIO remains in high state. > (b) The GPIO is re-configured for IRQF_TRIGGER_LOW. This seems to > result in a phantom interrupt that gets latched. > (c) The IRQ handler is called for the latched interrupt, but the GPIO > isn't in low state. > > 4. (a) For "tlmm_test_silent_high", the GPIO is switched to low state. > (b) This doesn't result in a latched interrupt, because RAW_STATUS_EN > was cleared when masking the level-triggered interrupt. > > Fix this by clearing the interrupt state whenever making any changes to the > interrupt configuration. This includes previously disabled interrupts, but > also any changes to interrupt polarity or detection type. > > With this change, all 16 test cases are now passing for the non-wakeup > GPIOs in the TLMM. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: cf9d052aa600 ("pinctrl: qcom: Don't clear pending interrupts when enabling") > Reported-by: Bjorn Andersson <bjorn.andersson@xxxxxxxxxxxxxxxx> > Closes: https://lore.kernel.org/r/20250227-tlmm-test-v1-1-d18877b4a5db@xxxxxxxxxxxxxxxx/ > Signed-off-by: Stephan Gerhold <stephan.gerhold@xxxxxxxxxx> Patch applied! Yours, Linus Walleij