The patch below does not apply to the 5.4-stable tree. If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to stable@vger.kernel.org.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a95881d6aa2c000e3649f27a1a7329cf356e6bb3 Mon Sep 17 00:00:00 2001
From: Douglas Anderson dianders@chromium.org Date: Thu, 14 Jan 2021 19:16:23 -0800 Subject: [PATCH] pinctrl: qcom: Properly clear "intr_ack_high" interrupts when unmasking
In commit 4b7618fdc7e6 ("pinctrl: qcom: Add irq_enable callback for msm gpio") we tried to Ack interrupts during unmask. However, that patch forgot to check "intr_ack_high" so, presumably, it only worked for a certain subset of SoCs.
Let's add a small accessor so we don't need to open-code the logic in both places.
This was found by code inspection. I don't have any access to the hardware in question nor software that needs the Ack during unmask.
Fixes: 4b7618fdc7e6 ("pinctrl: qcom: Add irq_enable callback for msm gpio") Signed-off-by: Douglas Anderson dianders@chromium.org Reviewed-by: Maulik Shah mkshah@codeaurora.org Tested-by: Maulik Shah mkshah@codeaurora.org Reviewed-by: Stephen Boyd swboyd@chromium.org Reviewed-by: Bjorn Andersson bjorn.andersson@linaro.org Link: https://lore.kernel.org/r/20210114191601.v7.3.I32d0f4e174d45363b49ab611a13c3... Signed-off-by: Linus Walleij linus.walleij@linaro.org
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c index 2f363c28d9d9..192ed31eabf4 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.c +++ b/drivers/pinctrl/qcom/pinctrl-msm.c @@ -96,6 +96,14 @@ MSM_ACCESSOR(intr_cfg) MSM_ACCESSOR(intr_status) MSM_ACCESSOR(intr_target)
+static void msm_ack_intr_status(struct msm_pinctrl *pctrl, + const struct msm_pingroup *g) +{ + u32 val = g->intr_ack_high ? BIT(g->intr_status_bit) : 0; + + msm_writel_intr_status(val, pctrl, g); +} + static int msm_get_groups_count(struct pinctrl_dev *pctldev) { struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev); @@ -797,7 +805,7 @@ static void msm_gpio_irq_clear_unmask(struct irq_data *d, bool status_clear) * when the interrupt is not in use. */ if (status_clear) - msm_writel_intr_status(0, pctrl, g); + msm_ack_intr_status(pctrl, g);
val = msm_readl_intr_cfg(pctrl, g); val |= BIT(g->intr_raw_status_bit); @@ -890,7 +898,6 @@ static void msm_gpio_irq_ack(struct irq_data *d) struct msm_pinctrl *pctrl = gpiochip_get_data(gc); const struct msm_pingroup *g; unsigned long flags; - u32 val;
if (test_bit(d->hwirq, pctrl->skip_wake_irqs)) { if (test_bit(d->hwirq, pctrl->dual_edge_irqs)) @@ -902,8 +909,7 @@ static void msm_gpio_irq_ack(struct irq_data *d)
raw_spin_lock_irqsave(&pctrl->lock, flags);
- val = g->intr_ack_high ? BIT(g->intr_status_bit) : 0; - msm_writel_intr_status(val, pctrl, g); + msm_ack_intr_status(pctrl, g);
if (test_bit(d->hwirq, pctrl->dual_edge_irqs)) msm_gpio_update_dual_edge_pos(pctrl, g, d);
Hi,
On Mon, Jan 25, 2021 at 6:41 AM gregkh@linuxfoundation.org wrote:
The patch below does not apply to the 5.4-stable tree. If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to stable@vger.kernel.org.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a95881d6aa2c000e3649f27a1a7329cf356e6bb3 Mon Sep 17 00:00:00 2001 From: Douglas Anderson dianders@chromium.org Date: Thu, 14 Jan 2021 19:16:23 -0800 Subject: [PATCH] pinctrl: qcom: Properly clear "intr_ack_high" interrupts when unmasking
I think for 5.4 the most expedient thing is to take these two:
a95881d6aa2c pinctrl: qcom: Properly clear "intr_ack_high" interrupts when unmasking 4079d35fa4fc pinctrl: qcom: No need to read-modify-write the interrupt status
Then it should apply cleanly and you'll get this one fix.
After fixing, you might hit the next failure when trying to apply ("pinctrl: qcom: Don't clear pending interrupts when enabling"). That one might be slightly harder to backport since it interacts with the PDC patches. Presumably anyone running a real system on 5.4 also has the PDC patches backported so they can get wakeup, but getting all the PDC support in 5.4 stable would probably be too much of a "feature" for linux-stable? In any case, my default answer for that I'd be happy to help review a backport if someone saw a benefit but I won't attempt it myself.
-Doug
On Mon, Jan 25, 2021 at 08:26:55AM -0800, Doug Anderson wrote:
Hi,
On Mon, Jan 25, 2021 at 6:41 AM gregkh@linuxfoundation.org wrote:
The patch below does not apply to the 5.4-stable tree. If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to stable@vger.kernel.org.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a95881d6aa2c000e3649f27a1a7329cf356e6bb3 Mon Sep 17 00:00:00 2001 From: Douglas Anderson dianders@chromium.org Date: Thu, 14 Jan 2021 19:16:23 -0800 Subject: [PATCH] pinctrl: qcom: Properly clear "intr_ack_high" interrupts when unmasking
I think for 5.4 the most expedient thing is to take these two:
a95881d6aa2c pinctrl: qcom: Properly clear "intr_ack_high" interrupts when unmasking 4079d35fa4fc pinctrl: qcom: No need to read-modify-write the interrupt status
Then it should apply cleanly and you'll get this one fix.
After fixing, you might hit the next failure when trying to apply ("pinctrl: qcom: Don't clear pending interrupts when enabling"). That one might be slightly harder to backport since it interacts with the PDC patches. Presumably anyone running a real system on 5.4 also has the PDC patches backported so they can get wakeup, but getting all the PDC support in 5.4 stable would probably be too much of a "feature" for linux-stable? In any case, my default answer for that I'd be happy to help review a backport if someone saw a benefit but I won't attempt it myself.
Ok, I'll just not worry about these for 5.4.y for now, thanks!
greg k-h
linux-stable-mirror@lists.linaro.org