soc: ti: omap-prm: use atomic iopoll instead of sleeping one
authorTero Kristo <t-kristo@ti.com>
Thu, 14 May 2020 07:37:18 +0000 (10:37 +0300)
committerTony Lindgren <tony@atomide.com>
Tue, 19 May 2020 18:20:53 +0000 (11:20 -0700)
The reset handling APIs for omap-prm can be invoked PM runtime which
runs in atomic context. For this to work properly, switch to atomic
iopoll version instead of the current which can sleep. Otherwise,
this throws a "BUG: scheduling while atomic" warning. Issue is seen
rather easily when CONFIG_PREEMPT is enabled.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
Acked-by: Santosh Shilimkar <ssantosh@kernel.org>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/soc/ti/omap_prm.c

index 96c6f77..c9b3f9e 100644 (file)
@@ -256,10 +256,10 @@ static int omap_reset_deassert(struct reset_controller_dev *rcdev,
                goto exit;
 
        /* wait for the status to be set */
-       ret = readl_relaxed_poll_timeout(reset->prm->base +
-                                        reset->prm->data->rstst,
-                                        v, v & BIT(st_bit), 1,
-                                        OMAP_RESET_MAX_WAIT);
+       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);