Hi Matti, Tony, On 9/21/21 2:47 AM, Tony Lindgren wrote: > * Matti Vaittinen <mazziesaccount@xxxxxxxxx> [210920 08:23]: >> Finally, adding the udelay(100); (as Tony suggested) at the end of the >> omap_reset_deassert() did make the oops go away even when pruss_tm was >> enabled. I don't know what would be a proper fix though. I have been able to boot v5.15-rc1 just fine on my BBB without any additional changes [1]. May I ask what is your BBB board version? My board is rev.A5C. I vaguely remember from all those years ago when I first enabled PRUSS on AM335x that some earlier BBB versions had some issues around PRUSS. regards Suman [1] https://marc.info/?l=linux-omap&m=163223991005545&w=2 > > The following patch works for me on bbb with the following test script: > > #!/bin/sh > > module="4a326000.target-module" > driver="/sys/bus/platform/drivers/ti-sysc" > > while true; do > echo ${module} > ${driver}/bind > echo ${module} > ${driver}/unbind > done > > It also allows leaving out the udelay for dra7 iva reset. Care to try > this and see if it helps? > > Regards, > > Tony > > 8< ----------------- > diff --git a/drivers/soc/ti/omap_prm.c b/drivers/soc/ti/omap_prm.c > --- a/drivers/soc/ti/omap_prm.c > +++ b/drivers/soc/ti/omap_prm.c > @@ -825,26 +825,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 */ > - ret = readl_relaxed_poll_timeout_atomic(reset->prm->base + > + if (has_rstst) { > + /* wait for the status to be set */ > + 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); > - > -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); > + if (ret) > + pr_err("%s: timedout waiting for %s:%lu\n", __func__, > + reset->prm->data->name, id); > + } else { > + /* wait for the reset bit to cleaar */ > + 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); > } > > + if (reset->clkdm) > + pdata->clkdm_allow_idle(reset->clkdm); > + > return ret; > } > >