diff options
author | Benjamin Gaignard <benjamin.gaignard@linaro.org> | 2017-06-19 05:36:22 -0400 |
---|---|---|
committer | Alexandre Belloni <alexandre.belloni@free-electrons.com> | 2017-07-09 16:32:18 -0400 |
commit | f4b82d39e40fc9c3493826abb49c64c37c7025b9 (patch) | |
tree | 3d6ea46760fa2dd1b789b20e6ab7e419c80dc6db | |
parent | 69c31226fc9f887dcd5c27a91f5cc0f244a6953e (diff) |
rtc: st-lpc: make it robust against y2038/2106 bug
Make driver use u64 variables and functions to be sure that
it will support dates after year 2038.
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Acked-by: Patrice Chotard <patrice.chotard@st.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
-rw-r--r-- | drivers/rtc/rtc-st-lpc.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/rtc/rtc-st-lpc.c b/drivers/rtc/rtc-st-lpc.c index 74c0a336ceea..82b0af159a28 100644 --- a/drivers/rtc/rtc-st-lpc.c +++ b/drivers/rtc/rtc-st-lpc.c | |||
@@ -99,7 +99,7 @@ static int st_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
99 | 99 | ||
100 | lpt = ((unsigned long long)lpt_msb << 32) | lpt_lsb; | 100 | lpt = ((unsigned long long)lpt_msb << 32) | lpt_lsb; |
101 | do_div(lpt, rtc->clkrate); | 101 | do_div(lpt, rtc->clkrate); |
102 | rtc_time_to_tm(lpt, tm); | 102 | rtc_time64_to_tm(lpt, tm); |
103 | 103 | ||
104 | return 0; | 104 | return 0; |
105 | } | 105 | } |
@@ -107,13 +107,10 @@ static int st_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
107 | static int st_rtc_set_time(struct device *dev, struct rtc_time *tm) | 107 | static int st_rtc_set_time(struct device *dev, struct rtc_time *tm) |
108 | { | 108 | { |
109 | struct st_rtc *rtc = dev_get_drvdata(dev); | 109 | struct st_rtc *rtc = dev_get_drvdata(dev); |
110 | unsigned long long lpt; | 110 | unsigned long long lpt, secs; |
111 | unsigned long secs, flags; | 111 | unsigned long flags; |
112 | int ret; | ||
113 | 112 | ||
114 | ret = rtc_tm_to_time(tm, &secs); | 113 | secs = rtc_tm_to_time64(tm); |
115 | if (ret) | ||
116 | return ret; | ||
117 | 114 | ||
118 | lpt = (unsigned long long)secs * rtc->clkrate; | 115 | lpt = (unsigned long long)secs * rtc->clkrate; |
119 | 116 | ||
@@ -161,13 +158,13 @@ static int st_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
161 | { | 158 | { |
162 | struct st_rtc *rtc = dev_get_drvdata(dev); | 159 | struct st_rtc *rtc = dev_get_drvdata(dev); |
163 | struct rtc_time now; | 160 | struct rtc_time now; |
164 | unsigned long now_secs; | 161 | unsigned long long now_secs; |
165 | unsigned long alarm_secs; | 162 | unsigned long long alarm_secs; |
166 | unsigned long long lpa; | 163 | unsigned long long lpa; |
167 | 164 | ||
168 | st_rtc_read_time(dev, &now); | 165 | st_rtc_read_time(dev, &now); |
169 | rtc_tm_to_time(&now, &now_secs); | 166 | now_secs = rtc_tm_to_time64(&now); |
170 | rtc_tm_to_time(&t->time, &alarm_secs); | 167 | alarm_secs = rtc_tm_to_time64(&t->time); |
171 | 168 | ||
172 | /* Invalid alarm time */ | 169 | /* Invalid alarm time */ |
173 | if (now_secs > alarm_secs) | 170 | if (now_secs > alarm_secs) |