summaryrefslogtreecommitdiff
path: root/drivers/pmdomain
diff options
context:
space:
mode:
authorMaíra Canal <mcanal@igalia.com>2026-03-17 19:41:50 -0300
committerUlf Hansson <ulf.hansson@linaro.org>2026-04-01 13:12:11 +0200
commitd797ecf3ffc5cc3e622bfee4cee6b17372c5bcc7 (patch)
treed0837725124654b0cac96cfb68f9bb2e2f97c4a8 /drivers/pmdomain
parenta46e905cd14a0a82b6f1fbf2f720fe5f13755050 (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.c25
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 */