summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Gaignard <benjamin.gaignard@linaro.org>2017-06-19 05:36:22 -0400
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>2017-07-09 16:32:18 -0400
commitf4b82d39e40fc9c3493826abb49c64c37c7025b9 (patch)
tree3d6ea46760fa2dd1b789b20e6ab7e419c80dc6db
parent69c31226fc9f887dcd5c27a91f5cc0f244a6953e (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.c19
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)
107static int st_rtc_set_time(struct device *dev, struct rtc_time *tm) 107static 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)