aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/interface.c
diff options
context:
space:
mode:
authorXunlei Pang <pang.xunlei@linaro.org>2015-01-21 21:31:51 -0500
committerJohn Stultz <john.stultz@linaro.org>2015-01-23 20:21:55 -0500
commitbc10aa93a8853d6dac820696ae9a3e757e19f315 (patch)
treeb07a5dd4ac66d3567e15baeeadf3935a1b7bf8ab /drivers/rtc/interface.c
parent2e0c78ee5ba4d777ecf22c8f40cc968b4308ca88 (diff)
rtc: Update interface.c to use y2038-safe time interfaces
Currently, interface.c uses y2038 problematic rtc_tm_to_time() and rtc_time_to_tm(). So replace them with their corresponding y2038-safe versions: rtc_tm_to_time64() and rtc_time64_to_tm(). Cc: pang.xunlei <pang.xunlei@linaro.org> Cc: Arnd Bergmann <arnd.bergmann@linaro.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'drivers/rtc/interface.c')
-rw-r--r--drivers/rtc/interface.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 45bfc28ee3aa..37215cf983e9 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -73,10 +73,8 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
73 else if (rtc->ops->set_time) 73 else if (rtc->ops->set_time)
74 err = rtc->ops->set_time(rtc->dev.parent, tm); 74 err = rtc->ops->set_time(rtc->dev.parent, tm);
75 else if (rtc->ops->set_mmss) { 75 else if (rtc->ops->set_mmss) {
76 unsigned long secs; 76 time64_t secs64 = rtc_tm_to_time64(tm);
77 err = rtc_tm_to_time(tm, &secs); 77 err = rtc->ops->set_mmss(rtc->dev.parent, secs64);
78 if (err == 0)
79 err = rtc->ops->set_mmss(rtc->dev.parent, secs);
80 } else 78 } else
81 err = -EINVAL; 79 err = -EINVAL;
82 80
@@ -105,7 +103,7 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
105 103
106 err = rtc->ops->read_time(rtc->dev.parent, &old); 104 err = rtc->ops->read_time(rtc->dev.parent, &old);
107 if (err == 0) { 105 if (err == 0) {
108 rtc_time_to_tm(secs, &new); 106 rtc_time64_to_tm(secs, &new);
109 107
110 /* 108 /*
111 * avoid writing when we're going to change the day of 109 * avoid writing when we're going to change the day of
@@ -157,7 +155,7 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
157 int err; 155 int err;
158 struct rtc_time before, now; 156 struct rtc_time before, now;
159 int first_time = 1; 157 int first_time = 1;
160 unsigned long t_now, t_alm; 158 time64_t t_now, t_alm;
161 enum { none, day, month, year } missing = none; 159 enum { none, day, month, year } missing = none;
162 unsigned days; 160 unsigned days;
163 161
@@ -258,8 +256,8 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
258 } 256 }
259 257
260 /* with luck, no rollover is needed */ 258 /* with luck, no rollover is needed */
261 rtc_tm_to_time(&now, &t_now); 259 t_now = rtc_tm_to_time64(&now);
262 rtc_tm_to_time(&alarm->time, &t_alm); 260 t_alm = rtc_tm_to_time64(&alarm->time);
263 if (t_now < t_alm) 261 if (t_now < t_alm)
264 goto done; 262 goto done;
265 263
@@ -273,7 +271,7 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
273 case day: 271 case day:
274 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "day"); 272 dev_dbg(&rtc->dev, "alarm rollover: %s\n", "day");
275 t_alm += 24 * 60 * 60; 273 t_alm += 24 * 60 * 60;
276 rtc_time_to_tm(t_alm, &alarm->time); 274 rtc_time64_to_tm(t_alm, &alarm->time);
277 break; 275 break;
278 276
279 /* Month rollover ... if it's the 31th, an alarm on the 3rd will 277 /* Month rollover ... if it's the 31th, an alarm on the 3rd will
@@ -346,19 +344,19 @@ EXPORT_SYMBOL_GPL(rtc_read_alarm);
346static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm) 344static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
347{ 345{
348 struct rtc_time tm; 346 struct rtc_time tm;
349 long now, scheduled; 347 time64_t now, scheduled;
350 int err; 348 int err;
351 349
352 err = rtc_valid_tm(&alarm->time); 350 err = rtc_valid_tm(&alarm->time);
353 if (err) 351 if (err)
354 return err; 352 return err;
355 rtc_tm_to_time(&alarm->time, &scheduled); 353 scheduled = rtc_tm_to_time64(&alarm->time);
356 354
357 /* Make sure we're not setting alarms in the past */ 355 /* Make sure we're not setting alarms in the past */
358 err = __rtc_read_time(rtc, &tm); 356 err = __rtc_read_time(rtc, &tm);
359 if (err) 357 if (err)
360 return err; 358 return err;
361 rtc_tm_to_time(&tm, &now); 359 now = rtc_tm_to_time64(&tm);
362 if (scheduled <= now) 360 if (scheduled <= now)
363 return -ETIME; 361 return -ETIME;
364 /* 362 /*