irqchip/gic-v3: Use readl_relaxed_poll_timeout_atomic()
[linux-2.6-microblaze.git] / drivers / irqchip / irq-gic-v3.c
index 98b0329..65cbf37 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/percpu.h>
 #include <linux/refcount.h>
 #include <linux/slab.h>
+#include <linux/iopoll.h>
 
 #include <linux/irqchip.h>
 #include <linux/irqchip/arm-gic-common.h>
@@ -251,17 +252,13 @@ static inline void __iomem *gic_dist_base(struct irq_data *d)
 
 static void gic_do_wait_for_rwp(void __iomem *base, u32 bit)
 {
-       u32 count = 1000000;    /* 1s! */
+       u32 val;
+       int ret;
 
-       while (readl_relaxed(base + GICD_CTLR) & bit) {
-               count--;
-               if (!count) {
-                       pr_err_ratelimited("RWP timeout, gone fishing\n");
-                       return;
-               }
-               cpu_relax();
-               udelay(1);
-       }
+       ret = readl_relaxed_poll_timeout_atomic(base + GICD_CTLR, val, !(val & bit),
+                                               1, USEC_PER_SEC);
+       if (ret == -ETIMEDOUT)
+               pr_err_ratelimited("RWP timeout, gone fishing\n");
 }
 
 /* Wait for completion of a distributor change */
@@ -279,8 +276,8 @@ static void gic_redist_wait_for_rwp(void)
 static void gic_enable_redist(bool enable)
 {
        void __iomem *rbase;
-       u32 count = 1000000;    /* 1s! */
        u32 val;
+       int ret;
 
        if (gic_data.flags & FLAGS_WORKAROUND_GICR_WAKER_MSM8996)
                return;
@@ -301,16 +298,13 @@ static void gic_enable_redist(bool enable)
                        return; /* No PM support in this redistributor */
        }
 
-       while (--count) {
-               val = readl_relaxed(rbase + GICR_WAKER);
-               if (enable ^ (bool)(val & GICR_WAKER_ChildrenAsleep))
-                       break;
-               cpu_relax();
-               udelay(1);
-       }
-       if (!count)
+       ret = readl_relaxed_poll_timeout_atomic(rbase + GICR_WAKER, val,
+                                               enable ^ (bool)(val & GICR_WAKER_ChildrenAsleep),
+                                               1, USEC_PER_SEC);
+       if (ret == -ETIMEDOUT) {
                pr_err_ratelimited("redistributor failed to %s...\n",
                                   enable ? "wakeup" : "sleep");
+       }
 }
 
 /*