diff options
| author | Maíra Canal <mcanal@igalia.com> | 2026-03-17 19:41:50 -0300 |
|---|---|---|
| committer | Ulf Hansson <ulf.hansson@linaro.org> | 2026-04-01 13:12:11 +0200 |
| commit | d797ecf3ffc5cc3e622bfee4cee6b17372c5bcc7 (patch) | |
| tree | d0837725124654b0cac96cfb68f9bb2e2f97c4a8 /drivers/pmdomain | |
| parent | a46e905cd14a0a82b6f1fbf2f720fe5f13755050 (diff) | |
pmdomain: bcm: bcm2835-power: Replace open-coded polling with readl_poll_timeout_atomic()
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>
Diffstat (limited to 'drivers/pmdomain')
| -rw-r--r-- | drivers/pmdomain/bcm/bcm2835-power.c | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/drivers/pmdomain/bcm/bcm2835-power.c b/drivers/pmdomain/bcm/bcm2835-power.c index eee87a300532..b76d74e3849b 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 */ |
