Re: [PATCHv3] RTC: RK808: Compensate for Rockchip calendar deviation on November 31st

From: Julius Werner
Date: Tue Dec 15 2015 - 18:14:31 EST


Okay, wrote up and tested the anchor date version. I think once you
get over the initial weirdness of the approach this one is really much
cleaner and safer.

I tested this with the older rtc_tm_to_time() API and only ported it
over to rtc_tm_to_time64() for submission, since my 3.14 kernel didn't
have that yet... but it still compiles fine and the change was very
trivial so I'm confident that it should work.

I also did a big manual test for my conversion functions where I just
threw a whole bunch of dates at them, results below for reference:

[ 1.431216] jwerner: Testing translation functions:
[ 1.431221] 2015-01-01 to_rockchip: 2015-01-02 to_gregorian: 2014-12-31
[ 1.431224] 2015-10-30 to_rockchip: 2015-10-31 to_gregorian: 2015-10-29
[ 1.431228] 2015-10-31 to_rockchip: 2015-11-01 to_gregorian: 2015-10-30
[ 1.431231] 2015-11-01 to_rockchip: 2015-11-02 to_gregorian: 2015-10-31
[ 1.431235] 2015-11-27 to_rockchip: 2015-11-28 to_gregorian: 2015-11-26
[ 1.431238] 2015-11-28 to_rockchip: 2015-11-29 to_gregorian: 2015-11-27
[ 1.431242] 2015-11-29 to_rockchip: 2015-11-30 to_gregorian: 2015-11-28
[ 1.431245] 2015-11-30 to_rockchip: 2015-12-01 to_gregorian: 2015-11-29

This one is actually a bug... to_rockchip should be 2015-11-31 here.
It happens because the "compensate if we went back over" part of
gregorian_to_rockchip() only checks whether we went over *backwards*,
which happens if the date is after the anchor date. If it was before
we can go back over forwards and I didn't bother to handle that case.
I think this is fine since all affected dates lie in the past and
there's no real-world use case where you'd ever need them to work
again.

[ 1.431249] 2015-11-31 to_rockchip: 2015-12-02 to_gregorian: 2015-11-30
[ 1.431252] 2015-12-01 to_rockchip: 2015-12-01 to_gregorian: 2015-12-01
[ 1.431256] 2015-12-02 to_rockchip: 2015-12-02 to_gregorian: 2015-12-02
[ 1.431259] 2015-12-03 to_rockchip: 2015-12-03 to_gregorian: 2015-12-03
[ 1.431262] 2015-12-04 to_rockchip: 2015-12-04 to_gregorian: 2015-12-04
[ 1.431266] 2015-12-05 to_rockchip: 2015-12-05 to_gregorian: 2015-12-05
[ 1.431269] 2015-12-30 to_rockchip: 2015-12-30 to_gregorian: 2015-12-30
[ 1.431273] 2015-12-31 to_rockchip: 2015-12-31 to_gregorian: 2015-12-31
[ 1.431276] 2016-01-01 to_rockchip: 2016-01-01 to_gregorian: 2016-01-01
[ 1.431279] 2016-10-30 to_rockchip: 2016-10-30 to_gregorian: 2016-10-30
[ 1.431283] 2016-10-31 to_rockchip: 2016-10-31 to_gregorian: 2016-10-31
[ 1.431287] 2016-11-01 to_rockchip: 2016-11-01 to_gregorian: 2016-11-01
[ 1.431291] 2016-11-27 to_rockchip: 2016-11-27 to_gregorian: 2016-11-27
[ 1.431295] 2016-11-28 to_rockchip: 2016-11-28 to_gregorian: 2016-11-28
[ 1.431299] 2016-11-29 to_rockchip: 2016-11-29 to_gregorian: 2016-11-29
[ 1.431302] 2016-11-30 to_rockchip: 2016-11-30 to_gregorian: 2016-11-30
[ 1.431306] 2016-11-31 to_rockchip: 2016-12-01 to_gregorian: 2016-12-01
[ 1.431310] 2016-12-01 to_rockchip: 2016-11-31 to_gregorian: 2016-12-02
[ 1.431313] 2016-12-02 to_rockchip: 2016-12-01 to_gregorian: 2016-12-03
[ 1.431317] 2016-12-03 to_rockchip: 2016-12-02 to_gregorian: 2016-12-04
[ 1.431321] 2016-12-04 to_rockchip: 2016-12-03 to_gregorian: 2016-12-05
[ 1.431324] 2016-12-05 to_rockchip: 2016-12-04 to_gregorian: 2016-12-06
[ 1.431328] 2016-12-30 to_rockchip: 2016-12-29 to_gregorian: 2016-12-31
[ 1.431332] 2016-12-31 to_rockchip: 2016-12-30 to_gregorian: 2017-01-01
[ 1.431335] 2017-01-01 to_rockchip: 2016-12-31 to_gregorian: 2017-01-02
[ 1.431338] 2017-10-30 to_rockchip: 2017-10-29 to_gregorian: 2017-10-31
[ 1.431342] 2017-10-31 to_rockchip: 2017-10-30 to_gregorian: 2017-11-01
[ 1.431345] 2017-11-01 to_rockchip: 2017-10-31 to_gregorian: 2017-11-02
[ 1.431349] 2017-11-27 to_rockchip: 2017-11-26 to_gregorian: 2017-11-28
[ 1.431352] 2017-11-28 to_rockchip: 2017-11-27 to_gregorian: 2017-11-29
[ 1.431356] 2017-11-29 to_rockchip: 2017-11-28 to_gregorian: 2017-11-30
[ 1.431359] 2017-11-30 to_rockchip: 2017-11-29 to_gregorian: 2017-12-01
[ 1.431363] 2017-11-31 to_rockchip: 2017-11-30 to_gregorian: 2017-12-02
[ 1.431366] 2017-12-01 to_rockchip: 2017-11-30 to_gregorian: 2017-12-03
[ 1.431369] 2017-12-02 to_rockchip: 2017-11-31 to_gregorian: 2017-12-04
[ 1.431373] 2017-12-03 to_rockchip: 2017-12-01 to_gregorian: 2017-12-05
[ 1.431376] 2017-12-04 to_rockchip: 2017-12-02 to_gregorian: 2017-12-06
[ 1.431380] 2017-12-05 to_rockchip: 2017-12-03 to_gregorian: 2017-12-07
[ 1.431383] 2017-12-30 to_rockchip: 2017-12-28 to_gregorian: 2018-01-01
[ 1.431386] 2017-12-31 to_rockchip: 2017-12-29 to_gregorian: 2018-01-02
[ 1.431389] 2020-01-01 to_rockchip: 2019-12-28 to_gregorian: 2020-01-05
[ 1.431393] 2020-10-30 to_rockchip: 2020-10-26 to_gregorian: 2020-11-03
[ 1.431397] 2020-10-31 to_rockchip: 2020-10-27 to_gregorian: 2020-11-04
[ 1.431400] 2020-11-01 to_rockchip: 2020-10-28 to_gregorian: 2020-11-05
[ 1.431404] 2020-11-27 to_rockchip: 2020-11-23 to_gregorian: 2020-12-01
[ 1.431408] 2020-11-28 to_rockchip: 2020-11-24 to_gregorian: 2020-12-02
[ 1.431411] 2020-11-29 to_rockchip: 2020-11-25 to_gregorian: 2020-12-03
[ 1.431415] 2020-11-30 to_rockchip: 2020-11-26 to_gregorian: 2020-12-04
[ 1.431419] 2020-11-31 to_rockchip: 2020-11-27 to_gregorian: 2020-12-05
[ 1.431422] 2020-12-01 to_rockchip: 2020-11-27 to_gregorian: 2020-12-06
[ 1.431426] 2020-12-02 to_rockchip: 2020-11-28 to_gregorian: 2020-12-07
[ 1.431430] 2020-12-03 to_rockchip: 2020-11-29 to_gregorian: 2020-12-08
[ 1.431434] 2020-12-04 to_rockchip: 2020-11-30 to_gregorian: 2020-12-09
[ 1.431437] 2020-12-05 to_rockchip: 2020-11-31 to_gregorian: 2020-12-10
[ 1.431441] 2020-12-30 to_rockchip: 2020-12-25 to_gregorian: 2021-01-04
[ 1.431444] 2020-12-31 to_rockchip: 2020-12-26 to_gregorian: 2021-01-05
[ 1.431447] 2030-01-01 to_rockchip: 2029-12-18 to_gregorian: 2030-01-15
[ 1.431450] 2030-10-30 to_rockchip: 2030-10-16 to_gregorian: 2030-11-13
[ 1.431454] 2030-10-31 to_rockchip: 2030-10-17 to_gregorian: 2030-11-14
[ 1.431457] 2030-11-01 to_rockchip: 2030-10-18 to_gregorian: 2030-11-15
[ 1.431461] 2030-11-27 to_rockchip: 2030-11-13 to_gregorian: 2030-12-11
[ 1.431464] 2030-11-28 to_rockchip: 2030-11-14 to_gregorian: 2030-12-12
[ 1.431468] 2030-11-29 to_rockchip: 2030-11-15 to_gregorian: 2030-12-13
[ 1.431471] 2030-11-30 to_rockchip: 2030-11-16 to_gregorian: 2030-12-14
[ 1.431474] 2030-11-31 to_rockchip: 2030-11-17 to_gregorian: 2030-12-15
[ 1.431478] 2030-12-01 to_rockchip: 2030-11-17 to_gregorian: 2030-12-16
[ 1.431481] 2030-12-02 to_rockchip: 2030-11-18 to_gregorian: 2030-12-17
[ 1.431485] 2030-12-03 to_rockchip: 2030-11-19 to_gregorian: 2030-12-18
[ 1.431488] 2030-12-04 to_rockchip: 2030-11-20 to_gregorian: 2030-12-19
[ 1.431492] 2030-12-05 to_rockchip: 2030-11-21 to_gregorian: 2030-12-20
[ 1.431495] 2030-12-30 to_rockchip: 2030-12-15 to_gregorian: 2031-01-14
[ 1.431498] 2030-12-31 to_rockchip: 2030-12-16 to_gregorian: 2031-01-15
[ 1.431501] 2060-01-01 to_rockchip: 2059-11-19 to_gregorian: 2060-02-14
[ 1.431505] 2060-10-30 to_rockchip: 2060-09-16 to_gregorian: 2060-12-13
[ 1.431509] 2060-10-31 to_rockchip: 2060-09-17 to_gregorian: 2060-12-14
[ 1.431512] 2060-11-01 to_rockchip: 2060-09-18 to_gregorian: 2060-12-15
[ 1.431516] 2060-11-27 to_rockchip: 2060-10-14 to_gregorian: 2061-01-10
[ 1.431519] 2060-11-28 to_rockchip: 2060-10-15 to_gregorian: 2061-01-11
[ 1.431522] 2060-11-29 to_rockchip: 2060-10-16 to_gregorian: 2061-01-12
[ 1.431525] 2060-11-30 to_rockchip: 2060-10-17 to_gregorian: 2061-01-13
[ 1.431528] 2060-11-31 to_rockchip: 2060-10-18 to_gregorian: 2061-01-14
[ 1.431532] 2060-12-01 to_rockchip: 2060-10-18 to_gregorian: 2061-01-15
[ 1.431536] 2060-12-02 to_rockchip: 2060-10-19 to_gregorian: 2061-01-16
[ 1.431540] 2060-12-03 to_rockchip: 2060-10-20 to_gregorian: 2061-01-17
[ 1.431544] 2060-12-04 to_rockchip: 2060-10-21 to_gregorian: 2061-01-18
[ 1.431548] 2060-12-05 to_rockchip: 2060-10-22 to_gregorian: 2061-01-19
[ 1.431551] 2060-12-30 to_rockchip: 2060-11-16 to_gregorian: 2061-02-13
[ 1.431554] 2060-12-31 to_rockchip: 2060-11-17 to_gregorian: 2061-02-14
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/