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