mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 14:04:54 +02: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:
parent
b3eba31466
commit
c44e5e04a4
|
|
@ -37,6 +37,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)
|
||||
|
|
@ -55,6 +56,7 @@ struct rk808_rtc {
|
|||
struct rtc_device *rtc;
|
||||
struct rk_rtc_compat_reg *creg;
|
||||
int irq;
|
||||
unsigned int flag;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -138,8 +140,13 @@ 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);
|
||||
dev_dbg(dev, "RTC date/time %ptRd(%d) %ptRt\n", tm, tm->tm_wday, 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);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -152,8 +159,13 @@ static int rk808_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
|||
u8 rtc_data[NUM_TIME_REGS];
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "set RTC date/time %ptRd(%d) %ptRt\n", tm, tm->tm_wday, tm);
|
||||
gregorian_to_rockchip(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);
|
||||
|
||||
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);
|
||||
|
|
@ -210,7 +222,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) {
|
||||
|
|
@ -264,7 +278,9 @@ static int rk808_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|||
dev_dbg(dev, "alrm set RTC date/time %ptRd(%d) %ptRt\n",
|
||||
&alrm->time, alrm->time.tm_wday, &alrm->time);
|
||||
|
||||
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);
|
||||
|
|
@ -414,6 +430,7 @@ static int rk808_rtc_probe(struct platform_device *pdev)
|
|||
case RK808_ID:
|
||||
case RK818_ID:
|
||||
rk808_rtc->creg = &rk808_creg;
|
||||
rk808_rtc->flag |= RTC_NEED_TRANSITIONS;
|
||||
break;
|
||||
case RK805_ID:
|
||||
case RK816_ID:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user