soc: renesas: rmobile-sysc: Convert to readl_poll_timeout_atomic()
authorGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 2 Jun 2023 08:50:41 +0000 (10:50 +0200)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Mon, 5 Jun 2023 13:43:27 +0000 (15:43 +0200)
Use readl_poll_timeout_atomic() instead of open-coding the same
operation.

  1. rmobile_pd_power_down(): as typically less than 20 retries are
     needed, PSTR_RETRIES (100) µs is a suitable timeout value.

  2. __rmobile_pd_power_up(): the old method of first polling some
     cycles with a 1 µs delay, followed by more polling cycles without
     any delay didn't make much sense, as the latter was insignificant
     compared to the former.  Furthermore, typically no retries are
     needed.  Hence just retain the polling with delay.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/ae4bf03ab8fd5a557c683086958d6764babc0723.1685692810.git.geert+renesas@glider.be
drivers/soc/renesas/rmobile-sysc.c

index 728ebac98e14a5cca82555c57b353783b434c370..912daadaa10d12e10e541656d71bc7cf403ced16 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/clk/renesas.h>
 #include <linux/console.h>
 #include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/pm.h>
@@ -19,8 +21,6 @@
 #include <linux/pm_domain.h>
 #include <linux/slab.h>
 
-#include <asm/io.h>
-
 /* SYSC */
 #define SPDCR          0x08    /* SYS Power Down Control Register */
 #define SWUCR          0x14    /* SYS Wakeup Control Register */
@@ -47,6 +47,7 @@ static int rmobile_pd_power_down(struct generic_pm_domain *genpd)
 {
        struct rmobile_pm_domain *rmobile_pd = to_rmobile_pd(genpd);
        unsigned int mask = BIT(rmobile_pd->bit_shift);
+       u32 val;
 
        if (rmobile_pd->suspend) {
                int ret = rmobile_pd->suspend();
@@ -56,14 +57,10 @@ static int rmobile_pd_power_down(struct generic_pm_domain *genpd)
        }
 
        if (readl(rmobile_pd->base + PSTR) & mask) {
-               unsigned int retry_count;
                writel(mask, rmobile_pd->base + SPDCR);
 
-               for (retry_count = PSTR_RETRIES; retry_count; retry_count--) {
-                       if (!(readl(rmobile_pd->base + SPDCR) & mask))
-                               break;
-                       cpu_relax();
-               }
+               readl_poll_timeout_atomic(rmobile_pd->base + SPDCR, val,
+                                         !(val & mask), 0, PSTR_RETRIES);
        }
 
        pr_debug("%s: Power off, 0x%08x -> PSTR = 0x%08x\n", genpd->name, mask,
@@ -74,8 +71,7 @@ static int rmobile_pd_power_down(struct generic_pm_domain *genpd)
 
 static int __rmobile_pd_power_up(struct rmobile_pm_domain *rmobile_pd)
 {
-       unsigned int mask = BIT(rmobile_pd->bit_shift);
-       unsigned int retry_count;
+       unsigned int val, mask = BIT(rmobile_pd->bit_shift);
        int ret = 0;
 
        if (readl(rmobile_pd->base + PSTR) & mask)
@@ -83,16 +79,9 @@ static int __rmobile_pd_power_up(struct rmobile_pm_domain *rmobile_pd)
 
        writel(mask, rmobile_pd->base + SWUCR);
 
-       for (retry_count = 2 * PSTR_RETRIES; retry_count; retry_count--) {
-               if (!(readl(rmobile_pd->base + SWUCR) & mask))
-                       break;
-               if (retry_count > PSTR_RETRIES)
-                       udelay(PSTR_DELAY_US);
-               else
-                       cpu_relax();
-       }
-       if (!retry_count)
-               ret = -EIO;
+       ret = readl_poll_timeout_atomic(rmobile_pd->base + SWUCR, val,
+                                       (val & mask), PSTR_DELAY_US,
+                                       PSTR_RETRIES * PSTR_DELAY_US);
 
        pr_debug("%s: Power on, 0x%08x -> PSTR = 0x%08x\n",
                 rmobile_pd->genpd.name, mask,