linux/drivers/pinctrl/qcom
Stephan Gerhold c1368383cd pinctrl: qcom: Clear latched interrupt status when changing IRQ type
commit e225128c3f upstream.

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@vger.kernel.org
Fixes: cf9d052aa6 ("pinctrl: qcom: Don't clear pending interrupts when enabling")
Reported-by: Bjorn Andersson <bjorn.andersson@oss.qualcomm.com>
Closes: https://lore.kernel.org/r/20250227-tlmm-test-v1-1-d18877b4a5db@oss.qualcomm.com/
Signed-off-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Tested-by: Bjorn Andersson <andersson@kernel.org>
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/20250312-pinctrl-msm-type-latch-v1-1-ce87c561d3d7@linaro.org
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-04-20 10:15:58 +02:00
..
Kconfig pinctrl: qcom: Introduce SM4250 LPI pinctrl driver 2024-06-26 12:41:07 +02:00
Kconfig.msm pinctrl: qcom: sm4450: dd SM4450 pinctrl driver 2023-12-20 12:03:03 +01:00
Makefile pinctrl: qcom: Introduce SM4250 LPI pinctrl driver 2024-06-26 12:41:07 +02:00
pinctrl-apq8064.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-apq8084.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq4019.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq5018.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq5332.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq6018.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq8064.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq8074.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-ipq9574.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-lpass-lpi.c pinctrl: qcom: lpass-lpi: increase MAX_NR_GPIO to 32 2024-07-03 14:31:09 +02:00
pinctrl-lpass-lpi.h pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-mdm9607.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-mdm9615.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm.c pinctrl: qcom: Clear latched interrupt status when changing IRQ type 2025-04-20 10:15:58 +02:00
pinctrl-msm.h pinctrl: qcom: handle intr_target_reg wakeup_present/enable bits 2023-11-13 15:01:37 +01:00
pinctrl-msm8x74.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8226.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8660.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8909.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8916.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8953.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8960.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8976.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8994.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8996.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-msm8998.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-qcm2290.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-qcs404.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-qdf2xxx.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-qdu1000.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sa8775p.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sc7180.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sc7280-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sc7280.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sc8180x.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sc8280xp-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sc8280xp.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sdm660.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sdm670.c pinctrl: qcom: sdm670: add pdc wakeirq map 2024-06-17 09:25:45 +02:00
pinctrl-sdm845.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sdx55.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sdx65.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sdx75.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm4250-lpass-lpi.c pinctrl: qcom: Introduce SM4250 LPI pinctrl driver 2024-06-26 12:41:07 +02:00
pinctrl-sm4450.c pinctrl: qcom: sm4450: dd SM4450 pinctrl driver 2023-12-20 12:03:03 +01:00
pinctrl-sm6115-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sm6115.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm6125.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm6350.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm6375.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm7150.c pinctrl: qcom: pinctrl-sm7150: Fix sdc1 and ufs special pins regs 2024-05-03 09:55:04 +02:00
pinctrl-sm8150.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm8250-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sm8250.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm8350-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sm8350.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm8450-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sm8450.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm8550-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sm8550.c pinctrl: qcom/msm: Convert to platform remove callback returning void 2023-10-10 15:47:49 +02:00
pinctrl-sm8650-lpass-lpi.c pinctrl: qcom: lpass-lpi: Remove unused member in struct lpi_pingroup 2023-12-01 14:59:53 +01:00
pinctrl-sm8650.c pinctrl: qcom: Introduce the SM8650 Top Level Mode Multiplexer driver 2023-11-13 15:05:13 +01:00
pinctrl-spmi-gpio.c pinctrl: qcom-pmic-gpio: add support for PM8937 2024-12-14 20:04:02 +01:00
pinctrl-spmi-mpp.c pinctrl: qcom: spmi-mpp: Add PM8937 compatible 2024-12-14 20:04:02 +01:00
pinctrl-ssbi-gpio.c pinctrl: qcom: ssbi-gpio: Convert to platform remove callback returning void 2023-10-10 15:43:31 +02:00
pinctrl-ssbi-mpp.c pinctrl: qcom: ssbi-mpp: Convert to platform remove callback returning void 2023-10-10 15:43:56 +02:00
pinctrl-x1e80100.c pinctrl: qcom: x1e80100: Bypass PDC wakeup parent for now 2024-09-02 11:07:48 +02:00