[PATCH 2/2] pmdomain: bcm: bcm2835-power: Replace open-coded polling with readl_poll_timeout_atomic()

Ulf Hansson ulf.hansson at linaro.org
Wed Mar 18 11:19:10 PDT 2026


On Tue, 17 Mar 2026 at 23:42, Maíra Canal <mcanal at igalia.com> wrote:
>
> Replace hand-rolled ktime_get_ns()/cpu_relax() polling loops with
> readl_poll_timeout_atomic() for the power-on (POWOK), and memory
> repair (MRDONE) waits.
>
> No functional change intended.
>
> Signed-off-by: Maíra Canal <mcanal at igalia.com>

Applied for next, thanks!

Kind regards
Uffe


> ---
>  drivers/pmdomain/bcm/bcm2835-power.c | 25 +++++++++----------------
>  1 file changed, 9 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/pmdomain/bcm/bcm2835-power.c b/drivers/pmdomain/bcm/bcm2835-power.c
> index eee87a3005325848547ce1f5fd729b168a641460..b76d74e3849be0aff226cfbe311970c9557eccfa 100644
> --- a/drivers/pmdomain/bcm/bcm2835-power.c
> +++ b/drivers/pmdomain/bcm/bcm2835-power.c
> @@ -215,10 +215,10 @@ static int bcm2835_power_power_on(struct bcm2835_power_domain *pd, u32 pm_reg)
>  {
>         struct bcm2835_power *power = pd->power;
>         struct device *dev = power->dev;
> -       u64 start;
>         int ret;
>         int inrush;
>         bool powok;
> +       u32 val;
>
>         /* We don't run this on BCM2711 */
>         if (power->rpivid_asb)
> @@ -239,12 +239,8 @@ static int bcm2835_power_power_on(struct bcm2835_power_domain *pd, u32 pm_reg)
>                          (inrush << PM_INRUSH_SHIFT) |
>                          PM_POWUP);
>
> -               start = ktime_get_ns();
> -               while (!(powok = !!(PM_READ(pm_reg) & PM_POWOK))) {
> -                       cpu_relax();
> -                       if (ktime_get_ns() - start >= 3000)
> -                               break;
> -               }
> +               powok = !readl_poll_timeout_atomic(power->base + pm_reg,
> +                                                  val, val & PM_POWOK, 0, 3);
>         }
>         if (!powok) {
>                 dev_err(dev, "Timeout waiting for %s power OK\n",
> @@ -258,15 +254,12 @@ static int bcm2835_power_power_on(struct bcm2835_power_domain *pd, u32 pm_reg)
>
>         /* Repair memory */
>         PM_WRITE(pm_reg, PM_READ(pm_reg) | PM_MEMREP);
> -       start = ktime_get_ns();
> -       while (!(PM_READ(pm_reg) & PM_MRDONE)) {
> -               cpu_relax();
> -               if (ktime_get_ns() - start >= 1000) {
> -                       dev_err(dev, "Timeout waiting for %s memory repair\n",
> -                               pd->base.name);
> -                       ret = -ETIMEDOUT;
> -                       goto err_disable_ispow;
> -               }
> +       if (readl_poll_timeout_atomic(power->base + pm_reg, val,
> +                                     val & PM_MRDONE, 0, 1)) {
> +               dev_err(dev, "Timeout waiting for %s memory repair\n",
> +                       pd->base.name);
> +               ret = -ETIMEDOUT;
> +               goto err_disable_ispow;
>         }
>
>         /* Disable functional isolation */
>
> --
> 2.53.0
>



More information about the linux-arm-kernel mailing list