#include <linux/interrupt.h>
 #include <sound/pcm_params.h>
 #include <linux/pm_runtime.h>
+#include <linux/iopoll.h>
 
 #include "acp63.h"
 
 static int acp63_power_on(void __iomem *acp_base)
 {
        u32 val;
-       int timeout;
 
        val = readl(acp_base + ACP_PGFSM_STATUS);
 
 
        if ((val & ACP_PGFSM_STATUS_MASK) != ACP_POWER_ON_IN_PROGRESS)
                writel(ACP_PGFSM_CNTL_POWER_ON_MASK, acp_base + ACP_PGFSM_CONTROL);
-       timeout = 0;
-       while (++timeout < 500) {
-               val = readl(acp_base + ACP_PGFSM_STATUS);
-               if (!val)
-                       return 0;
-               udelay(1);
-       }
-       return -ETIMEDOUT;
+
+       return readl_poll_timeout(acp_base + ACP_PGFSM_STATUS, val, !val, DELAY_US, ACP_TIMEOUT);
 }
 
 static int acp63_reset(void __iomem *acp_base)
 {
        u32 val;
-       int timeout;
+       int ret;
 
        writel(1, acp_base + ACP_SOFT_RESET);
-       timeout = 0;
-       while (++timeout < 500) {
-               val = readl(acp_base + ACP_SOFT_RESET);
-               if (val & ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK)
-                       break;
-               cpu_relax();
-       }
+
+       ret = readl_poll_timeout(acp_base + ACP_SOFT_RESET, val,
+                                val & ACP_SOFT_RESET_SOFTRESET_AUDDONE_MASK,
+                                DELAY_US, ACP_TIMEOUT);
+       if (ret)
+               return ret;
+
        writel(0, acp_base + ACP_SOFT_RESET);
-       timeout = 0;
-       while (++timeout < 500) {
-               val = readl(acp_base + ACP_SOFT_RESET);
-               if (!val)
-                       return 0;
-               cpu_relax();
-       }
-       return -ETIMEDOUT;
+
+       return readl_poll_timeout(acp_base + ACP_SOFT_RESET, val, !val, DELAY_US, ACP_TIMEOUT);
 }
 
 static void acp63_enable_interrupts(void __iomem *acp_base)