forked from luck/tmp_suning_uos_patched
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@gmail.com> Cc: Grygorii Strashko <grygorii.strashko@ti.com> Cc: "H. Nikolaus Schaller" <hns@goldelico.com> Cc: Robert Nelson <robertcnelson@gmail.com> Cc: Yongqin Liu <yongqin.liu@linaro.org> Fixes: effe89e40037 ("soc: ti: omap-prm: Fix occasional abort on reset deassert for dra7 iva") Reported-by: Matti Vaittinen <mazziesaccount@gmail.com> Tested-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
1d8f4447e8
commit
d5f4b27c3c
|
@ -509,26 +509,29 @@ 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 status to be set */
|
||||
/* wait for the reset bit to clear */
|
||||
ret = readl_relaxed_poll_timeout_atomic(reset->prm->base +
|
||||
reset->prm->data->rstst,
|
||||
v, v & BIT(st_bit), 1,
|
||||
OMAP_RESET_MAX_WAIT);
|
||||
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);
|
||||
|
||||
exit:
|
||||
if (reset->clkdm) {
|
||||
/* At least dra7 iva needs a delay before clkdm idle */
|
||||
if (has_rstst)
|
||||
udelay(1);
|
||||
pdata->clkdm_allow_idle(reset->clkdm);
|
||||
/* wait for the status to be set */
|
||||
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 (reset->clkdm)
|
||||
pdata->clkdm_allow_idle(reset->clkdm);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user