rtc: rtc-rk808: use flag to distinguish chip differences

RK808\RK818 have November 31st,Other chips fixed the problem.

Fixes: f076ef44a4 ("rtc: rk808: Compensate for Rockchip calendar
deviation on November 31st")
Signed-off-by: Elaine Zhang <zhangqing@rock-chips.com>
Change-Id: I8977a14abcc3973728b5941951d17d493b3955d4
This commit is contained in:
Elaine Zhang
2020-12-11 10:10:20 +08:00
committed by Tao Huang
parent 3f7be43b4f
commit 36d3e741d9

View File

@@ -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;