From 36d3e741d94d2606fcd659f9881fd1b670976cf7 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Fri, 11 Dec 2020 10:10:20 +0800 Subject: [PATCH] rtc: rtc-rk808: use flag to distinguish chip differences RK808\RK818 have November 31st,Other chips fixed the problem. Fixes: f076ef44a44d ("rtc: rk808: Compensate for Rockchip calendar deviation on November 31st") Signed-off-by: Elaine Zhang Change-Id: I8977a14abcc3973728b5941951d17d493b3955d4 --- drivers/rtc/rtc-rk808.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc-rk808.c b/drivers/rtc/rtc-rk808.c index 785d9ab02b11..67e5a946f4a9 100644 --- a/drivers/rtc/rtc-rk808.c +++ b/drivers/rtc/rtc-rk808.c @@ -45,6 +45,7 @@ #define YEARS_REG_MSK 0xFF #define WEEKS_REG_MSK 0x7 +#define RTC_NEED_TRANSITIONS BIT(0) /* REG_SECONDS_REG through REG_YEARS_REG is how many registers? */ #define NUM_TIME_REGS (RK808_WEEKS_REG - RK808_SECONDS_REG + 1) @@ -63,6 +64,7 @@ struct rk808_rtc { struct rtc_device *rtc; struct rk_rtc_compat_reg *creg; int irq; + unsigned int flag; }; /* @@ -146,7 +148,10 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm) tm->tm_mon = (bcd2bin(rtc_data[4] & MONTHS_REG_MSK)) - 1; tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100; tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK); - rockchip_to_gregorian(tm); + + if (rk808_rtc->flag & RTC_NEED_TRANSITIONS) + rockchip_to_gregorian(tm); + dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec); @@ -165,7 +170,10 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm) dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n", 1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday, tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec); - gregorian_to_rockchip(tm); + + if (rk808_rtc->flag & RTC_NEED_TRANSITIONS) + gregorian_to_rockchip(tm); + rtc_data[0] = bin2bcd(tm->tm_sec); rtc_data[1] = bin2bcd(tm->tm_min); rtc_data[2] = bin2bcd(tm->tm_hour); @@ -222,7 +230,9 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) alrm->time.tm_mday = bcd2bin(alrm_data[3] & DAYS_REG_MSK); alrm->time.tm_mon = (bcd2bin(alrm_data[4] & MONTHS_REG_MSK)) - 1; alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100; - rockchip_to_gregorian(&alrm->time); + + if (rk808_rtc->flag & RTC_NEED_TRANSITIONS) + rockchip_to_gregorian(&alrm->time); ret = regmap_read(rk808->regmap, rk808_rtc->creg->int_reg, &int_reg); if (ret) { @@ -280,7 +290,9 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour, alrm->time.tm_min, alrm->time.tm_sec); - gregorian_to_rockchip(&alrm->time); + if (rk808_rtc->flag & RTC_NEED_TRANSITIONS) + gregorian_to_rockchip(&alrm->time); + alrm_data[0] = bin2bcd(alrm->time.tm_sec); alrm_data[1] = bin2bcd(alrm->time.tm_min); alrm_data[2] = bin2bcd(alrm->time.tm_hour); @@ -429,6 +441,15 @@ static int rk808_rtc_probe(struct platform_device *pdev) return -ENOMEM; switch (rk808->variant) { + case RK808_ID: + case RK818_ID: + rk808_rtc->creg = &rk808_creg; + rk808_rtc->flag |= RTC_NEED_TRANSITIONS; + break; + case RK805_ID: + case RK816_ID: + rk808_rtc->creg = &rk808_creg; + break; case RK809_ID: case RK817_ID: rk808_rtc->creg = &rk817_creg;