From 1eccda2b77e03aa8f603c13f4c8755cf29388ac5 Mon Sep 17 00:00:00 2001 From: shengfei Xu Date: Thu, 8 Dec 2022 08:55:50 +0000 Subject: [PATCH] rtc: rockchip: Add timeout judgment for update rtc status Signed-off-by: shengfei Xu Change-Id: Id5f08190b4765c155db69d6f83d5bac93db80439 --- drivers/rtc/rtc-rockchip.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/drivers/rtc/rtc-rockchip.c b/drivers/rtc/rtc-rockchip.c index f2b6a8b9d9b5..d69b096629db 100644 --- a/drivers/rtc/rtc-rockchip.c +++ b/drivers/rtc/rtc-rockchip.c @@ -61,6 +61,7 @@ /* RTC_CTRL_REG bitfields */ #define RTC_CTRL_REG_START_RTC BIT(0) +#define RTC_TIMEOUT (3000 * 1000) /* RK630 has a shadowed register for saving a "frozen" RTC time. * When user setting "GET_TIME" to 1, the time will save in this shadowed @@ -220,15 +221,14 @@ static int rockchip_rtc_set_time(struct device *dev, struct rtc_time *tm) dev_err(dev, "Failed to update RTC control: %d\n", ret); return ret; } - ret = regmap_read(rtc->regmap, RTC_STATUS1, &status); - while (status & RTC_CTRL_REG_START_RTC) { - udelay(1); - ret = regmap_read(rtc->regmap, RTC_STATUS1, &status); - if (ret) { - dev_err(dev, "Failed to read RTC_STATUS1: %d\n", ret); - return ret; - } - } + + ret = regmap_read_poll_timeout(rtc->regmap, RTC_STATUS1, status, + !(status & RTC_CTRL_REG_START_RTC), + 0, RTC_TIMEOUT); + if (ret) + dev_err(dev, + "%s:timeout Update RTC_STATUS1 : %d\n", + __func__, ret); ret = regmap_bulk_write(rtc->regmap, RTC_SET_SECONDS, rtc_data, NUM_TIME_REGS); @@ -247,15 +247,15 @@ static int rockchip_rtc_set_time(struct device *dev, struct rtc_time *tm) dev_err(dev, "Failed to update RTC control: %d\n", ret); return ret; } - ret = regmap_read(rtc->regmap, RTC_STATUS1, &status); - while (!(status & RTC_CTRL_REG_START_RTC)) { - udelay(1); - ret = regmap_read(rtc->regmap, RTC_STATUS1, &status); - if (ret) { - dev_err(dev, "Failed to read RTC_STATUS1: %d\n", ret); - return ret; - } - } + + ret = regmap_read_poll_timeout(rtc->regmap, RTC_STATUS1, status, + (status & RTC_CTRL_REG_START_RTC), + 0, RTC_TIMEOUT); + if (ret) + dev_err(dev, + "%s:timeout Update RTC_STATUS1 : %d\n", + __func__, ret); + return 0; }