phy: samsung: Use readl_poll_timeout function
Subsystems (3)
PATCH v5 1/1 phy: samsung: Use readl_poll_timeout function
Instead of a busy waiting while loop using udelay use readl_poll_timeout function to check the condition is met or timeout occurs in crport_handshake function. readl_poll_timeout is called in non atomic context so it safe to sleep until the condition is met.
---
Changes v5:
--Fix the indentation, checkpatch warning.
--Drop the Fix tags.
Changes v4:
Rebased on to of patch [0] https://patchwork.kernel.org/patch/11651673/
--Fix the commit message.
--Fix the error timeout condition for -ETIMEDOUT
Changes v3:
--Fix the commit message.
--Drop the variable, used the value directly.
Changes v2:
--used the default timeout values.
--Added missing Fixed tags.
--- drivers/phy/samsung/phy-exynos5-usbdrd.c | 39 ++++++++---------------- 1 file changed, 12 insertions(+), 27 deletions(-)
drivers/phy/samsung/phy-exynos5-usbdrd.c +12 -27
@@ -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,41 +557,25 @@ 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 ;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); -return -ETIME ; + err =readl_poll_timeout (phy_drd->reg_phy +EXYNOS5_DRD_PHYREG1 , + result, (result &PHYREG1_CR_ACK ),1 ,100 ); +if (err == -ETIMEDOUT ) { +dev_err (phy_drd->dev,"CRPORT handshake timeout1 (0x%08x)\n" , val); +return err; } - usec =100 ; -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); -return -ETIME ; + err =readl_poll_timeout (phy_drd->reg_phy +EXYNOS5_DRD_PHYREG1 , + result, !(result &PHYREG1_CR_ACK ),1 ,100 ); +if (err == -ETIMEDOUT ) { +dev_err (phy_drd->dev,"CRPORT handshake timeout2 (0x%08x)\n" , val); +return err; }return 0 ;
Signature · 1 line
2.27.0
Quoted 5 lines · Anand Moon
Instead of a busy waiting while loop using udelay use
readl_poll_timeoutfunction to check the condition is met or timeout occurs incrport_handshakefunction.readl_poll_timeoutis called in non atomic context so it safe to sleep until the condition is met.
Applied, thanks
Signature · 1 line
~Vinod