User readl_poll_timeout function instead of open
coded handling in crport_handshake function.

Fixes: d8c80bb3b55b ("phy: exynos5-usbdrd: Calibrate LOS levels for 
exynos5420/5800")
Signed-off-by: Anand Moon <linux.am...@gmail.com>
---
Changes v2:
--used the default timeout values.
--Added missing Fixed tags.
---
 drivers/phy/samsung/phy-exynos5-usbdrd.c | 37 +++++++++---------------
 1 file changed, 13 insertions(+), 24 deletions(-)

diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c 
b/drivers/phy/samsung/phy-exynos5-usbdrd.c
index e510732afb8b..c97f5fb6a9a0 100644
--- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
+++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
@@ -16,6 +16,7 @@
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_device.h>
+#include <linux/iopoll.h>
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
 #include <linux/mutex.h>
@@ -556,40 +557,28 @@ static int exynos5_usbdrd_phy_power_off(struct phy *phy)
 static int crport_handshake(struct exynos5_usbdrd_phy *phy_drd,
                            u32 val, u32 cmd)
 {
-       u32 usec = 100;
+       u32 timeout_us = 100, sleep_us = 1;
        unsigned int result;
+       int err;
 
        writel(val | cmd, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
 
-       do {
-               result = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1);
-               if (result & PHYREG1_CR_ACK)
-                       break;
-
-               udelay(1);
-       } while (usec-- > 0);
-
-       if (!usec) {
-               dev_err(phy_drd->dev,
-                       "CRPORT handshake timeout1 (0x%08x)\n", val);
+       err = readl_poll_timeout(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1,
+                       result, (result & PHYREG1_CR_ACK), sleep_us, 
timeout_us);
+       if (err) {
+               dev_err(phy_drd->dev, "CRPORT handshake timeout1 (0x%08x)\n", 
val);
                return -ETIME;
        }
 
-       usec = 100;
+       timeout_us = 100;
+       sleep_us = 1;
 
        writel(val, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
 
-       do {
-               result = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1);
-               if (!(result & PHYREG1_CR_ACK))
-                       break;
-
-               udelay(1);
-       } while (usec-- > 0);
-
-       if (!usec) {
-               dev_err(phy_drd->dev,
-                       "CRPORT handshake timeout2 (0x%08x)\n", val);
+       err = readl_poll_timeout(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1,
+                       result, !(result & PHYREG1_CR_ACK), sleep_us, 
timeout_us);
+       if (err) {
+               dev_err(phy_drd->dev, "CRPORT handshake timeout2 (0x%08x)\n", 
val);
                return -ETIME;
        }
 
-- 
2.27.0

Reply via email to