From: Sean Wang <sean.wang@xxxxxxxxxxxx> Reuse the helper regmap_read_poll_timeout instead to simpify the logic. Furthermore, the time for a wait in each iteration changed from cpu_relax to 20us is for matching the usage of the helper, but it wouldn't acctually break any the existent functionality according to a good test on MT6323 PMIC. Signed-off-by: Sean Wang <sean.wang@xxxxxxxxxxxx> --- drivers/rtc/rtc-mt6397.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/drivers/rtc/rtc-mt6397.c b/drivers/rtc/rtc-mt6397.c index 4411c08..b62eaa8 100644 --- a/drivers/rtc/rtc-mt6397.c +++ b/drivers/rtc/rtc-mt6397.c @@ -18,6 +18,7 @@ #include <linux/regmap.h> #include <linux/rtc.h> #include <linux/irqdomain.h> +#include <linux/jiffies.h> #include <linux/platform_device.h> #include <linux/of_address.h> #include <linux/of_irq.h> @@ -63,6 +64,9 @@ #define RTC_NUM_YEARS 128 #define RTC_MIN_YEAR_OFFSET (RTC_MIN_YEAR - RTC_BASE_YEAR) +#define MTK_RTC_POLL_DELAY_US 10 +#define MTK_RTC_POLL_TIMEOUT (jiffies_to_usecs(HZ)) + struct mt6397_rtc { struct device *dev; struct rtc_device *rtc_dev; @@ -74,7 +78,6 @@ struct mt6397_rtc { static int mtk_rtc_write_trigger(struct mt6397_rtc *rtc) { - unsigned long timeout = jiffies + HZ; int ret; u32 data; @@ -82,19 +85,13 @@ static int mtk_rtc_write_trigger(struct mt6397_rtc *rtc) if (ret < 0) return ret; - while (1) { - ret = regmap_read(rtc->regmap, rtc->addr_base + RTC_BBPU, - &data); - if (ret < 0) - break; - if (!(data & RTC_BBPU_CBUSY)) - break; - if (time_after(jiffies, timeout)) { - ret = -ETIMEDOUT; - break; - } - cpu_relax(); - } + ret = regmap_read_poll_timeout(rtc->regmap, + rtc->addr_base + RTC_BBPU, data, + !(data & RTC_BBPU_CBUSY), + MTK_RTC_POLL_DELAY_US, + MTK_RTC_POLL_TIMEOUT); + if (ret) + dev_err(rtc->dev, "failed to write WRTGE: %d\n", ret); return ret; } -- 2.7.4