mirror of https://gitee.com/openkylin/linux.git
drivers/rtc: Provide y2038 safe rtc_class_ops.set_mmss() replacement
Currently the rtc_class_op's set_mmss() function takes a 32-bit second value (on 32-bit systems), which is problematic for dates past y2038. This patch provides a safe version named set_mmss64() using y2038 safe time64_t. After this patch, set_mmss() is deprecated and all its users will be fixed to use set_mmss64(), it can be removed when having no users. Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org> [jstultz: Add whitespace fix for checkpatch] Signed-off-by: John Stultz <john.stultz@linaro.org> Acked-by: Alessandro Zummo <a.zummo@towertech.it> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/1427945681-29972-8-git-send-email-john.stultz@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
cb850717b0
commit
8e4ff1a81a
|
@ -72,7 +72,11 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
|
|||
err = -ENODEV;
|
||||
else if (rtc->ops->set_time)
|
||||
err = rtc->ops->set_time(rtc->dev.parent, tm);
|
||||
else if (rtc->ops->set_mmss) {
|
||||
else if (rtc->ops->set_mmss64) {
|
||||
time64_t secs64 = rtc_tm_to_time64(tm);
|
||||
|
||||
err = rtc->ops->set_mmss64(rtc->dev.parent, secs64);
|
||||
} else if (rtc->ops->set_mmss) {
|
||||
time64_t secs64 = rtc_tm_to_time64(tm);
|
||||
err = rtc->ops->set_mmss(rtc->dev.parent, secs64);
|
||||
} else
|
||||
|
@ -96,6 +100,8 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
|
|||
|
||||
if (!rtc->ops)
|
||||
err = -ENODEV;
|
||||
else if (rtc->ops->set_mmss64)
|
||||
err = rtc->ops->set_mmss64(rtc->dev.parent, secs);
|
||||
else if (rtc->ops->set_mmss)
|
||||
err = rtc->ops->set_mmss(rtc->dev.parent, secs);
|
||||
else if (rtc->ops->read_time && rtc->ops->set_time) {
|
||||
|
|
|
@ -35,7 +35,10 @@ int rtc_set_ntp_time(struct timespec64 now)
|
|||
if (rtc) {
|
||||
/* rtc_hctosys exclusively uses UTC, so we call set_time here,
|
||||
* not set_mmss. */
|
||||
if (rtc->ops && (rtc->ops->set_time || rtc->ops->set_mmss))
|
||||
if (rtc->ops &&
|
||||
(rtc->ops->set_time ||
|
||||
rtc->ops->set_mmss64 ||
|
||||
rtc->ops->set_mmss))
|
||||
err = rtc_set_time(rtc, &tm);
|
||||
rtc_class_close(rtc);
|
||||
}
|
||||
|
|
|
@ -77,6 +77,7 @@ struct rtc_class_ops {
|
|||
int (*read_alarm)(struct device *, struct rtc_wkalrm *);
|
||||
int (*set_alarm)(struct device *, struct rtc_wkalrm *);
|
||||
int (*proc)(struct device *, struct seq_file *);
|
||||
int (*set_mmss64)(struct device *, time64_t secs);
|
||||
int (*set_mmss)(struct device *, unsigned long secs);
|
||||
int (*read_callback)(struct device *, int data);
|
||||
int (*alarm_irq_enable)(struct device *, unsigned int enabled);
|
||||
|
|
Loading…
Reference in New Issue