mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user