aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/class.c8
-rw-r--r--drivers/rtc/interface.c8
-rw-r--r--drivers/rtc/rtc-ab3100.c55
-rw-r--r--drivers/rtc/rtc-cmos.c36
-rw-r--r--drivers/rtc/rtc-ds1305.c6
-rw-r--r--drivers/rtc/rtc-hid-sensor-time.c2
-rw-r--r--drivers/rtc/rtc-mc13xxx.c32
-rw-r--r--drivers/rtc/rtc-mrst.c16
-rw-r--r--drivers/rtc/rtc-mxc.c55
-rw-r--r--drivers/rtc/rtc-s5m.c60
-rw-r--r--drivers/rtc/rtc-tegra.c4
-rw-r--r--drivers/rtc/rtc-test.c19
-rw-r--r--drivers/rtc/systohc.c7
13 files changed, 127 insertions, 181 deletions
diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c
index 472a5adc4642..c29ba7e14304 100644
--- a/drivers/rtc/class.c
+++ b/drivers/rtc/class.c
@@ -55,7 +55,7 @@ static int rtc_suspend(struct device *dev)
55 struct timespec64 delta, delta_delta; 55 struct timespec64 delta, delta_delta;
56 int err; 56 int err;
57 57
58 if (has_persistent_clock()) 58 if (timekeeping_rtc_skipsuspend())
59 return 0; 59 return 0;
60 60
61 if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0) 61 if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
@@ -102,7 +102,7 @@ static int rtc_resume(struct device *dev)
102 struct timespec64 sleep_time; 102 struct timespec64 sleep_time;
103 int err; 103 int err;
104 104
105 if (has_persistent_clock()) 105 if (timekeeping_rtc_skipresume())
106 return 0; 106 return 0;
107 107
108 rtc_hctosys_ret = -ENODEV; 108 rtc_hctosys_ret = -ENODEV;
@@ -117,10 +117,6 @@ static int rtc_resume(struct device *dev)
117 return 0; 117 return 0;
118 } 118 }
119 119
120 if (rtc_valid_tm(&tm) != 0) {
121 pr_debug("%s: bogus resume time\n", dev_name(&rtc->dev));
122 return 0;
123 }
124 new_rtc.tv_sec = rtc_tm_to_time64(&tm); 120 new_rtc.tv_sec = rtc_tm_to_time64(&tm);
125 new_rtc.tv_nsec = 0; 121 new_rtc.tv_nsec = 0;
126 122
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 37215cf983e9..d43ee409a5f2 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -72,7 +72,11 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm)
72 err = -ENODEV; 72 err = -ENODEV;
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_mmss64) {
76 time64_t secs64 = rtc_tm_to_time64(tm);
77
78 err = rtc->ops->set_mmss64(rtc->dev.parent, secs64);
79 } else if (rtc->ops->set_mmss) {
76 time64_t secs64 = rtc_tm_to_time64(tm); 80 time64_t secs64 = rtc_tm_to_time64(tm);
77 err = rtc->ops->set_mmss(rtc->dev.parent, secs64); 81 err = rtc->ops->set_mmss(rtc->dev.parent, secs64);
78 } else 82 } else
@@ -96,6 +100,8 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs)
96 100
97 if (!rtc->ops) 101 if (!rtc->ops)
98 err = -ENODEV; 102 err = -ENODEV;
103 else if (rtc->ops->set_mmss64)
104 err = rtc->ops->set_mmss64(rtc->dev.parent, secs);
99 else if (rtc->ops->set_mmss) 105 else if (rtc->ops->set_mmss)
100 err = rtc->ops->set_mmss(rtc->dev.parent, secs); 106 err = rtc->ops->set_mmss(rtc->dev.parent, secs);
101 else if (rtc->ops->read_time && rtc->ops->set_time) { 107 else if (rtc->ops->read_time && rtc->ops->set_time) {
diff --git a/drivers/rtc/rtc-ab3100.c b/drivers/rtc/rtc-ab3100.c
index 1d0340fdb820..9b725c553058 100644
--- a/drivers/rtc/rtc-ab3100.c
+++ b/drivers/rtc/rtc-ab3100.c
@@ -43,21 +43,21 @@
43/* 43/*
44 * RTC clock functions and device struct declaration 44 * RTC clock functions and device struct declaration
45 */ 45 */
46static int ab3100_rtc_set_mmss(struct device *dev, unsigned long secs) 46static int ab3100_rtc_set_mmss(struct device *dev, time64_t secs)
47{ 47{
48 u8 regs[] = {AB3100_TI0, AB3100_TI1, AB3100_TI2, 48 u8 regs[] = {AB3100_TI0, AB3100_TI1, AB3100_TI2,
49 AB3100_TI3, AB3100_TI4, AB3100_TI5}; 49 AB3100_TI3, AB3100_TI4, AB3100_TI5};
50 unsigned char buf[6]; 50 unsigned char buf[6];
51 u64 fat_time = (u64) secs * AB3100_RTC_CLOCK_RATE * 2; 51 u64 hw_counter = secs * AB3100_RTC_CLOCK_RATE * 2;
52 int err = 0; 52 int err = 0;
53 int i; 53 int i;
54 54
55 buf[0] = (fat_time) & 0xFF; 55 buf[0] = (hw_counter) & 0xFF;
56 buf[1] = (fat_time >> 8) & 0xFF; 56 buf[1] = (hw_counter >> 8) & 0xFF;
57 buf[2] = (fat_time >> 16) & 0xFF; 57 buf[2] = (hw_counter >> 16) & 0xFF;
58 buf[3] = (fat_time >> 24) & 0xFF; 58 buf[3] = (hw_counter >> 24) & 0xFF;
59 buf[4] = (fat_time >> 32) & 0xFF; 59 buf[4] = (hw_counter >> 32) & 0xFF;
60 buf[5] = (fat_time >> 40) & 0xFF; 60 buf[5] = (hw_counter >> 40) & 0xFF;
61 61
62 for (i = 0; i < 6; i++) { 62 for (i = 0; i < 6; i++) {
63 err = abx500_set_register_interruptible(dev, 0, 63 err = abx500_set_register_interruptible(dev, 0,
@@ -75,7 +75,7 @@ static int ab3100_rtc_set_mmss(struct device *dev, unsigned long secs)
75 75
76static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm) 76static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm)
77{ 77{
78 unsigned long time; 78 time64_t time;
79 u8 rtcval; 79 u8 rtcval;
80 int err; 80 int err;
81 81
@@ -88,7 +88,7 @@ static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm)
88 dev_info(dev, "clock not set (lost power)"); 88 dev_info(dev, "clock not set (lost power)");
89 return -EINVAL; 89 return -EINVAL;
90 } else { 90 } else {
91 u64 fat_time; 91 u64 hw_counter;
92 u8 buf[6]; 92 u8 buf[6];
93 93
94 /* Read out time registers */ 94 /* Read out time registers */
@@ -98,22 +98,21 @@ static int ab3100_rtc_read_time(struct device *dev, struct rtc_time *tm)
98 if (err != 0) 98 if (err != 0)
99 return err; 99 return err;
100 100
101 fat_time = ((u64) buf[5] << 40) | ((u64) buf[4] << 32) | 101 hw_counter = ((u64) buf[5] << 40) | ((u64) buf[4] << 32) |
102 ((u64) buf[3] << 24) | ((u64) buf[2] << 16) | 102 ((u64) buf[3] << 24) | ((u64) buf[2] << 16) |
103 ((u64) buf[1] << 8) | (u64) buf[0]; 103 ((u64) buf[1] << 8) | (u64) buf[0];
104 time = (unsigned long) (fat_time / 104 time = hw_counter / (u64) (AB3100_RTC_CLOCK_RATE * 2);
105 (u64) (AB3100_RTC_CLOCK_RATE * 2));
106 } 105 }
107 106
108 rtc_time_to_tm(time, tm); 107 rtc_time64_to_tm(time, tm);
109 108
110 return rtc_valid_tm(tm); 109 return rtc_valid_tm(tm);
111} 110}
112 111
113static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) 112static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
114{ 113{
115 unsigned long time; 114 time64_t time;
116 u64 fat_time; 115 u64 hw_counter;
117 u8 buf[6]; 116 u8 buf[6];
118 u8 rtcval; 117 u8 rtcval;
119 int err; 118 int err;
@@ -134,11 +133,11 @@ static int ab3100_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
134 AB3100_AL0, buf, 4); 133 AB3100_AL0, buf, 4);
135 if (err) 134 if (err)
136 return err; 135 return err;
137 fat_time = ((u64) buf[3] << 40) | ((u64) buf[2] << 32) | 136 hw_counter = ((u64) buf[3] << 40) | ((u64) buf[2] << 32) |
138 ((u64) buf[1] << 24) | ((u64) buf[0] << 16); 137 ((u64) buf[1] << 24) | ((u64) buf[0] << 16);
139 time = (unsigned long) (fat_time / (u64) (AB3100_RTC_CLOCK_RATE * 2)); 138 time = hw_counter / (u64) (AB3100_RTC_CLOCK_RATE * 2);
140 139
141 rtc_time_to_tm(time, &alarm->time); 140 rtc_time64_to_tm(time, &alarm->time);
142 141
143 return rtc_valid_tm(&alarm->time); 142 return rtc_valid_tm(&alarm->time);
144} 143}
@@ -147,17 +146,17 @@ static int ab3100_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
147{ 146{
148 u8 regs[] = {AB3100_AL0, AB3100_AL1, AB3100_AL2, AB3100_AL3}; 147 u8 regs[] = {AB3100_AL0, AB3100_AL1, AB3100_AL2, AB3100_AL3};
149 unsigned char buf[4]; 148 unsigned char buf[4];
150 unsigned long secs; 149 time64_t secs;
151 u64 fat_time; 150 u64 hw_counter;
152 int err; 151 int err;
153 int i; 152 int i;
154 153
155 rtc_tm_to_time(&alarm->time, &secs); 154 secs = rtc_tm_to_time64(&alarm->time);
156 fat_time = (u64) secs * AB3100_RTC_CLOCK_RATE * 2; 155 hw_counter = secs * AB3100_RTC_CLOCK_RATE * 2;
157 buf[0] = (fat_time >> 16) & 0xFF; 156 buf[0] = (hw_counter >> 16) & 0xFF;
158 buf[1] = (fat_time >> 24) & 0xFF; 157 buf[1] = (hw_counter >> 24) & 0xFF;
159 buf[2] = (fat_time >> 32) & 0xFF; 158 buf[2] = (hw_counter >> 32) & 0xFF;
160 buf[3] = (fat_time >> 40) & 0xFF; 159 buf[3] = (hw_counter >> 40) & 0xFF;
161 160
162 /* Set the alarm */ 161 /* Set the alarm */
163 for (i = 0; i < 4; i++) { 162 for (i = 0; i < 4; i++) {
@@ -193,7 +192,7 @@ static int ab3100_rtc_irq_enable(struct device *dev, unsigned int enabled)
193 192
194static const struct rtc_class_ops ab3100_rtc_ops = { 193static const struct rtc_class_ops ab3100_rtc_ops = {
195 .read_time = ab3100_rtc_read_time, 194 .read_time = ab3100_rtc_read_time,
196 .set_mmss = ab3100_rtc_set_mmss, 195 .set_mmss64 = ab3100_rtc_set_mmss,
197 .read_alarm = ab3100_rtc_read_alarm, 196 .read_alarm = ab3100_rtc_read_alarm,
198 .set_alarm = ab3100_rtc_set_alarm, 197 .set_alarm = ab3100_rtc_set_alarm,
199 .alarm_irq_enable = ab3100_rtc_irq_enable, 198 .alarm_irq_enable = ab3100_rtc_irq_enable,
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index 5b2e76159b41..87647f459198 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -459,23 +459,25 @@ static int cmos_procfs(struct device *dev, struct seq_file *seq)
459 /* NOTE: at least ICH6 reports battery status using a different 459 /* NOTE: at least ICH6 reports battery status using a different
460 * (non-RTC) bit; and SQWE is ignored on many current systems. 460 * (non-RTC) bit; and SQWE is ignored on many current systems.
461 */ 461 */
462 return seq_printf(seq, 462 seq_printf(seq,
463 "periodic_IRQ\t: %s\n" 463 "periodic_IRQ\t: %s\n"
464 "update_IRQ\t: %s\n" 464 "update_IRQ\t: %s\n"
465 "HPET_emulated\t: %s\n" 465 "HPET_emulated\t: %s\n"
466 // "square_wave\t: %s\n" 466 // "square_wave\t: %s\n"
467 "BCD\t\t: %s\n" 467 "BCD\t\t: %s\n"
468 "DST_enable\t: %s\n" 468 "DST_enable\t: %s\n"
469 "periodic_freq\t: %d\n" 469 "periodic_freq\t: %d\n"
470 "batt_status\t: %s\n", 470 "batt_status\t: %s\n",
471 (rtc_control & RTC_PIE) ? "yes" : "no", 471 (rtc_control & RTC_PIE) ? "yes" : "no",
472 (rtc_control & RTC_UIE) ? "yes" : "no", 472 (rtc_control & RTC_UIE) ? "yes" : "no",
473 is_hpet_enabled() ? "yes" : "no", 473 is_hpet_enabled() ? "yes" : "no",
474 // (rtc_control & RTC_SQWE) ? "yes" : "no", 474 // (rtc_control & RTC_SQWE) ? "yes" : "no",
475 (rtc_control & RTC_DM_BINARY) ? "no" : "yes", 475 (rtc_control & RTC_DM_BINARY) ? "no" : "yes",
476 (rtc_control & RTC_DST_EN) ? "yes" : "no", 476 (rtc_control & RTC_DST_EN) ? "yes" : "no",
477 cmos->rtc->irq_freq, 477 cmos->rtc->irq_freq,
478 (valid & RTC_VRT) ? "okay" : "dead"); 478 (valid & RTC_VRT) ? "okay" : "dead");
479
480 return 0;
479} 481}
480 482
481#else 483#else
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c
index 129add77065d..12b07158a366 100644
--- a/drivers/rtc/rtc-ds1305.c
+++ b/drivers/rtc/rtc-ds1305.c
@@ -434,9 +434,9 @@ static int ds1305_proc(struct device *dev, struct seq_file *seq)
434 } 434 }
435 435
436done: 436done:
437 return seq_printf(seq, 437 seq_printf(seq, "trickle_charge\t: %s%s\n", diodes, resistors);
438 "trickle_charge\t: %s%s\n", 438
439 diodes, resistors); 439 return 0;
440} 440}
441 441
442#else 442#else
diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c
index ae7c2ba440cf..af4f85a66b39 100644
--- a/drivers/rtc/rtc-hid-sensor-time.c
+++ b/drivers/rtc/rtc-hid-sensor-time.c
@@ -213,7 +213,7 @@ static int hid_rtc_read_time(struct device *dev, struct rtc_time *tm)
213 /* get a report with all values through requesting one value */ 213 /* get a report with all values through requesting one value */
214 sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev, 214 sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev,
215 HID_USAGE_SENSOR_TIME, hid_time_addresses[0], 215 HID_USAGE_SENSOR_TIME, hid_time_addresses[0],
216 time_state->info[0].report_id); 216 time_state->info[0].report_id, SENSOR_HUB_SYNC);
217 /* wait for all values (event) */ 217 /* wait for all values (event) */
218 ret = wait_for_completion_killable_timeout( 218 ret = wait_for_completion_killable_timeout(
219 &time_state->comp_last_time, HZ*6); 219 &time_state->comp_last_time, HZ*6);
diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c
index 5bce904b7ee6..32df1d812367 100644
--- a/drivers/rtc/rtc-mc13xxx.c
+++ b/drivers/rtc/rtc-mc13xxx.c
@@ -83,20 +83,19 @@ static int mc13xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
83 return ret; 83 return ret;
84 } while (days1 != days2); 84 } while (days1 != days2);
85 85
86 rtc_time_to_tm(days1 * SEC_PER_DAY + seconds, tm); 86 rtc_time64_to_tm((time64_t)days1 * SEC_PER_DAY + seconds, tm);
87 87
88 return rtc_valid_tm(tm); 88 return rtc_valid_tm(tm);
89} 89}
90 90
91static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs) 91static int mc13xxx_rtc_set_mmss(struct device *dev, time64_t secs)
92{ 92{
93 struct mc13xxx_rtc *priv = dev_get_drvdata(dev); 93 struct mc13xxx_rtc *priv = dev_get_drvdata(dev);
94 unsigned int seconds, days; 94 unsigned int seconds, days;
95 unsigned int alarmseconds; 95 unsigned int alarmseconds;
96 int ret; 96 int ret;
97 97
98 seconds = secs % SEC_PER_DAY; 98 days = div_s64_rem(secs, SEC_PER_DAY, &seconds);
99 days = secs / SEC_PER_DAY;
100 99
101 mc13xxx_lock(priv->mc13xxx); 100 mc13xxx_lock(priv->mc13xxx);
102 101
@@ -159,7 +158,7 @@ static int mc13xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
159{ 158{
160 struct mc13xxx_rtc *priv = dev_get_drvdata(dev); 159 struct mc13xxx_rtc *priv = dev_get_drvdata(dev);
161 unsigned seconds, days; 160 unsigned seconds, days;
162 unsigned long s1970; 161 time64_t s1970;
163 int enabled, pending; 162 int enabled, pending;
164 int ret; 163 int ret;
165 164
@@ -189,10 +188,10 @@ out:
189 alarm->enabled = enabled; 188 alarm->enabled = enabled;
190 alarm->pending = pending; 189 alarm->pending = pending;
191 190
192 s1970 = days * SEC_PER_DAY + seconds; 191 s1970 = (time64_t)days * SEC_PER_DAY + seconds;
193 192
194 rtc_time_to_tm(s1970, &alarm->time); 193 rtc_time64_to_tm(s1970, &alarm->time);
195 dev_dbg(dev, "%s: %lu\n", __func__, s1970); 194 dev_dbg(dev, "%s: %lld\n", __func__, (long long)s1970);
196 195
197 return 0; 196 return 0;
198} 197}
@@ -200,8 +199,8 @@ out:
200static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) 199static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
201{ 200{
202 struct mc13xxx_rtc *priv = dev_get_drvdata(dev); 201 struct mc13xxx_rtc *priv = dev_get_drvdata(dev);
203 unsigned long s1970; 202 time64_t s1970;
204 unsigned seconds, days; 203 u32 seconds, days;
205 int ret; 204 int ret;
206 205
207 mc13xxx_lock(priv->mc13xxx); 206 mc13xxx_lock(priv->mc13xxx);
@@ -215,20 +214,17 @@ static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
215 if (unlikely(ret)) 214 if (unlikely(ret))
216 goto out; 215 goto out;
217 216
218 ret = rtc_tm_to_time(&alarm->time, &s1970); 217 s1970 = rtc_tm_to_time64(&alarm->time);
219 if (unlikely(ret))
220 goto out;
221 218
222 dev_dbg(dev, "%s: o%2.s %lu\n", __func__, alarm->enabled ? "n" : "ff", 219 dev_dbg(dev, "%s: o%2.s %lld\n", __func__, alarm->enabled ? "n" : "ff",
223 s1970); 220 (long long)s1970);
224 221
225 ret = mc13xxx_rtc_irq_enable_unlocked(dev, alarm->enabled, 222 ret = mc13xxx_rtc_irq_enable_unlocked(dev, alarm->enabled,
226 MC13XXX_IRQ_TODA); 223 MC13XXX_IRQ_TODA);
227 if (unlikely(ret)) 224 if (unlikely(ret))
228 goto out; 225 goto out;
229 226
230 seconds = s1970 % SEC_PER_DAY; 227 days = div_s64_rem(s1970, SEC_PER_DAY, &seconds);
231 days = s1970 / SEC_PER_DAY;
232 228
233 ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days); 229 ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days);
234 if (unlikely(ret)) 230 if (unlikely(ret))
@@ -268,7 +264,7 @@ static irqreturn_t mc13xxx_rtc_update_handler(int irq, void *dev)
268 264
269static const struct rtc_class_ops mc13xxx_rtc_ops = { 265static const struct rtc_class_ops mc13xxx_rtc_ops = {
270 .read_time = mc13xxx_rtc_read_time, 266 .read_time = mc13xxx_rtc_read_time,
271 .set_mmss = mc13xxx_rtc_set_mmss, 267 .set_mmss64 = mc13xxx_rtc_set_mmss,
272 .read_alarm = mc13xxx_rtc_read_alarm, 268 .read_alarm = mc13xxx_rtc_read_alarm,
273 .set_alarm = mc13xxx_rtc_set_alarm, 269 .set_alarm = mc13xxx_rtc_set_alarm,
274 .alarm_irq_enable = mc13xxx_rtc_alarm_irq_enable, 270 .alarm_irq_enable = mc13xxx_rtc_alarm_irq_enable,
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c
index 3a6fd3a8a2ec..548ea6f6f384 100644
--- a/drivers/rtc/rtc-mrst.c
+++ b/drivers/rtc/rtc-mrst.c
@@ -277,13 +277,15 @@ static int mrst_procfs(struct device *dev, struct seq_file *seq)
277 valid = vrtc_cmos_read(RTC_VALID); 277 valid = vrtc_cmos_read(RTC_VALID);
278 spin_unlock_irq(&rtc_lock); 278 spin_unlock_irq(&rtc_lock);
279 279
280 return seq_printf(seq, 280 seq_printf(seq,
281 "periodic_IRQ\t: %s\n" 281 "periodic_IRQ\t: %s\n"
282 "alarm\t\t: %s\n" 282 "alarm\t\t: %s\n"
283 "BCD\t\t: no\n" 283 "BCD\t\t: no\n"
284 "periodic_freq\t: daily (not adjustable)\n", 284 "periodic_freq\t: daily (not adjustable)\n",
285 (rtc_control & RTC_PIE) ? "on" : "off", 285 (rtc_control & RTC_PIE) ? "on" : "off",
286 (rtc_control & RTC_AIE) ? "on" : "off"); 286 (rtc_control & RTC_AIE) ? "on" : "off");
287
288 return 0;
287} 289}
288 290
289#else 291#else
diff --git a/drivers/rtc/rtc-mxc.c b/drivers/rtc/rtc-mxc.c
index 3c3f8d10ab43..09d422b9f7f7 100644
--- a/drivers/rtc/rtc-mxc.c
+++ b/drivers/rtc/rtc-mxc.c
@@ -106,7 +106,7 @@ static inline int is_imx1_rtc(struct rtc_plat_data *data)
106 * This function is used to obtain the RTC time or the alarm value in 106 * This function is used to obtain the RTC time or the alarm value in
107 * second. 107 * second.
108 */ 108 */
109static u32 get_alarm_or_time(struct device *dev, int time_alarm) 109static time64_t get_alarm_or_time(struct device *dev, int time_alarm)
110{ 110{
111 struct platform_device *pdev = to_platform_device(dev); 111 struct platform_device *pdev = to_platform_device(dev);
112 struct rtc_plat_data *pdata = platform_get_drvdata(pdev); 112 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
@@ -129,29 +129,28 @@ static u32 get_alarm_or_time(struct device *dev, int time_alarm)
129 hr = hr_min >> 8; 129 hr = hr_min >> 8;
130 min = hr_min & 0xff; 130 min = hr_min & 0xff;
131 131
132 return (((day * 24 + hr) * 60) + min) * 60 + sec; 132 return ((((time64_t)day * 24 + hr) * 60) + min) * 60 + sec;
133} 133}
134 134
135/* 135/*
136 * This function sets the RTC alarm value or the time value. 136 * This function sets the RTC alarm value or the time value.
137 */ 137 */
138static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time) 138static void set_alarm_or_time(struct device *dev, int time_alarm, time64_t time)
139{ 139{
140 u32 day, hr, min, sec, temp; 140 u32 tod, day, hr, min, sec, temp;
141 struct platform_device *pdev = to_platform_device(dev); 141 struct platform_device *pdev = to_platform_device(dev);
142 struct rtc_plat_data *pdata = platform_get_drvdata(pdev); 142 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
143 void __iomem *ioaddr = pdata->ioaddr; 143 void __iomem *ioaddr = pdata->ioaddr;
144 144
145 day = time / 86400; 145 day = div_s64_rem(time, 86400, &tod);
146 time -= day * 86400;
147 146
148 /* time is within a day now */ 147 /* time is within a day now */
149 hr = time / 3600; 148 hr = tod / 3600;
150 time -= hr * 3600; 149 tod -= hr * 3600;
151 150
152 /* time is within an hour now */ 151 /* time is within an hour now */
153 min = time / 60; 152 min = tod / 60;
154 sec = time - min * 60; 153 sec = tod - min * 60;
155 154
156 temp = (hr << 8) + min; 155 temp = (hr << 8) + min;
157 156
@@ -173,29 +172,18 @@ static void set_alarm_or_time(struct device *dev, int time_alarm, u32 time)
173 * This function updates the RTC alarm registers and then clears all the 172 * This function updates the RTC alarm registers and then clears all the
174 * interrupt status bits. 173 * interrupt status bits.
175 */ 174 */
176static int rtc_update_alarm(struct device *dev, struct rtc_time *alrm) 175static void rtc_update_alarm(struct device *dev, struct rtc_time *alrm)
177{ 176{
178 struct rtc_time alarm_tm, now_tm; 177 time64_t time;
179 unsigned long now, time;
180 struct platform_device *pdev = to_platform_device(dev); 178 struct platform_device *pdev = to_platform_device(dev);
181 struct rtc_plat_data *pdata = platform_get_drvdata(pdev); 179 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
182 void __iomem *ioaddr = pdata->ioaddr; 180 void __iomem *ioaddr = pdata->ioaddr;
183 181
184 now = get_alarm_or_time(dev, MXC_RTC_TIME); 182 time = rtc_tm_to_time64(alrm);
185 rtc_time_to_tm(now, &now_tm);
186 alarm_tm.tm_year = now_tm.tm_year;
187 alarm_tm.tm_mon = now_tm.tm_mon;
188 alarm_tm.tm_mday = now_tm.tm_mday;
189 alarm_tm.tm_hour = alrm->tm_hour;
190 alarm_tm.tm_min = alrm->tm_min;
191 alarm_tm.tm_sec = alrm->tm_sec;
192 rtc_tm_to_time(&alarm_tm, &time);
193 183
194 /* clear all the interrupt status bits */ 184 /* clear all the interrupt status bits */
195 writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR); 185 writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR);
196 set_alarm_or_time(dev, MXC_RTC_ALARM, time); 186 set_alarm_or_time(dev, MXC_RTC_ALARM, time);
197
198 return 0;
199} 187}
200 188
201static void mxc_rtc_irq_enable(struct device *dev, unsigned int bit, 189static void mxc_rtc_irq_enable(struct device *dev, unsigned int bit,
@@ -283,14 +271,14 @@ static int mxc_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
283 */ 271 */
284static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm) 272static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm)
285{ 273{
286 u32 val; 274 time64_t val;
287 275
288 /* Avoid roll-over from reading the different registers */ 276 /* Avoid roll-over from reading the different registers */
289 do { 277 do {
290 val = get_alarm_or_time(dev, MXC_RTC_TIME); 278 val = get_alarm_or_time(dev, MXC_RTC_TIME);
291 } while (val != get_alarm_or_time(dev, MXC_RTC_TIME)); 279 } while (val != get_alarm_or_time(dev, MXC_RTC_TIME));
292 280
293 rtc_time_to_tm(val, tm); 281 rtc_time64_to_tm(val, tm);
294 282
295 return 0; 283 return 0;
296} 284}
@@ -298,7 +286,7 @@ static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm)
298/* 286/*
299 * This function sets the internal RTC time based on tm in Gregorian date. 287 * This function sets the internal RTC time based on tm in Gregorian date.
300 */ 288 */
301static int mxc_rtc_set_mmss(struct device *dev, unsigned long time) 289static int mxc_rtc_set_mmss(struct device *dev, time64_t time)
302{ 290{
303 struct platform_device *pdev = to_platform_device(dev); 291 struct platform_device *pdev = to_platform_device(dev);
304 struct rtc_plat_data *pdata = platform_get_drvdata(pdev); 292 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
@@ -309,9 +297,9 @@ static int mxc_rtc_set_mmss(struct device *dev, unsigned long time)
309 if (is_imx1_rtc(pdata)) { 297 if (is_imx1_rtc(pdata)) {
310 struct rtc_time tm; 298 struct rtc_time tm;
311 299
312 rtc_time_to_tm(time, &tm); 300 rtc_time64_to_tm(time, &tm);
313 tm.tm_year = 70; 301 tm.tm_year = 70;
314 rtc_tm_to_time(&tm, &time); 302 time = rtc_tm_to_time64(&tm);
315 } 303 }
316 304
317 /* Avoid roll-over from reading the different registers */ 305 /* Avoid roll-over from reading the different registers */
@@ -333,7 +321,7 @@ static int mxc_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
333 struct rtc_plat_data *pdata = platform_get_drvdata(pdev); 321 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
334 void __iomem *ioaddr = pdata->ioaddr; 322 void __iomem *ioaddr = pdata->ioaddr;
335 323
336 rtc_time_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time); 324 rtc_time64_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time);
337 alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0; 325 alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0;
338 326
339 return 0; 327 return 0;
@@ -346,11 +334,8 @@ static int mxc_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
346{ 334{
347 struct platform_device *pdev = to_platform_device(dev); 335 struct platform_device *pdev = to_platform_device(dev);
348 struct rtc_plat_data *pdata = platform_get_drvdata(pdev); 336 struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
349 int ret;
350 337
351 ret = rtc_update_alarm(dev, &alrm->time); 338 rtc_update_alarm(dev, &alrm->time);
352 if (ret)
353 return ret;
354 339
355 memcpy(&pdata->g_rtc_alarm, &alrm->time, sizeof(struct rtc_time)); 340 memcpy(&pdata->g_rtc_alarm, &alrm->time, sizeof(struct rtc_time));
356 mxc_rtc_irq_enable(dev, RTC_ALM_BIT, alrm->enabled); 341 mxc_rtc_irq_enable(dev, RTC_ALM_BIT, alrm->enabled);
@@ -362,7 +347,7 @@ static int mxc_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
362static struct rtc_class_ops mxc_rtc_ops = { 347static struct rtc_class_ops mxc_rtc_ops = {
363 .release = mxc_rtc_release, 348 .release = mxc_rtc_release,
364 .read_time = mxc_rtc_read_time, 349 .read_time = mxc_rtc_read_time,
365 .set_mmss = mxc_rtc_set_mmss, 350 .set_mmss64 = mxc_rtc_set_mmss,
366 .read_alarm = mxc_rtc_read_alarm, 351 .read_alarm = mxc_rtc_read_alarm,
367 .set_alarm = mxc_rtc_set_alarm, 352 .set_alarm = mxc_rtc_set_alarm,
368 .alarm_irq_enable = mxc_rtc_alarm_irq_enable, 353 .alarm_irq_enable = mxc_rtc_alarm_irq_enable,
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index 89ac1d5083c6..4008b84246ca 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -48,8 +48,6 @@ struct s5m_rtc_reg_config {
48 unsigned int alarm0; 48 unsigned int alarm0;
49 /* First register for alarm 1, seconds */ 49 /* First register for alarm 1, seconds */
50 unsigned int alarm1; 50 unsigned int alarm1;
51 /* SMPL/WTSR register */
52 unsigned int smpl_wtsr;
53 /* 51 /*
54 * Register for update flag (UDR). Typically setting UDR field to 1 52 * Register for update flag (UDR). Typically setting UDR field to 1
55 * will enable update of time or alarm register. Then it will be 53 * will enable update of time or alarm register. Then it will be
@@ -67,7 +65,6 @@ static const struct s5m_rtc_reg_config s5m_rtc_regs = {
67 .ctrl = S5M_ALARM1_CONF, 65 .ctrl = S5M_ALARM1_CONF,
68 .alarm0 = S5M_ALARM0_SEC, 66 .alarm0 = S5M_ALARM0_SEC,
69 .alarm1 = S5M_ALARM1_SEC, 67 .alarm1 = S5M_ALARM1_SEC,
70 .smpl_wtsr = S5M_WTSR_SMPL_CNTL,
71 .rtc_udr_update = S5M_RTC_UDR_CON, 68 .rtc_udr_update = S5M_RTC_UDR_CON,
72 .rtc_udr_mask = S5M_RTC_UDR_MASK, 69 .rtc_udr_mask = S5M_RTC_UDR_MASK,
73}; 70};
@@ -82,7 +79,6 @@ static const struct s5m_rtc_reg_config s2mps_rtc_regs = {
82 .ctrl = S2MPS_RTC_CTRL, 79 .ctrl = S2MPS_RTC_CTRL,
83 .alarm0 = S2MPS_ALARM0_SEC, 80 .alarm0 = S2MPS_ALARM0_SEC,
84 .alarm1 = S2MPS_ALARM1_SEC, 81 .alarm1 = S2MPS_ALARM1_SEC,
85 .smpl_wtsr = S2MPS_WTSR_SMPL_CNTL,
86 .rtc_udr_update = S2MPS_RTC_UDR_CON, 82 .rtc_udr_update = S2MPS_RTC_UDR_CON,
87 .rtc_udr_mask = S2MPS_RTC_WUDR_MASK, 83 .rtc_udr_mask = S2MPS_RTC_WUDR_MASK,
88}; 84};
@@ -96,7 +92,6 @@ struct s5m_rtc_info {
96 int irq; 92 int irq;
97 int device_type; 93 int device_type;
98 int rtc_24hr_mode; 94 int rtc_24hr_mode;
99 bool wtsr_smpl;
100 const struct s5m_rtc_reg_config *regs; 95 const struct s5m_rtc_reg_config *regs;
101}; 96};
102 97
@@ -597,28 +592,6 @@ static const struct rtc_class_ops s5m_rtc_ops = {
597 .alarm_irq_enable = s5m_rtc_alarm_irq_enable, 592 .alarm_irq_enable = s5m_rtc_alarm_irq_enable,
598}; 593};
599 594
600static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable)
601{
602 int ret;
603 ret = regmap_update_bits(info->regmap, info->regs->smpl_wtsr,
604 WTSR_ENABLE_MASK,
605 enable ? WTSR_ENABLE_MASK : 0);
606 if (ret < 0)
607 dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n",
608 __func__, ret);
609}
610
611static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable)
612{
613 int ret;
614 ret = regmap_update_bits(info->regmap, info->regs->smpl_wtsr,
615 SMPL_ENABLE_MASK,
616 enable ? SMPL_ENABLE_MASK : 0);
617 if (ret < 0)
618 dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n",
619 __func__, ret);
620}
621
622static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info) 595static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
623{ 596{
624 u8 data[2]; 597 u8 data[2];
@@ -715,7 +688,6 @@ static int s5m_rtc_probe(struct platform_device *pdev)
715 info->dev = &pdev->dev; 688 info->dev = &pdev->dev;
716 info->s5m87xx = s5m87xx; 689 info->s5m87xx = s5m87xx;
717 info->device_type = s5m87xx->device_type; 690 info->device_type = s5m87xx->device_type;
718 info->wtsr_smpl = s5m87xx->wtsr_smpl;
719 691
720 if (s5m87xx->irq_data) { 692 if (s5m87xx->irq_data) {
721 info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq); 693 info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq);
@@ -731,11 +703,6 @@ static int s5m_rtc_probe(struct platform_device *pdev)
731 703
732 ret = s5m8767_rtc_init_reg(info); 704 ret = s5m8767_rtc_init_reg(info);
733 705
734 if (info->wtsr_smpl) {
735 s5m_rtc_enable_wtsr(info, true);
736 s5m_rtc_enable_smpl(info, true);
737 }
738
739 device_init_wakeup(&pdev->dev, 1); 706 device_init_wakeup(&pdev->dev, 1);
740 707
741 info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc", 708 info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc",
@@ -768,36 +735,10 @@ err:
768 return ret; 735 return ret;
769} 736}
770 737
771static void s5m_rtc_shutdown(struct platform_device *pdev)
772{
773 struct s5m_rtc_info *info = platform_get_drvdata(pdev);
774 int i;
775 unsigned int val = 0;
776 if (info->wtsr_smpl) {
777 for (i = 0; i < 3; i++) {
778 s5m_rtc_enable_wtsr(info, false);
779 regmap_read(info->regmap, info->regs->smpl_wtsr, &val);
780 pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val);
781 if (val & WTSR_ENABLE_MASK)
782 pr_emerg("%s: fail to disable WTSR\n",
783 __func__);
784 else {
785 pr_info("%s: success to disable WTSR\n",
786 __func__);
787 break;
788 }
789 }
790 }
791 /* Disable SMPL when power off */
792 s5m_rtc_enable_smpl(info, false);
793}
794
795static int s5m_rtc_remove(struct platform_device *pdev) 738static int s5m_rtc_remove(struct platform_device *pdev)
796{ 739{
797 struct s5m_rtc_info *info = platform_get_drvdata(pdev); 740 struct s5m_rtc_info *info = platform_get_drvdata(pdev);
798 741
799 /* Perform also all shutdown steps when removing */
800 s5m_rtc_shutdown(pdev);
801 i2c_unregister_device(info->i2c); 742 i2c_unregister_device(info->i2c);
802 743
803 return 0; 744 return 0;
@@ -842,7 +783,6 @@ static struct platform_driver s5m_rtc_driver = {
842 }, 783 },
843 .probe = s5m_rtc_probe, 784 .probe = s5m_rtc_probe,
844 .remove = s5m_rtc_remove, 785 .remove = s5m_rtc_remove,
845 .shutdown = s5m_rtc_shutdown,
846 .id_table = s5m_rtc_id, 786 .id_table = s5m_rtc_id,
847}; 787};
848 788
diff --git a/drivers/rtc/rtc-tegra.c b/drivers/rtc/rtc-tegra.c
index d948277057d8..60232bd366ef 100644
--- a/drivers/rtc/rtc-tegra.c
+++ b/drivers/rtc/rtc-tegra.c
@@ -261,7 +261,9 @@ static int tegra_rtc_proc(struct device *dev, struct seq_file *seq)
261 if (!dev || !dev->driver) 261 if (!dev || !dev->driver)
262 return 0; 262 return 0;
263 263
264 return seq_printf(seq, "name\t\t: %s\n", dev_name(dev)); 264 seq_printf(seq, "name\t\t: %s\n", dev_name(dev));
265
266 return 0;
265} 267}
266 268
267static irqreturn_t tegra_rtc_irq_handler(int irq, void *data) 269static irqreturn_t tegra_rtc_irq_handler(int irq, void *data)
diff --git a/drivers/rtc/rtc-test.c b/drivers/rtc/rtc-test.c
index 8f86fa91de1a..3a2da4c892d6 100644
--- a/drivers/rtc/rtc-test.c
+++ b/drivers/rtc/rtc-test.c
@@ -13,6 +13,10 @@
13#include <linux/rtc.h> 13#include <linux/rtc.h>
14#include <linux/platform_device.h> 14#include <linux/platform_device.h>
15 15
16static int test_mmss64;
17module_param(test_mmss64, int, 0644);
18MODULE_PARM_DESC(test_mmss64, "Test struct rtc_class_ops.set_mmss64().");
19
16static struct platform_device *test0 = NULL, *test1 = NULL; 20static struct platform_device *test0 = NULL, *test1 = NULL;
17 21
18static int test_rtc_read_alarm(struct device *dev, 22static int test_rtc_read_alarm(struct device *dev,
@@ -30,7 +34,13 @@ static int test_rtc_set_alarm(struct device *dev,
30static int test_rtc_read_time(struct device *dev, 34static int test_rtc_read_time(struct device *dev,
31 struct rtc_time *tm) 35 struct rtc_time *tm)
32{ 36{
33 rtc_time_to_tm(get_seconds(), tm); 37 rtc_time64_to_tm(ktime_get_real_seconds(), tm);
38 return 0;
39}
40
41static int test_rtc_set_mmss64(struct device *dev, time64_t secs)
42{
43 dev_info(dev, "%s, secs = %lld\n", __func__, (long long)secs);
34 return 0; 44 return 0;
35} 45}
36 46
@@ -55,7 +65,7 @@ static int test_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
55 return 0; 65 return 0;
56} 66}
57 67
58static const struct rtc_class_ops test_rtc_ops = { 68static struct rtc_class_ops test_rtc_ops = {
59 .proc = test_rtc_proc, 69 .proc = test_rtc_proc,
60 .read_time = test_rtc_read_time, 70 .read_time = test_rtc_read_time,
61 .read_alarm = test_rtc_read_alarm, 71 .read_alarm = test_rtc_read_alarm,
@@ -101,6 +111,11 @@ static int test_probe(struct platform_device *plat_dev)
101 int err; 111 int err;
102 struct rtc_device *rtc; 112 struct rtc_device *rtc;
103 113
114 if (test_mmss64) {
115 test_rtc_ops.set_mmss64 = test_rtc_set_mmss64;
116 test_rtc_ops.set_mmss = NULL;
117 }
118
104 rtc = devm_rtc_device_register(&plat_dev->dev, "test", 119 rtc = devm_rtc_device_register(&plat_dev->dev, "test",
105 &test_rtc_ops, THIS_MODULE); 120 &test_rtc_ops, THIS_MODULE);
106 if (IS_ERR(rtc)) { 121 if (IS_ERR(rtc)) {
diff --git a/drivers/rtc/systohc.c b/drivers/rtc/systohc.c
index eb71872d0361..7728d5e32bf4 100644
--- a/drivers/rtc/systohc.c
+++ b/drivers/rtc/systohc.c
@@ -11,7 +11,7 @@
11 * rtc_set_ntp_time - Save NTP synchronized time to the RTC 11 * rtc_set_ntp_time - Save NTP synchronized time to the RTC
12 * @now: Current time of day 12 * @now: Current time of day
13 * 13 *
14 * Replacement for the NTP platform function update_persistent_clock 14 * Replacement for the NTP platform function update_persistent_clock64
15 * that stores time for later retrieval by rtc_hctosys. 15 * that stores time for later retrieval by rtc_hctosys.
16 * 16 *
17 * Returns 0 on successful RTC update, -ENODEV if a RTC update is not 17 * Returns 0 on successful RTC update, -ENODEV if a RTC update is not
@@ -35,7 +35,10 @@ int rtc_set_ntp_time(struct timespec64 now)
35 if (rtc) { 35 if (rtc) {
36 /* rtc_hctosys exclusively uses UTC, so we call set_time here, 36 /* rtc_hctosys exclusively uses UTC, so we call set_time here,
37 * not set_mmss. */ 37 * not set_mmss. */
38 if (rtc->ops && (rtc->ops->set_time || rtc->ops->set_mmss)) 38 if (rtc->ops &&
39 (rtc->ops->set_time ||
40 rtc->ops->set_mmss64 ||
41 rtc->ops->set_mmss))
39 err = rtc_set_time(rtc, &tm); 42 err = rtc_set_time(rtc, &tm);
40 rtc_class_close(rtc); 43 rtc_class_close(rtc);
41 } 44 }