]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pmdomain: bcm: bcm2835-power: Replace open-coded polling with readl_poll_timeout_atomic()
authorMaíra Canal <mcanal@igalia.com>
Tue, 17 Mar 2026 22:41:50 +0000 (19:41 -0300)
committerUlf Hansson <ulf.hansson@linaro.org>
Wed, 1 Apr 2026 11:12:11 +0000 (13:12 +0200)
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@igalia.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/pmdomain/bcm/bcm2835-power.c

index eee87a3005325848547ce1f5fd729b168a641460..b76d74e3849be0aff226cfbe311970c9557eccfa 100644 (file)
@@ -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 */