Skip to content

Commit e908fa1

Browse files
author
Elaine Zhang
committed
rtc: rtc-rk808: use flag to distinguish chip differences
RK808\RK818 have November 31st,Other chips fixed the problem. Fixes: f076ef4 ("rtc: rk808: Compensate for Rockchip calendar deviation on November 31st") Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com> Change-Id: I8977a14abcc3973728b5941951d17d493b3955d4
1 parent 8c1056c commit e908fa1

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

drivers/rtc/rtc-rk808.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#define YEARS_REG_MSK 0xFF
4646
#define WEEKS_REG_MSK 0x7
4747

48+
#define RTC_NEED_TRANSITIONS BIT(0)
4849
/* REG_SECONDS_REG through REG_YEARS_REG is how many registers? */
4950

5051
#define NUM_TIME_REGS (RK808_WEEKS_REG - RK808_SECONDS_REG + 1)
@@ -63,6 +64,7 @@ struct rk808_rtc {
6364
struct rtc_device *rtc;
6465
struct rk_rtc_compat_reg *creg;
6566
int irq;
67+
unsigned int flag;
6668
};
6769

6870
/*
@@ -147,7 +149,10 @@ static int rk808_rtc_readtime(struct device *dev, struct rtc_time *tm)
147149
tm->tm_mon = (bcd2bin(rtc_data[4] & MONTHS_REG_MSK)) - 1;
148150
tm->tm_year = (bcd2bin(rtc_data[5] & YEARS_REG_MSK)) + 100;
149151
tm->tm_wday = bcd2bin(rtc_data[6] & WEEKS_REG_MSK);
150-
rockchip_to_gregorian(tm);
152+
153+
if (rk808_rtc->flag & RTC_NEED_TRANSITIONS)
154+
rockchip_to_gregorian(tm);
155+
151156
dev_dbg(dev, "RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
152157
1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
153158
tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
@@ -166,7 +171,9 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
166171
dev_dbg(dev, "set RTC date/time %4d-%02d-%02d(%d) %02d:%02d:%02d\n",
167172
1900 + tm->tm_year, tm->tm_mon + 1, tm->tm_mday,
168173
tm->tm_wday, tm->tm_hour, tm->tm_min, tm->tm_sec);
169-
gregorian_to_rockchip(tm);
174+
175+
if (rk808_rtc->flag & RTC_NEED_TRANSITIONS)
176+
gregorian_to_rockchip(tm);
170177

171178
if (tm->tm_year < 100 || tm->tm_year > 199) {
172179
dev_err(dev, "Unsupported RTC time of tm_year: %d\n",
@@ -230,7 +237,9 @@ static int rk808_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
230237
alrm->time.tm_mday = bcd2bin(alrm_data[3] & DAYS_REG_MSK);
231238
alrm->time.tm_mon = (bcd2bin(alrm_data[4] & MONTHS_REG_MSK)) - 1;
232239
alrm->time.tm_year = (bcd2bin(alrm_data[5] & YEARS_REG_MSK)) + 100;
233-
rockchip_to_gregorian(&alrm->time);
240+
241+
if (rk808_rtc->flag & RTC_NEED_TRANSITIONS)
242+
rockchip_to_gregorian(&alrm->time);
234243

235244
ret = regmap_read(rk808->regmap, rk808_rtc->creg->int_reg, &int_reg);
236245
if (ret) {
@@ -288,7 +297,8 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
288297
alrm->time.tm_mday, alrm->time.tm_wday, alrm->time.tm_hour,
289298
alrm->time.tm_min, alrm->time.tm_sec);
290299

291-
gregorian_to_rockchip(&alrm->time);
300+
if (rk808_rtc->flag & RTC_NEED_TRANSITIONS)
301+
gregorian_to_rockchip(&alrm->time);
292302

293303
if (alrm->time.tm_year < 100 || alrm->time.tm_year > 199) {
294304
dev_err(dev, "Unsupported RTC alrm time of tm_year: %d\n",
@@ -447,6 +457,15 @@ static int rk808_rtc_probe(struct platform_device *pdev)
447457
return -ENOMEM;
448458

449459
switch (rk808->variant) {
460+
case RK808_ID:
461+
case RK818_ID:
462+
rk808_rtc->creg = &rk808_creg;
463+
rk808_rtc->flag |= RTC_NEED_TRANSITIONS;
464+
break;
465+
case RK805_ID:
466+
case RK816_ID:
467+
rk808_rtc->creg = &rk808_creg;
468+
break;
450469
case RK809_ID:
451470
case RK817_ID:
452471
rk808_rtc->creg = &rk817_creg;

0 commit comments

Comments
 (0)