Patch "soc: ti: omap-prm: Fix external abort for am335x pruss" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    soc: ti: omap-prm: Fix external abort for am335x pruss

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     soc-ti-omap-prm-fix-external-abort-for-am335x-pruss.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 79afff3561635cbbfe6a3f1fcab891a9d93436a4
Author: Tony Lindgren <tony@xxxxxxxxxxx>
Date:   Thu Sep 30 11:30:03 2021 +0300

    soc: ti: omap-prm: Fix external abort for am335x pruss
    
    [ Upstream commit b232537074fcaf0c2837abbb217429c097bb7598 ]
    
    Starting with v5.15-rc1, we may now see some am335x beaglebone black
    device produce the following error on pruss probe:
    
    Unhandled fault: external abort on non-linefetch (0x1008) at 0xe0326000
    
    This has started with the enabling of pruss for am335x in the dts files.
    
    Turns out the is caused by the PRM reset handling not waiting for the
    reset bit to clear. To fix the issue, let's always wait for the reset
    bit to clear, even if there is a separate reset status register.
    
    We attempted to fix a similar issue for dra7 iva with a udelay() in
    commit effe89e40037 ("soc: ti: omap-prm: Fix occasional abort on reset
    deassert for dra7 iva"). There is no longer a need for the udelay()
    for dra7 iva reset either with the check added for reset bit clearing.
    
    Cc: Drew Fustini <pdp7pdp7@xxxxxxxxx>
    Cc: Grygorii Strashko <grygorii.strashko@xxxxxx>
    Cc: "H. Nikolaus Schaller" <hns@xxxxxxxxxxxxx>
    Cc: Robert Nelson <robertcnelson@xxxxxxxxx>
    Cc: Yongqin Liu <yongqin.liu@xxxxxxxxxx>
    Fixes: effe89e40037 ("soc: ti: omap-prm: Fix occasional abort on reset deassert for dra7 iva")
    Reported-by: Matti Vaittinen <mazziesaccount@xxxxxxxxx>
    Tested-by: Matti Vaittinen <matti.vaittinen@xxxxxxxxxxxxxxxxx>
    Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/soc/ti/omap_prm.c b/drivers/soc/ti/omap_prm.c
index fb067b5e4a97..4a782bfd753c 100644
--- a/drivers/soc/ti/omap_prm.c
+++ b/drivers/soc/ti/omap_prm.c
@@ -509,25 +509,28 @@ static int omap_reset_deassert(struct reset_controller_dev *rcdev,
 	writel_relaxed(v, reset->prm->base + reset->prm->data->rstctrl);
 	spin_unlock_irqrestore(&reset->lock, flags);
 
-	if (!has_rstst)
-		goto exit;
+	/* wait for the reset bit to clear */
+	ret = readl_relaxed_poll_timeout_atomic(reset->prm->base +
+						reset->prm->data->rstctrl,
+						v, !(v & BIT(id)), 1,
+						OMAP_RESET_MAX_WAIT);
+	if (ret)
+		pr_err("%s: timedout waiting for %s:%lu\n", __func__,
+		       reset->prm->data->name, id);
 
 	/* wait for the status to be set */
-	ret = readl_relaxed_poll_timeout_atomic(reset->prm->base +
+	if (has_rstst) {
+		ret = readl_relaxed_poll_timeout_atomic(reset->prm->base +
 						 reset->prm->data->rstst,
 						 v, v & BIT(st_bit), 1,
 						 OMAP_RESET_MAX_WAIT);
-	if (ret)
-		pr_err("%s: timedout waiting for %s:%lu\n", __func__,
-		       reset->prm->data->name, id);
+		if (ret)
+			pr_err("%s: timedout waiting for %s:%lu\n", __func__,
+			       reset->prm->data->name, id);
+	}
 
-exit:
-	if (reset->clkdm) {
-		/* At least dra7 iva needs a delay before clkdm idle */
-		if (has_rstst)
-			udelay(1);
+	if (reset->clkdm)
 		pdata->clkdm_allow_idle(reset->clkdm);
-	}
 
 	return ret;
 }



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux