ASoC: amd: ps: refactor acp power on and reset functions.
authorSyed Saba Kareem <Syed.SabaKareem@amd.com>
Wed, 26 Apr 2023 12:22:02 +0000 (17:52 +0530)
committerMark Brown <broonie@kernel.org>
Sun, 7 May 2023 23:48:50 +0000 (08:48 +0900)
Instead of a busy waiting while loop using udelay in
acp63_power_on and acp63_reset functions use readl_poll_timeout
function to check the condition.

Signed-off-by: Syed Saba Kareem <Syed.SabaKareem@amd.com
Reviewed-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com
Link: https://lore.kernel.org/r/20230426122219.3745586-2-Syed.SabaKareem@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org
sound/soc/amd/ps/acp63.h
sound/soc/amd/ps/pci-ps.c

index 903b812aa8e87ca46cc1d799711e9ee39587049d..2f94448102d02277f7ae0b4c99922418f9e48ede 100644 (file)
@@ -58,6 +58,9 @@
 #define ACP63_PDM_DEV_MASK             1
 #define ACP_DMIC_DEV   2
 
+/* time in ms for acp timeout */
+#define ACP_TIMEOUT            500
+
 enum acp_config {
        ACP_CONFIG_0 = 0,
        ACP_CONFIG_1,
index 097fd54885344d99f63aeabbfb211c1ca042c1b9..c957718abefc10fa1ad7815af812f023bed90963 100644 (file)
 #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);
 
@@ -29,38 +29,26 @@ static int acp63_power_on(void __iomem *acp_base)
 
        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)