blob: 903a82ae83f0cfa510a8fea1675b31712f3627b1 [file] [log] [blame]
David Brownell7be2c7c2007-02-10 01:46:02 -08001/*
2 * RTC class driver for "CMOS RTC": PCs, ACPI, etc
3 *
4 * Copyright (C) 1996 Paul Gortmaker (drivers/char/rtc.c)
5 * Copyright (C) 2006 David Brownell (convert to new framework)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
11 */
12
13/*
14 * The original "cmos clock" chip was an MC146818 chip, now obsolete.
15 * That defined the register interface now provided by all PCs, some
16 * non-PC systems, and incorporated into ACPI. Modern PC chipsets
17 * integrate an MC146818 clone in their southbridge, and boards use
18 * that instead of discrete clones like the DS12887 or M48T86. There
19 * are also clones that connect using the LPC bus.
20 *
21 * That register API is also used directly by various other drivers
22 * (notably for integrated NVRAM), infrastructure (x86 has code to
23 * bypass the RTC framework, directly reading the RTC during boot
24 * and updating minutes/seconds for systems using NTP synch) and
25 * utilities (like userspace 'hwclock', if no /dev node exists).
26 *
27 * So **ALL** calls to CMOS_READ and CMOS_WRITE must be done with
28 * interrupts disabled, holding the global rtc_lock, to exclude those
29 * other drivers and utilities on correctly configured systems.
30 */
Joe Perchesa737e8352015-04-16 12:46:14 -070031
32#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
33
David Brownell7be2c7c2007-02-10 01:46:02 -080034#include <linux/kernel.h>
35#include <linux/module.h>
36#include <linux/init.h>
37#include <linux/interrupt.h>
38#include <linux/spinlock.h>
39#include <linux/platform_device.h>
Jonathan Cameron5d2a5032009-01-06 14:42:12 -080040#include <linux/log2.h>
Paul Fox2fb08e62011-01-12 17:00:07 -080041#include <linux/pm.h>
Sebastian Andrzej Siewior3bcbaf62011-02-22 21:07:46 +010042#include <linux/of.h>
43#include <linux/of_platform.h>
David Brownell7be2c7c2007-02-10 01:46:02 -080044
45/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
Arnd Bergmann5ab788d2016-05-30 20:57:50 +020046#include <linux/mc146818rtc.h>
David Brownell7be2c7c2007-02-10 01:46:02 -080047
David Brownell7be2c7c2007-02-10 01:46:02 -080048struct cmos_rtc {
49 struct rtc_device *rtc;
50 struct device *dev;
51 int irq;
52 struct resource *iomem;
Adrian Huang88b8d332015-07-06 12:19:12 +080053 time64_t alarm_expires;
David Brownell7be2c7c2007-02-10 01:46:02 -080054
David Brownell87ac84f2007-05-08 00:34:00 -070055 void (*wake_on)(struct device *);
56 void (*wake_off)(struct device *);
57
58 u8 enabled_wake;
David Brownell7be2c7c2007-02-10 01:46:02 -080059 u8 suspend_ctrl;
60
61 /* newer hardware extends the original register set */
62 u8 day_alrm;
63 u8 mon_alrm;
64 u8 century;
Gabriele Mazzotta68669d52016-09-20 01:12:44 +020065
66 struct rtc_wkalrm saved_wkalrm;
David Brownell7be2c7c2007-02-10 01:46:02 -080067};
68
69/* both platform and pnp busses use negative numbers for invalid irqs */
Anton Vorontsov2fac6672009-01-06 14:42:11 -080070#define is_valid_irq(n) ((n) > 0)
David Brownell7be2c7c2007-02-10 01:46:02 -080071
72static const char driver_name[] = "rtc_cmos";
73
David Brownellbcd9b892007-04-01 23:49:47 -070074/* The RTC_INTR register may have e.g. RTC_PF set even if RTC_PIE is clear;
75 * always mask it against the irq enable bits in RTC_CONTROL. Bit values
76 * are the same: PF==PIE, AF=AIE, UF=UIE; so RTC_IRQMASK works with both.
77 */
78#define RTC_IRQMASK (RTC_PF | RTC_AF | RTC_UF)
79
80static inline int is_intr(u8 rtc_intr)
81{
82 if (!(rtc_intr & RTC_IRQF))
83 return 0;
84 return rtc_intr & RTC_IRQMASK;
85}
86
David Brownell7be2c7c2007-02-10 01:46:02 -080087/*----------------------------------------------------------------*/
88
David Brownell35d3fdd2008-07-23 21:30:43 -070089/* Much modern x86 hardware has HPETs (10+ MHz timers) which, because
90 * many BIOS programmers don't set up "sane mode" IRQ routing, are mostly
91 * used in a broken "legacy replacement" mode. The breakage includes
92 * HPET #1 hijacking the IRQ for this RTC, and being unavailable for
93 * other (better) use.
94 *
95 * When that broken mode is in use, platform glue provides a partial
96 * emulation of hardware RTC IRQ facilities using HPET #1. We don't
97 * want to use HPET for anything except those IRQs though...
98 */
99#ifdef CONFIG_HPET_EMULATE_RTC
100#include <asm/hpet.h>
101#else
102
103static inline int is_hpet_enabled(void)
104{
105 return 0;
106}
107
108static inline int hpet_mask_rtc_irq_bit(unsigned long mask)
109{
110 return 0;
111}
112
113static inline int hpet_set_rtc_irq_bit(unsigned long mask)
114{
115 return 0;
116}
117
118static inline int
119hpet_set_alarm_time(unsigned char hrs, unsigned char min, unsigned char sec)
120{
121 return 0;
122}
123
124static inline int hpet_set_periodic_freq(unsigned long freq)
125{
126 return 0;
127}
128
129static inline int hpet_rtc_dropped_irq(void)
130{
131 return 0;
132}
133
134static inline int hpet_rtc_timer_init(void)
135{
136 return 0;
137}
138
139extern irq_handler_t hpet_rtc_interrupt;
140
141static inline int hpet_register_irq_handler(irq_handler_t handler)
142{
143 return 0;
144}
145
146static inline int hpet_unregister_irq_handler(irq_handler_t handler)
147{
148 return 0;
149}
150
151#endif
152
153/*----------------------------------------------------------------*/
154
David Brownellc8fc40c2008-10-18 20:27:47 -0700155#ifdef RTC_PORT
156
157/* Most newer x86 systems have two register banks, the first used
158 * for RTC and NVRAM and the second only for NVRAM. Caller must
159 * own rtc_lock ... and we won't worry about access during NMI.
160 */
161#define can_bank2 true
162
163static inline unsigned char cmos_read_bank2(unsigned char addr)
164{
165 outb(addr, RTC_PORT(2));
166 return inb(RTC_PORT(3));
167}
168
169static inline void cmos_write_bank2(unsigned char val, unsigned char addr)
170{
171 outb(addr, RTC_PORT(2));
Ondrej Zaryb43c1ea2012-01-10 15:10:26 -0800172 outb(val, RTC_PORT(3));
David Brownellc8fc40c2008-10-18 20:27:47 -0700173}
174
175#else
176
177#define can_bank2 false
178
179static inline unsigned char cmos_read_bank2(unsigned char addr)
180{
181 return 0;
182}
183
184static inline void cmos_write_bank2(unsigned char val, unsigned char addr)
185{
186}
187
188#endif
189
190/*----------------------------------------------------------------*/
191
David Brownell7be2c7c2007-02-10 01:46:02 -0800192static int cmos_read_time(struct device *dev, struct rtc_time *t)
193{
194 /* REVISIT: if the clock has a "century" register, use
Arnd Bergmann5ab788d2016-05-30 20:57:50 +0200195 * that instead of the heuristic in mc146818_get_time().
David Brownell7be2c7c2007-02-10 01:46:02 -0800196 * That'll make Y3K compatility (year > 2070) easy!
197 */
Arnd Bergmann5ab788d2016-05-30 20:57:50 +0200198 mc146818_get_time(t);
David Brownell7be2c7c2007-02-10 01:46:02 -0800199 return 0;
200}
201
202static int cmos_set_time(struct device *dev, struct rtc_time *t)
203{
204 /* REVISIT: set the "century" register if available
205 *
206 * NOTE: this ignores the issue whereby updating the seconds
207 * takes effect exactly 500ms after we write the register.
208 * (Also queueing and other delays before we get this far.)
209 */
Arnd Bergmann5ab788d2016-05-30 20:57:50 +0200210 return mc146818_set_time(t);
David Brownell7be2c7c2007-02-10 01:46:02 -0800211}
212
213static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)
214{
215 struct cmos_rtc *cmos = dev_get_drvdata(dev);
216 unsigned char rtc_control;
217
218 if (!is_valid_irq(cmos->irq))
219 return -EIO;
220
221 /* Basic alarms only support hour, minute, and seconds fields.
222 * Some also support day and month, for alarms up to a year in
223 * the future.
224 */
David Brownell7be2c7c2007-02-10 01:46:02 -0800225
226 spin_lock_irq(&rtc_lock);
227 t->time.tm_sec = CMOS_READ(RTC_SECONDS_ALARM);
228 t->time.tm_min = CMOS_READ(RTC_MINUTES_ALARM);
229 t->time.tm_hour = CMOS_READ(RTC_HOURS_ALARM);
230
231 if (cmos->day_alrm) {
Mark Lord615bb292007-11-03 22:04:03 -0400232 /* ignore upper bits on readback per ACPI spec */
233 t->time.tm_mday = CMOS_READ(cmos->day_alrm) & 0x3f;
David Brownell7be2c7c2007-02-10 01:46:02 -0800234 if (!t->time.tm_mday)
235 t->time.tm_mday = -1;
236
237 if (cmos->mon_alrm) {
238 t->time.tm_mon = CMOS_READ(cmos->mon_alrm);
239 if (!t->time.tm_mon)
240 t->time.tm_mon = -1;
241 }
242 }
243
244 rtc_control = CMOS_READ(RTC_CONTROL);
245 spin_unlock_irq(&rtc_lock);
246
Arnaud Patard3804a892010-04-29 11:58:44 +0200247 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
248 if (((unsigned)t->time.tm_sec) < 0x60)
249 t->time.tm_sec = bcd2bin(t->time.tm_sec);
David Brownell7be2c7c2007-02-10 01:46:02 -0800250 else
Arnaud Patard3804a892010-04-29 11:58:44 +0200251 t->time.tm_sec = -1;
252 if (((unsigned)t->time.tm_min) < 0x60)
253 t->time.tm_min = bcd2bin(t->time.tm_min);
254 else
255 t->time.tm_min = -1;
256 if (((unsigned)t->time.tm_hour) < 0x24)
257 t->time.tm_hour = bcd2bin(t->time.tm_hour);
258 else
259 t->time.tm_hour = -1;
260
261 if (cmos->day_alrm) {
262 if (((unsigned)t->time.tm_mday) <= 0x31)
263 t->time.tm_mday = bcd2bin(t->time.tm_mday);
David Brownell7be2c7c2007-02-10 01:46:02 -0800264 else
Arnaud Patard3804a892010-04-29 11:58:44 +0200265 t->time.tm_mday = -1;
266
267 if (cmos->mon_alrm) {
268 if (((unsigned)t->time.tm_mon) <= 0x12)
269 t->time.tm_mon = bcd2bin(t->time.tm_mon)-1;
270 else
271 t->time.tm_mon = -1;
272 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800273 }
274 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800275
276 t->enabled = !!(rtc_control & RTC_AIE);
277 t->pending = 0;
278
279 return 0;
280}
281
David Brownell7e2a31d2008-07-23 21:30:47 -0700282static void cmos_checkintr(struct cmos_rtc *cmos, unsigned char rtc_control)
283{
284 unsigned char rtc_intr;
285
286 /* NOTE after changing RTC_xIE bits we always read INTR_FLAGS;
287 * allegedly some older rtcs need that to handle irqs properly
288 */
289 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
290
291 if (is_hpet_enabled())
292 return;
293
294 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
295 if (is_intr(rtc_intr))
296 rtc_update_irq(cmos->rtc, 1, rtc_intr);
297}
298
299static void cmos_irq_enable(struct cmos_rtc *cmos, unsigned char mask)
300{
301 unsigned char rtc_control;
302
303 /* flush any pending IRQ status, notably for update irqs,
304 * before we enable new IRQs
305 */
306 rtc_control = CMOS_READ(RTC_CONTROL);
307 cmos_checkintr(cmos, rtc_control);
308
309 rtc_control |= mask;
310 CMOS_WRITE(rtc_control, RTC_CONTROL);
311 hpet_set_rtc_irq_bit(mask);
312
313 cmos_checkintr(cmos, rtc_control);
314}
315
316static void cmos_irq_disable(struct cmos_rtc *cmos, unsigned char mask)
317{
318 unsigned char rtc_control;
319
320 rtc_control = CMOS_READ(RTC_CONTROL);
321 rtc_control &= ~mask;
322 CMOS_WRITE(rtc_control, RTC_CONTROL);
323 hpet_mask_rtc_irq_bit(mask);
324
325 cmos_checkintr(cmos, rtc_control);
326}
327
Gabriele Mazzotta6a6af3d2016-10-04 00:50:28 +0200328static int cmos_validate_alarm(struct device *dev, struct rtc_wkalrm *t)
329{
330 struct cmos_rtc *cmos = dev_get_drvdata(dev);
331 struct rtc_time now;
332
333 cmos_read_time(dev, &now);
334
335 if (!cmos->day_alrm) {
336 time64_t t_max_date;
337 time64_t t_alrm;
338
339 t_max_date = rtc_tm_to_time64(&now);
340 t_max_date += 24 * 60 * 60 - 1;
341 t_alrm = rtc_tm_to_time64(&t->time);
342 if (t_alrm > t_max_date) {
343 dev_err(dev,
344 "Alarms can be up to one day in the future\n");
345 return -EINVAL;
346 }
347 } else if (!cmos->mon_alrm) {
348 struct rtc_time max_date = now;
349 time64_t t_max_date;
350 time64_t t_alrm;
351 int max_mday;
352
353 if (max_date.tm_mon == 11) {
354 max_date.tm_mon = 0;
355 max_date.tm_year += 1;
356 } else {
357 max_date.tm_mon += 1;
358 }
359 max_mday = rtc_month_days(max_date.tm_mon, max_date.tm_year);
360 if (max_date.tm_mday > max_mday)
361 max_date.tm_mday = max_mday;
362
363 t_max_date = rtc_tm_to_time64(&max_date);
364 t_max_date -= 1;
365 t_alrm = rtc_tm_to_time64(&t->time);
366 if (t_alrm > t_max_date) {
367 dev_err(dev,
368 "Alarms can be up to one month in the future\n");
369 return -EINVAL;
370 }
371 } else {
372 struct rtc_time max_date = now;
373 time64_t t_max_date;
374 time64_t t_alrm;
375 int max_mday;
376
377 max_date.tm_year += 1;
378 max_mday = rtc_month_days(max_date.tm_mon, max_date.tm_year);
379 if (max_date.tm_mday > max_mday)
380 max_date.tm_mday = max_mday;
381
382 t_max_date = rtc_tm_to_time64(&max_date);
383 t_max_date -= 1;
384 t_alrm = rtc_tm_to_time64(&t->time);
385 if (t_alrm > t_max_date) {
386 dev_err(dev,
387 "Alarms can be up to one year in the future\n");
388 return -EINVAL;
389 }
390 }
391
392 return 0;
393}
394
David Brownell7be2c7c2007-02-10 01:46:02 -0800395static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
396{
397 struct cmos_rtc *cmos = dev_get_drvdata(dev);
Sachin Kamat5e8599d2013-07-03 15:05:45 -0700398 unsigned char mon, mday, hrs, min, sec, rtc_control;
Gabriele Mazzotta6a6af3d2016-10-04 00:50:28 +0200399 int ret;
David Brownell7be2c7c2007-02-10 01:46:02 -0800400
401 if (!is_valid_irq(cmos->irq))
402 return -EIO;
403
Gabriele Mazzotta6a6af3d2016-10-04 00:50:28 +0200404 ret = cmos_validate_alarm(dev, t);
405 if (ret < 0)
406 return ret;
407
Zhao Yakui2b653e02008-04-15 14:34:29 -0700408 mon = t->time.tm_mon + 1;
David Brownell7be2c7c2007-02-10 01:46:02 -0800409 mday = t->time.tm_mday;
David Brownell7be2c7c2007-02-10 01:46:02 -0800410 hrs = t->time.tm_hour;
David Brownell7be2c7c2007-02-10 01:46:02 -0800411 min = t->time.tm_min;
David Brownell7be2c7c2007-02-10 01:46:02 -0800412 sec = t->time.tm_sec;
Arnaud Patard3804a892010-04-29 11:58:44 +0200413
414 rtc_control = CMOS_READ(RTC_CONTROL);
415 if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
416 /* Writing 0xff means "don't care" or "match all". */
417 mon = (mon <= 12) ? bin2bcd(mon) : 0xff;
418 mday = (mday >= 1 && mday <= 31) ? bin2bcd(mday) : 0xff;
419 hrs = (hrs < 24) ? bin2bcd(hrs) : 0xff;
420 min = (min < 60) ? bin2bcd(min) : 0xff;
421 sec = (sec < 60) ? bin2bcd(sec) : 0xff;
422 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800423
424 spin_lock_irq(&rtc_lock);
425
426 /* next rtc irq must not be from previous alarm setting */
David Brownell7e2a31d2008-07-23 21:30:47 -0700427 cmos_irq_disable(cmos, RTC_AIE);
David Brownell7be2c7c2007-02-10 01:46:02 -0800428
429 /* update alarm */
430 CMOS_WRITE(hrs, RTC_HOURS_ALARM);
431 CMOS_WRITE(min, RTC_MINUTES_ALARM);
432 CMOS_WRITE(sec, RTC_SECONDS_ALARM);
433
434 /* the system may support an "enhanced" alarm */
435 if (cmos->day_alrm) {
436 CMOS_WRITE(mday, cmos->day_alrm);
437 if (cmos->mon_alrm)
438 CMOS_WRITE(mon, cmos->mon_alrm);
439 }
440
David Brownell35d3fdd2008-07-23 21:30:43 -0700441 /* FIXME the HPET alarm glue currently ignores day_alrm
442 * and mon_alrm ...
443 */
444 hpet_set_alarm_time(t->time.tm_hour, t->time.tm_min, t->time.tm_sec);
445
David Brownell7e2a31d2008-07-23 21:30:47 -0700446 if (t->enabled)
447 cmos_irq_enable(cmos, RTC_AIE);
David Brownell7be2c7c2007-02-10 01:46:02 -0800448
449 spin_unlock_irq(&rtc_lock);
450
Adrian Huang88b8d332015-07-06 12:19:12 +0800451 cmos->alarm_expires = rtc_tm_to_time64(&t->time);
452
David Brownell7be2c7c2007-02-10 01:46:02 -0800453 return 0;
454}
455
Herton Ronaldo Krzesinskia8462ef2009-12-15 16:45:56 -0800456static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled)
David Brownell7be2c7c2007-02-10 01:46:02 -0800457{
458 struct cmos_rtc *cmos = dev_get_drvdata(dev);
David Brownell7be2c7c2007-02-10 01:46:02 -0800459 unsigned long flags;
460
Herton Ronaldo Krzesinskia8462ef2009-12-15 16:45:56 -0800461 if (!is_valid_irq(cmos->irq))
462 return -EINVAL;
David Brownell7be2c7c2007-02-10 01:46:02 -0800463
464 spin_lock_irqsave(&rtc_lock, flags);
Herton Ronaldo Krzesinskia8462ef2009-12-15 16:45:56 -0800465
466 if (enabled)
David Brownell7e2a31d2008-07-23 21:30:47 -0700467 cmos_irq_enable(cmos, RTC_AIE);
Herton Ronaldo Krzesinskia8462ef2009-12-15 16:45:56 -0800468 else
469 cmos_irq_disable(cmos, RTC_AIE);
470
David Brownell7be2c7c2007-02-10 01:46:02 -0800471 spin_unlock_irqrestore(&rtc_lock, flags);
472 return 0;
473}
474
Javier Martinez Canillas6fca3fc2016-04-26 18:17:35 -0400475#if IS_ENABLED(CONFIG_RTC_INTF_PROC)
David Brownell7be2c7c2007-02-10 01:46:02 -0800476
477static int cmos_procfs(struct device *dev, struct seq_file *seq)
478{
479 struct cmos_rtc *cmos = dev_get_drvdata(dev);
480 unsigned char rtc_control, valid;
481
482 spin_lock_irq(&rtc_lock);
483 rtc_control = CMOS_READ(RTC_CONTROL);
484 valid = CMOS_READ(RTC_VALID);
485 spin_unlock_irq(&rtc_lock);
486
487 /* NOTE: at least ICH6 reports battery status using a different
488 * (non-RTC) bit; and SQWE is ignored on many current systems.
489 */
Joe Perches4395eb12015-04-15 16:17:51 -0700490 seq_printf(seq,
491 "periodic_IRQ\t: %s\n"
492 "update_IRQ\t: %s\n"
493 "HPET_emulated\t: %s\n"
494 // "square_wave\t: %s\n"
495 "BCD\t\t: %s\n"
496 "DST_enable\t: %s\n"
497 "periodic_freq\t: %d\n"
498 "batt_status\t: %s\n",
499 (rtc_control & RTC_PIE) ? "yes" : "no",
500 (rtc_control & RTC_UIE) ? "yes" : "no",
501 is_hpet_enabled() ? "yes" : "no",
502 // (rtc_control & RTC_SQWE) ? "yes" : "no",
503 (rtc_control & RTC_DM_BINARY) ? "no" : "yes",
504 (rtc_control & RTC_DST_EN) ? "yes" : "no",
505 cmos->rtc->irq_freq,
506 (valid & RTC_VRT) ? "okay" : "dead");
507
508 return 0;
David Brownell7be2c7c2007-02-10 01:46:02 -0800509}
510
511#else
512#define cmos_procfs NULL
513#endif
514
515static const struct rtc_class_ops cmos_rtc_ops = {
Herton Ronaldo Krzesinskia8462ef2009-12-15 16:45:56 -0800516 .read_time = cmos_read_time,
517 .set_time = cmos_set_time,
518 .read_alarm = cmos_read_alarm,
519 .set_alarm = cmos_set_alarm,
520 .proc = cmos_procfs,
Herton Ronaldo Krzesinskia8462ef2009-12-15 16:45:56 -0800521 .alarm_irq_enable = cmos_alarm_irq_enable,
David Brownell7be2c7c2007-02-10 01:46:02 -0800522};
523
524/*----------------------------------------------------------------*/
525
David Brownelle07e2322008-02-06 01:38:43 -0800526/*
527 * All these chips have at least 64 bytes of address space, shared by
528 * RTC registers and NVRAM. Most of those bytes of NVRAM are used
529 * by boot firmware. Modern chips have 128 or 256 bytes.
530 */
531
532#define NVRAM_OFFSET (RTC_REG_D + 1)
533
534static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -0700535cmos_nvram_read(struct file *filp, struct kobject *kobj,
536 struct bin_attribute *attr,
David Brownelle07e2322008-02-06 01:38:43 -0800537 char *buf, loff_t off, size_t count)
538{
539 int retval;
540
David Brownellc8fc40c2008-10-18 20:27:47 -0700541 off += NVRAM_OFFSET;
David Brownelle07e2322008-02-06 01:38:43 -0800542 spin_lock_irq(&rtc_lock);
David Brownellc8fc40c2008-10-18 20:27:47 -0700543 for (retval = 0; count; count--, off++, retval++) {
544 if (off < 128)
545 *buf++ = CMOS_READ(off);
546 else if (can_bank2)
547 *buf++ = cmos_read_bank2(off);
548 else
549 break;
550 }
David Brownelle07e2322008-02-06 01:38:43 -0800551 spin_unlock_irq(&rtc_lock);
552
553 return retval;
554}
555
556static ssize_t
Chris Wright2c3c8be2010-05-12 18:28:57 -0700557cmos_nvram_write(struct file *filp, struct kobject *kobj,
558 struct bin_attribute *attr,
David Brownelle07e2322008-02-06 01:38:43 -0800559 char *buf, loff_t off, size_t count)
560{
561 struct cmos_rtc *cmos;
562 int retval;
563
564 cmos = dev_get_drvdata(container_of(kobj, struct device, kobj));
David Brownelle07e2322008-02-06 01:38:43 -0800565
566 /* NOTE: on at least PCs and Ataris, the boot firmware uses a
567 * checksum on part of the NVRAM data. That's currently ignored
568 * here. If userspace is smart enough to know what fields of
569 * NVRAM to update, updating checksums is also part of its job.
570 */
David Brownellc8fc40c2008-10-18 20:27:47 -0700571 off += NVRAM_OFFSET;
David Brownelle07e2322008-02-06 01:38:43 -0800572 spin_lock_irq(&rtc_lock);
David Brownellc8fc40c2008-10-18 20:27:47 -0700573 for (retval = 0; count; count--, off++, retval++) {
David Brownelle07e2322008-02-06 01:38:43 -0800574 /* don't trash RTC registers */
575 if (off == cmos->day_alrm
576 || off == cmos->mon_alrm
577 || off == cmos->century)
578 buf++;
David Brownellc8fc40c2008-10-18 20:27:47 -0700579 else if (off < 128)
David Brownelle07e2322008-02-06 01:38:43 -0800580 CMOS_WRITE(*buf++, off);
David Brownellc8fc40c2008-10-18 20:27:47 -0700581 else if (can_bank2)
582 cmos_write_bank2(*buf++, off);
583 else
584 break;
David Brownelle07e2322008-02-06 01:38:43 -0800585 }
586 spin_unlock_irq(&rtc_lock);
587
588 return retval;
589}
590
591static struct bin_attribute nvram = {
592 .attr = {
593 .name = "nvram",
594 .mode = S_IRUGO | S_IWUSR,
David Brownelle07e2322008-02-06 01:38:43 -0800595 },
596
597 .read = cmos_nvram_read,
598 .write = cmos_nvram_write,
599 /* size gets set up later */
600};
601
602/*----------------------------------------------------------------*/
603
David Brownell7be2c7c2007-02-10 01:46:02 -0800604static struct cmos_rtc cmos_rtc;
605
606static irqreturn_t cmos_interrupt(int irq, void *p)
607{
608 u8 irqstat;
David Brownell8a0bdfd72008-02-06 01:38:45 -0800609 u8 rtc_control;
David Brownell7be2c7c2007-02-10 01:46:02 -0800610
611 spin_lock(&rtc_lock);
David Brownell35d3fdd2008-07-23 21:30:43 -0700612
613 /* When the HPET interrupt handler calls us, the interrupt
614 * status is passed as arg1 instead of the irq number. But
615 * always clear irq status, even when HPET is in the way.
616 *
617 * Note that HPET and RTC are almost certainly out of phase,
618 * giving different IRQ status ...
Bernhard Walle9d8af782008-02-06 01:38:52 -0800619 */
David Brownell35d3fdd2008-07-23 21:30:43 -0700620 irqstat = CMOS_READ(RTC_INTR_FLAGS);
621 rtc_control = CMOS_READ(RTC_CONTROL);
Bernhard Walle9d8af782008-02-06 01:38:52 -0800622 if (is_hpet_enabled())
623 irqstat = (unsigned long)irq & 0xF0;
Derek Basehore998a0602013-07-03 15:07:54 -0700624
625 /* If we were suspended, RTC_CONTROL may not be accurate since the
626 * bios may have cleared it.
627 */
628 if (!cmos_rtc.suspend_ctrl)
629 irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
630 else
631 irqstat &= (cmos_rtc.suspend_ctrl & RTC_IRQMASK) | RTC_IRQF;
David Brownell8a0bdfd72008-02-06 01:38:45 -0800632
633 /* All Linux RTC alarms should be treated as if they were oneshot.
634 * Similar code may be needed in system wakeup paths, in case the
635 * alarm woke the system.
636 */
637 if (irqstat & RTC_AIE) {
Derek Basehore998a0602013-07-03 15:07:54 -0700638 cmos_rtc.suspend_ctrl &= ~RTC_AIE;
David Brownell8a0bdfd72008-02-06 01:38:45 -0800639 rtc_control &= ~RTC_AIE;
640 CMOS_WRITE(rtc_control, RTC_CONTROL);
David Brownell35d3fdd2008-07-23 21:30:43 -0700641 hpet_mask_rtc_irq_bit(RTC_AIE);
David Brownell8a0bdfd72008-02-06 01:38:45 -0800642 CMOS_READ(RTC_INTR_FLAGS);
643 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800644 spin_unlock(&rtc_lock);
645
David Brownellbcd9b892007-04-01 23:49:47 -0700646 if (is_intr(irqstat)) {
David Brownell7be2c7c2007-02-10 01:46:02 -0800647 rtc_update_irq(p, 1, irqstat);
648 return IRQ_HANDLED;
649 } else
650 return IRQ_NONE;
651}
652
Marko Vrh41ac8df2007-05-08 00:34:09 -0700653#ifdef CONFIG_PNP
David Brownell7be2c7c2007-02-10 01:46:02 -0800654#define INITSECTION
655
656#else
David Brownell7be2c7c2007-02-10 01:46:02 -0800657#define INITSECTION __init
658#endif
659
660static int INITSECTION
661cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
662{
Jingoo Han97a92e72013-11-12 15:10:38 -0800663 struct cmos_rtc_board_info *info = dev_get_platdata(dev);
David Brownell7be2c7c2007-02-10 01:46:02 -0800664 int retval = 0;
665 unsigned char rtc_control;
David Brownelle07e2322008-02-06 01:38:43 -0800666 unsigned address_space;
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700667 u32 flags = 0;
David Brownell7be2c7c2007-02-10 01:46:02 -0800668
669 /* there can be only one ... */
670 if (cmos_rtc.dev)
671 return -EBUSY;
672
673 if (!ports)
674 return -ENODEV;
675
David Brownell05440df2007-10-16 01:28:21 -0700676 /* Claim I/O ports ASAP, minimizing conflict with legacy driver.
677 *
678 * REVISIT non-x86 systems may instead use memory space resources
679 * (needing ioremap etc), not i/o space resources like this ...
680 */
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700681 if (RTC_IOMAPPED)
682 ports = request_region(ports->start, resource_size(ports),
683 driver_name);
684 else
685 ports = request_mem_region(ports->start, resource_size(ports),
686 driver_name);
David Brownell05440df2007-10-16 01:28:21 -0700687 if (!ports) {
688 dev_dbg(dev, "i/o registers already in use\n");
689 return -EBUSY;
690 }
691
David Brownell7be2c7c2007-02-10 01:46:02 -0800692 cmos_rtc.irq = rtc_irq;
693 cmos_rtc.iomem = ports;
694
David Brownelle07e2322008-02-06 01:38:43 -0800695 /* Heuristic to deduce NVRAM size ... do what the legacy NVRAM
696 * driver did, but don't reject unknown configs. Old hardware
David Brownellc8fc40c2008-10-18 20:27:47 -0700697 * won't address 128 bytes. Newer chips have multiple banks,
698 * though they may not be listed in one I/O resource.
David Brownelle07e2322008-02-06 01:38:43 -0800699 */
700#if defined(CONFIG_ATARI)
701 address_space = 64;
Wu Zhangjin95abd0d2009-11-05 09:21:54 +0800702#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \
Srikanth Krishnakar8cb7c712010-10-14 04:03:35 +0000703 || defined(__sparc__) || defined(__mips__) \
Arnd Bergmann5ee98ab2016-06-01 16:46:22 +0200704 || defined(__powerpc__) || defined(CONFIG_MN10300)
David Brownelle07e2322008-02-06 01:38:43 -0800705 address_space = 128;
706#else
707#warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes.
708 address_space = 128;
709#endif
David Brownellc8fc40c2008-10-18 20:27:47 -0700710 if (can_bank2 && ports->end > (ports->start + 1))
711 address_space = 256;
David Brownelle07e2322008-02-06 01:38:43 -0800712
David Brownell87ac84f2007-05-08 00:34:00 -0700713 /* For ACPI systems extension info comes from the FADT. On others,
714 * board specific setup provides it as appropriate. Systems where
715 * the alarm IRQ isn't automatically a wakeup IRQ (like ACPI, and
716 * some almost-clones) can provide hooks to make that behave.
David Brownelle07e2322008-02-06 01:38:43 -0800717 *
718 * Note that ACPI doesn't preclude putting these registers into
719 * "extended" areas of the chip, including some that we won't yet
720 * expect CMOS_READ and friends to handle.
David Brownell7be2c7c2007-02-10 01:46:02 -0800721 */
722 if (info) {
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700723 if (info->flags)
724 flags = info->flags;
725 if (info->address_space)
726 address_space = info->address_space;
727
David Brownelle07e2322008-02-06 01:38:43 -0800728 if (info->rtc_day_alarm && info->rtc_day_alarm < 128)
729 cmos_rtc.day_alrm = info->rtc_day_alarm;
730 if (info->rtc_mon_alarm && info->rtc_mon_alarm < 128)
731 cmos_rtc.mon_alrm = info->rtc_mon_alarm;
732 if (info->rtc_century && info->rtc_century < 128)
733 cmos_rtc.century = info->rtc_century;
David Brownell87ac84f2007-05-08 00:34:00 -0700734
735 if (info->wake_on && info->wake_off) {
736 cmos_rtc.wake_on = info->wake_on;
737 cmos_rtc.wake_off = info->wake_off;
738 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800739 }
740
Dan Carpenter6ba8bcd2010-05-24 14:33:49 -0700741 cmos_rtc.dev = dev;
742 dev_set_drvdata(dev, &cmos_rtc);
743
David Brownell7be2c7c2007-02-10 01:46:02 -0800744 cmos_rtc.rtc = rtc_device_register(driver_name, dev,
745 &cmos_rtc_ops, THIS_MODULE);
David Brownell05440df2007-10-16 01:28:21 -0700746 if (IS_ERR(cmos_rtc.rtc)) {
747 retval = PTR_ERR(cmos_rtc.rtc);
748 goto cleanup0;
749 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800750
Kay Sieversd4afc762009-01-06 14:42:11 -0800751 rename_region(ports, dev_name(&cmos_rtc.rtc->dev));
David Brownell7be2c7c2007-02-10 01:46:02 -0800752
753 spin_lock_irq(&rtc_lock);
754
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700755 if (!(flags & CMOS_RTC_FLAGS_NOFREQ)) {
756 /* force periodic irq to CMOS reset default of 1024Hz;
757 *
758 * REVISIT it's been reported that at least one x86_64 ALI
759 * mobo doesn't use 32KHz here ... for portability we might
760 * need to do something about other clock frequencies.
761 */
762 cmos_rtc.rtc->irq_freq = 1024;
763 hpet_set_periodic_freq(cmos_rtc.rtc->irq_freq);
764 CMOS_WRITE(RTC_REF_CLCK_32KHZ | 0x06, RTC_FREQ_SELECT);
765 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800766
David Brownell7e2a31d2008-07-23 21:30:47 -0700767 /* disable irqs */
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700768 if (is_valid_irq(rtc_irq))
769 cmos_irq_disable(&cmos_rtc, RTC_PIE | RTC_AIE | RTC_UIE);
David Brownell35d3fdd2008-07-23 21:30:43 -0700770
David Brownell7e2a31d2008-07-23 21:30:47 -0700771 rtc_control = CMOS_READ(RTC_CONTROL);
David Brownell7be2c7c2007-02-10 01:46:02 -0800772
773 spin_unlock_irq(&rtc_lock);
774
Arnaud Patard3804a892010-04-29 11:58:44 +0200775 /* FIXME:
David Brownell7be2c7c2007-02-10 01:46:02 -0800776 * <asm-generic/rtc.h> doesn't know 12-hour mode either.
777 */
Sachin Kamat5e8599d2013-07-03 15:05:45 -0700778 if (is_valid_irq(rtc_irq) && !(rtc_control & RTC_24H)) {
Arnaud Patard3804a892010-04-29 11:58:44 +0200779 dev_warn(dev, "only 24-hr supported\n");
David Brownell7be2c7c2007-02-10 01:46:02 -0800780 retval = -ENXIO;
781 goto cleanup1;
782 }
783
Pratyush Anand970fc7f2016-09-15 09:38:16 +0530784 hpet_rtc_timer_init();
785
Bernhard Walle9d8af782008-02-06 01:38:52 -0800786 if (is_valid_irq(rtc_irq)) {
787 irq_handler_t rtc_cmos_int_handler;
788
789 if (is_hpet_enabled()) {
Bernhard Walle9d8af782008-02-06 01:38:52 -0800790 rtc_cmos_int_handler = hpet_rtc_interrupt;
Andrew Morton24b34472014-01-23 15:55:15 -0800791 retval = hpet_register_irq_handler(cmos_interrupt);
792 if (retval) {
Pratyush Anand970fc7f2016-09-15 09:38:16 +0530793 hpet_mask_rtc_irq_bit(RTC_IRQMASK);
Jingoo Hanee443352013-02-21 16:45:34 -0800794 dev_warn(dev, "hpet_register_irq_handler "
Bernhard Walle9d8af782008-02-06 01:38:52 -0800795 " failed in rtc_init().");
796 goto cleanup1;
797 }
798 } else
799 rtc_cmos_int_handler = cmos_interrupt;
800
801 retval = request_irq(rtc_irq, rtc_cmos_int_handler,
Andy Shevchenko079062b2015-12-23 19:37:19 +0200802 IRQF_SHARED, dev_name(&cmos_rtc.rtc->dev),
David Brownellab6a2d72007-05-08 00:33:30 -0700803 cmos_rtc.rtc);
Bernhard Walle9d8af782008-02-06 01:38:52 -0800804 if (retval < 0) {
805 dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq);
806 goto cleanup1;
807 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800808 }
809
David Brownelle07e2322008-02-06 01:38:43 -0800810 /* export at least the first block of NVRAM */
811 nvram.size = address_space - NVRAM_OFFSET;
812 retval = sysfs_create_bin_file(&dev->kobj, &nvram);
813 if (retval < 0) {
814 dev_dbg(dev, "can't create nvram file? %d\n", retval);
815 goto cleanup2;
816 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800817
Jingoo Hanee443352013-02-21 16:45:34 -0800818 dev_info(dev, "%s%s, %zd bytes nvram%s\n",
Krzysztof Halasa6d029b62009-04-21 12:24:49 -0700819 !is_valid_irq(rtc_irq) ? "no alarms" :
820 cmos_rtc.mon_alrm ? "alarms up to one year" :
821 cmos_rtc.day_alrm ? "alarms up to one month" :
822 "alarms up to one day",
823 cmos_rtc.century ? ", y3k" : "",
824 nvram.size,
825 is_hpet_enabled() ? ", hpet irqs" : "");
David Brownell7be2c7c2007-02-10 01:46:02 -0800826
827 return 0;
828
David Brownelle07e2322008-02-06 01:38:43 -0800829cleanup2:
830 if (is_valid_irq(rtc_irq))
831 free_irq(rtc_irq, cmos_rtc.rtc);
David Brownell7be2c7c2007-02-10 01:46:02 -0800832cleanup1:
David Brownell05440df2007-10-16 01:28:21 -0700833 cmos_rtc.dev = NULL;
David Brownell7be2c7c2007-02-10 01:46:02 -0800834 rtc_device_unregister(cmos_rtc.rtc);
David Brownell05440df2007-10-16 01:28:21 -0700835cleanup0:
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700836 if (RTC_IOMAPPED)
837 release_region(ports->start, resource_size(ports));
838 else
839 release_mem_region(ports->start, resource_size(ports));
David Brownell7be2c7c2007-02-10 01:46:02 -0800840 return retval;
841}
842
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700843static void cmos_do_shutdown(int rtc_irq)
David Brownell7be2c7c2007-02-10 01:46:02 -0800844{
David Brownell7be2c7c2007-02-10 01:46:02 -0800845 spin_lock_irq(&rtc_lock);
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700846 if (is_valid_irq(rtc_irq))
847 cmos_irq_disable(&cmos_rtc, RTC_IRQMASK);
David Brownell7be2c7c2007-02-10 01:46:02 -0800848 spin_unlock_irq(&rtc_lock);
849}
850
851static void __exit cmos_do_remove(struct device *dev)
852{
853 struct cmos_rtc *cmos = dev_get_drvdata(dev);
David Brownell05440df2007-10-16 01:28:21 -0700854 struct resource *ports;
David Brownell7be2c7c2007-02-10 01:46:02 -0800855
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700856 cmos_do_shutdown(cmos->irq);
David Brownell7be2c7c2007-02-10 01:46:02 -0800857
David Brownelle07e2322008-02-06 01:38:43 -0800858 sysfs_remove_bin_file(&dev->kobj, &nvram);
859
Bernhard Walle9d8af782008-02-06 01:38:52 -0800860 if (is_valid_irq(cmos->irq)) {
David Brownell05440df2007-10-16 01:28:21 -0700861 free_irq(cmos->irq, cmos->rtc);
Bernhard Walle9d8af782008-02-06 01:38:52 -0800862 hpet_unregister_irq_handler(cmos_interrupt);
863 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800864
David Brownell05440df2007-10-16 01:28:21 -0700865 rtc_device_unregister(cmos->rtc);
866 cmos->rtc = NULL;
David Brownell7be2c7c2007-02-10 01:46:02 -0800867
David Brownell05440df2007-10-16 01:28:21 -0700868 ports = cmos->iomem;
Maciej W. Rozycki31632db2014-06-06 14:35:49 -0700869 if (RTC_IOMAPPED)
870 release_region(ports->start, resource_size(ports));
871 else
872 release_mem_region(ports->start, resource_size(ports));
David Brownell05440df2007-10-16 01:28:21 -0700873 cmos->iomem = NULL;
874
875 cmos->dev = NULL;
David Brownell7be2c7c2007-02-10 01:46:02 -0800876}
877
Adrian Huang88b8d332015-07-06 12:19:12 +0800878static int cmos_aie_poweroff(struct device *dev)
879{
880 struct cmos_rtc *cmos = dev_get_drvdata(dev);
881 struct rtc_time now;
882 time64_t t_now;
883 int retval = 0;
884 unsigned char rtc_control;
885
886 if (!cmos->alarm_expires)
887 return -EINVAL;
888
889 spin_lock_irq(&rtc_lock);
890 rtc_control = CMOS_READ(RTC_CONTROL);
891 spin_unlock_irq(&rtc_lock);
892
893 /* We only care about the situation where AIE is disabled. */
894 if (rtc_control & RTC_AIE)
895 return -EBUSY;
896
897 cmos_read_time(dev, &now);
898 t_now = rtc_tm_to_time64(&now);
899
900 /*
901 * When enabling "RTC wake-up" in BIOS setup, the machine reboots
902 * automatically right after shutdown on some buggy boxes.
903 * This automatic rebooting issue won't happen when the alarm
904 * time is larger than now+1 seconds.
905 *
906 * If the alarm time is equal to now+1 seconds, the issue can be
907 * prevented by cancelling the alarm.
908 */
909 if (cmos->alarm_expires == t_now + 1) {
910 struct rtc_wkalrm alarm;
911
912 /* Cancel the AIE timer by configuring the past time. */
913 rtc_time64_to_tm(t_now - 1, &alarm.time);
914 alarm.enabled = 0;
915 retval = cmos_set_alarm(dev, &alarm);
916 } else if (cmos->alarm_expires > t_now + 1) {
917 retval = -EBUSY;
918 }
919
920 return retval;
921}
922
Paul Fox2fb08e62011-01-12 17:00:07 -0800923static int cmos_suspend(struct device *dev)
David Brownell7be2c7c2007-02-10 01:46:02 -0800924{
925 struct cmos_rtc *cmos = dev_get_drvdata(dev);
David Brownellbcd9b892007-04-01 23:49:47 -0700926 unsigned char tmp;
David Brownell7be2c7c2007-02-10 01:46:02 -0800927
928 /* only the alarm might be a wakeup event source */
929 spin_lock_irq(&rtc_lock);
930 cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL);
931 if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
David Brownell35d3fdd2008-07-23 21:30:43 -0700932 unsigned char mask;
David Brownellbcd9b892007-04-01 23:49:47 -0700933
Rafael J. Wysocki74c46332008-09-02 14:36:11 -0700934 if (device_may_wakeup(dev))
David Brownell35d3fdd2008-07-23 21:30:43 -0700935 mask = RTC_IRQMASK & ~RTC_AIE;
David Brownell7be2c7c2007-02-10 01:46:02 -0800936 else
David Brownell35d3fdd2008-07-23 21:30:43 -0700937 mask = RTC_IRQMASK;
938 tmp &= ~mask;
David Brownell7be2c7c2007-02-10 01:46:02 -0800939 CMOS_WRITE(tmp, RTC_CONTROL);
Derek Basehoree0057152013-04-29 16:20:23 -0700940 hpet_mask_rtc_irq_bit(mask);
David Brownell35d3fdd2008-07-23 21:30:43 -0700941
David Brownell7e2a31d2008-07-23 21:30:47 -0700942 cmos_checkintr(cmos, tmp);
David Brownellbcd9b892007-04-01 23:49:47 -0700943 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800944 spin_unlock_irq(&rtc_lock);
945
David Brownell87ac84f2007-05-08 00:34:00 -0700946 if (tmp & RTC_AIE) {
947 cmos->enabled_wake = 1;
948 if (cmos->wake_on)
949 cmos->wake_on(dev);
950 else
951 enable_irq_wake(cmos->irq);
952 }
David Brownell7be2c7c2007-02-10 01:46:02 -0800953
Gabriele Mazzotta68669d52016-09-20 01:12:44 +0200954 cmos_read_alarm(dev, &cmos->saved_wkalrm);
955
Jingoo Hanee443352013-02-21 16:45:34 -0800956 dev_dbg(dev, "suspend%s, ctrl %02x\n",
David Brownell7be2c7c2007-02-10 01:46:02 -0800957 (tmp & RTC_AIE) ? ", alarm may wake" : "",
958 tmp);
959
960 return 0;
961}
962
Rafael J. Wysocki74c46332008-09-02 14:36:11 -0700963/* We want RTC alarms to wake us from e.g. ACPI G2/S5 "soft off", even
964 * after a detour through G3 "mechanical off", although the ACPI spec
965 * says wakeup should only work from G1/S4 "hibernate". To most users,
966 * distinctions between S4 and S5 are pointless. So when the hardware
967 * allows, don't draw that distinction.
968 */
969static inline int cmos_poweroff(struct device *dev)
970{
Arnd Bergmann00f7f902016-09-22 11:48:00 +0200971 if (!IS_ENABLED(CONFIG_PM))
972 return -ENOSYS;
973
Paul Fox2fb08e62011-01-12 17:00:07 -0800974 return cmos_suspend(dev);
Rafael J. Wysocki74c46332008-09-02 14:36:11 -0700975}
976
Gabriele Mazzotta68669d52016-09-20 01:12:44 +0200977static void cmos_check_wkalrm(struct device *dev)
978{
979 struct cmos_rtc *cmos = dev_get_drvdata(dev);
980 struct rtc_wkalrm current_alarm;
981 time64_t t_current_expires;
982 time64_t t_saved_expires;
983
984 cmos_read_alarm(dev, &current_alarm);
985 t_current_expires = rtc_tm_to_time64(&current_alarm.time);
986 t_saved_expires = rtc_tm_to_time64(&cmos->saved_wkalrm.time);
987 if (t_current_expires != t_saved_expires ||
988 cmos->saved_wkalrm.enabled != current_alarm.enabled) {
989 cmos_set_alarm(dev, &cmos->saved_wkalrm);
990 }
991}
992
Gabriele Mazzotta983bf122016-09-20 01:12:43 +0200993static void cmos_check_acpi_rtc_status(struct device *dev,
994 unsigned char *rtc_control);
995
Arnd Bergmann00f7f902016-09-22 11:48:00 +0200996static int __maybe_unused cmos_resume(struct device *dev)
David Brownell7be2c7c2007-02-10 01:46:02 -0800997{
998 struct cmos_rtc *cmos = dev_get_drvdata(dev);
Derek Basehore998a0602013-07-03 15:07:54 -0700999 unsigned char tmp;
David Brownell7be2c7c2007-02-10 01:46:02 -08001000
Derek Basehore998a0602013-07-03 15:07:54 -07001001 if (cmos->enabled_wake) {
1002 if (cmos->wake_off)
1003 cmos->wake_off(dev);
1004 else
1005 disable_irq_wake(cmos->irq);
1006 cmos->enabled_wake = 0;
1007 }
1008
Gabriele Mazzotta68669d52016-09-20 01:12:44 +02001009 /* The BIOS might have changed the alarm, restore it */
1010 cmos_check_wkalrm(dev);
1011
Derek Basehore998a0602013-07-03 15:07:54 -07001012 spin_lock_irq(&rtc_lock);
1013 tmp = cmos->suspend_ctrl;
1014 cmos->suspend_ctrl = 0;
David Brownell7be2c7c2007-02-10 01:46:02 -08001015 /* re-enable any irqs previously active */
David Brownell35d3fdd2008-07-23 21:30:43 -07001016 if (tmp & RTC_IRQMASK) {
1017 unsigned char mask;
David Brownell7be2c7c2007-02-10 01:46:02 -08001018
Derek Basehoreebf8d6c2013-06-12 14:04:45 -07001019 if (device_may_wakeup(dev))
1020 hpet_rtc_timer_init();
1021
David Brownell35d3fdd2008-07-23 21:30:43 -07001022 do {
1023 CMOS_WRITE(tmp, RTC_CONTROL);
1024 hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK);
1025
1026 mask = CMOS_READ(RTC_INTR_FLAGS);
1027 mask &= (tmp & RTC_IRQMASK) | RTC_IRQF;
David Brownell7e2a31d2008-07-23 21:30:47 -07001028 if (!is_hpet_enabled() || !is_intr(mask))
David Brownell35d3fdd2008-07-23 21:30:43 -07001029 break;
1030
1031 /* force one-shot behavior if HPET blocked
1032 * the wake alarm's irq
1033 */
1034 rtc_update_irq(cmos->rtc, 1, mask);
1035 tmp &= ~RTC_AIE;
1036 hpet_mask_rtc_irq_bit(RTC_AIE);
1037 } while (mask & RTC_AIE);
Gabriele Mazzotta983bf122016-09-20 01:12:43 +02001038
1039 if (tmp & RTC_AIE)
1040 cmos_check_acpi_rtc_status(dev, &tmp);
David Brownell7be2c7c2007-02-10 01:46:02 -08001041 }
Derek Basehore998a0602013-07-03 15:07:54 -07001042 spin_unlock_irq(&rtc_lock);
David Brownell7be2c7c2007-02-10 01:46:02 -08001043
Jingoo Hanee443352013-02-21 16:45:34 -08001044 dev_dbg(dev, "resume, ctrl %02x\n", tmp);
David Brownell7be2c7c2007-02-10 01:46:02 -08001045
1046 return 0;
1047}
1048
Mika Westerbergb5ada462014-04-03 14:50:05 -07001049static SIMPLE_DEV_PM_OPS(cmos_pm_ops, cmos_suspend, cmos_resume);
1050
David Brownell7be2c7c2007-02-10 01:46:02 -08001051/*----------------------------------------------------------------*/
1052
David Brownelle07e2322008-02-06 01:38:43 -08001053/* On non-x86 systems, a "CMOS" RTC lives most naturally on platform_bus.
1054 * ACPI systems always list these as PNPACPI devices, and pre-ACPI PCs
1055 * probably list them in similar PNPBIOS tables; so PNP is more common.
1056 *
1057 * We don't use legacy "poke at the hardware" probing. Ancient PCs that
1058 * predate even PNPBIOS should set up platform_bus devices.
David Brownell7be2c7c2007-02-10 01:46:02 -08001059 */
1060
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001061#ifdef CONFIG_ACPI
1062
1063#include <linux/acpi.h>
1064
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001065static u32 rtc_handler(void *context)
1066{
Daniel Drakeb2201e52012-05-18 22:59:41 +02001067 struct device *dev = context;
Gabriele Mazzotta983bf122016-09-20 01:12:43 +02001068 struct cmos_rtc *cmos = dev_get_drvdata(dev);
1069 unsigned char rtc_control = 0;
1070 unsigned char rtc_intr;
1071
1072 spin_lock_irq(&rtc_lock);
1073 if (cmos_rtc.suspend_ctrl)
1074 rtc_control = CMOS_READ(RTC_CONTROL);
1075 if (rtc_control & RTC_AIE) {
1076 cmos_rtc.suspend_ctrl &= ~RTC_AIE;
1077 CMOS_WRITE(rtc_control, RTC_CONTROL);
1078 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
1079 rtc_update_irq(cmos->rtc, 1, rtc_intr);
1080 }
1081 spin_unlock_irq(&rtc_lock);
Daniel Drakeb2201e52012-05-18 22:59:41 +02001082
1083 pm_wakeup_event(dev, 0);
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001084 acpi_clear_event(ACPI_EVENT_RTC);
1085 acpi_disable_event(ACPI_EVENT_RTC, 0);
1086 return ACPI_INTERRUPT_HANDLED;
1087}
1088
Daniel Drakeb2201e52012-05-18 22:59:41 +02001089static inline void rtc_wake_setup(struct device *dev)
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001090{
Daniel Drakeb2201e52012-05-18 22:59:41 +02001091 acpi_install_fixed_event_handler(ACPI_EVENT_RTC, rtc_handler, dev);
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001092 /*
1093 * After the RTC handler is installed, the Fixed_RTC event should
1094 * be disabled. Only when the RTC alarm is set will it be enabled.
1095 */
1096 acpi_clear_event(ACPI_EVENT_RTC);
1097 acpi_disable_event(ACPI_EVENT_RTC, 0);
1098}
1099
1100static void rtc_wake_on(struct device *dev)
1101{
1102 acpi_clear_event(ACPI_EVENT_RTC);
1103 acpi_enable_event(ACPI_EVENT_RTC, 0);
1104}
1105
1106static void rtc_wake_off(struct device *dev)
1107{
1108 acpi_disable_event(ACPI_EVENT_RTC, 0);
1109}
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001110
1111/* Every ACPI platform has a mc146818 compatible "cmos rtc". Here we find
1112 * its device node and pass extra config data. This helps its driver use
1113 * capabilities that the now-obsolete mc146818 didn't have, and informs it
1114 * that this board's RTC is wakeup-capable (per ACPI spec).
1115 */
1116static struct cmos_rtc_board_info acpi_rtc_info;
1117
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001118static void cmos_wake_setup(struct device *dev)
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001119{
1120 if (acpi_disabled)
1121 return;
1122
Daniel Drakeb2201e52012-05-18 22:59:41 +02001123 rtc_wake_setup(dev);
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001124 acpi_rtc_info.wake_on = rtc_wake_on;
1125 acpi_rtc_info.wake_off = rtc_wake_off;
1126
1127 /* workaround bug in some ACPI tables */
1128 if (acpi_gbl_FADT.month_alarm && !acpi_gbl_FADT.day_alarm) {
1129 dev_dbg(dev, "bogus FADT month_alarm (%d)\n",
1130 acpi_gbl_FADT.month_alarm);
1131 acpi_gbl_FADT.month_alarm = 0;
1132 }
1133
1134 acpi_rtc_info.rtc_day_alarm = acpi_gbl_FADT.day_alarm;
1135 acpi_rtc_info.rtc_mon_alarm = acpi_gbl_FADT.month_alarm;
1136 acpi_rtc_info.rtc_century = acpi_gbl_FADT.century;
1137
1138 /* NOTE: S4_RTC_WAKE is NOT currently useful to Linux */
1139 if (acpi_gbl_FADT.flags & ACPI_FADT_S4_RTC_WAKE)
1140 dev_info(dev, "RTC can wake from S4\n");
1141
1142 dev->platform_data = &acpi_rtc_info;
1143
1144 /* RTC always wakes from S1/S2/S3, and often S4/STD */
1145 device_init_wakeup(dev, 1);
1146}
1147
Gabriele Mazzotta983bf122016-09-20 01:12:43 +02001148static void cmos_check_acpi_rtc_status(struct device *dev,
1149 unsigned char *rtc_control)
1150{
1151 struct cmos_rtc *cmos = dev_get_drvdata(dev);
1152 acpi_event_status rtc_status;
1153 acpi_status status;
1154
1155 if (acpi_gbl_FADT.flags & ACPI_FADT_FIXED_RTC)
1156 return;
1157
1158 status = acpi_get_event_status(ACPI_EVENT_RTC, &rtc_status);
1159 if (ACPI_FAILURE(status)) {
1160 dev_err(dev, "Could not get RTC status\n");
1161 } else if (rtc_status & ACPI_EVENT_FLAG_SET) {
1162 unsigned char mask;
1163 *rtc_control &= ~RTC_AIE;
1164 CMOS_WRITE(*rtc_control, RTC_CONTROL);
1165 mask = CMOS_READ(RTC_INTR_FLAGS);
1166 rtc_update_irq(cmos->rtc, 1, mask);
1167 }
1168}
1169
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001170#else
1171
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001172static void cmos_wake_setup(struct device *dev)
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001173{
1174}
1175
Gabriele Mazzotta983bf122016-09-20 01:12:43 +02001176static void cmos_check_acpi_rtc_status(struct device *dev,
1177 unsigned char *rtc_control)
1178{
1179}
1180
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001181#endif
1182
Marko Vrh41ac8df2007-05-08 00:34:09 -07001183#ifdef CONFIG_PNP
David Brownell7be2c7c2007-02-10 01:46:02 -08001184
1185#include <linux/pnp.h>
1186
Greg Kroah-Hartman5a167f42012-12-21 13:09:38 -08001187static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
David Brownell7be2c7c2007-02-10 01:46:02 -08001188{
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001189 cmos_wake_setup(&pnp->dev);
1190
Sachin Kamat5e8599d2013-07-03 15:05:45 -07001191 if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0))
Matthew Garrett6cd8fa82007-06-01 00:46:51 -07001192 /* Some machines contain a PNP entry for the RTC, but
1193 * don't define the IRQ. It should always be safe to
1194 * hardcode it in these cases
1195 */
Bjorn Helgaas8766ad02008-04-28 16:34:27 -06001196 return cmos_do_probe(&pnp->dev,
1197 pnp_get_resource(pnp, IORESOURCE_IO, 0), 8);
Matthew Garrett6cd8fa82007-06-01 00:46:51 -07001198 else
1199 return cmos_do_probe(&pnp->dev,
Bjorn Helgaas8766ad02008-04-28 16:34:27 -06001200 pnp_get_resource(pnp, IORESOURCE_IO, 0),
1201 pnp_irq(pnp, 0));
David Brownell7be2c7c2007-02-10 01:46:02 -08001202}
1203
1204static void __exit cmos_pnp_remove(struct pnp_dev *pnp)
1205{
1206 cmos_do_remove(&pnp->dev);
1207}
1208
OGAWA Hirofumi004731b2010-01-08 14:43:11 -08001209static void cmos_pnp_shutdown(struct pnp_dev *pnp)
Rafael J. Wysocki74c46332008-09-02 14:36:11 -07001210{
Maciej W. Rozycki31632db2014-06-06 14:35:49 -07001211 struct device *dev = &pnp->dev;
1212 struct cmos_rtc *cmos = dev_get_drvdata(dev);
1213
Adrian Huang88b8d332015-07-06 12:19:12 +08001214 if (system_state == SYSTEM_POWER_OFF) {
1215 int retval = cmos_poweroff(dev);
1216
1217 if (cmos_aie_poweroff(dev) < 0 && !retval)
1218 return;
1219 }
Rafael J. Wysocki74c46332008-09-02 14:36:11 -07001220
Maciej W. Rozycki31632db2014-06-06 14:35:49 -07001221 cmos_do_shutdown(cmos->irq);
Rafael J. Wysocki74c46332008-09-02 14:36:11 -07001222}
David Brownell7be2c7c2007-02-10 01:46:02 -08001223
1224static const struct pnp_device_id rtc_ids[] = {
1225 { .id = "PNP0b00", },
1226 { .id = "PNP0b01", },
1227 { .id = "PNP0b02", },
1228 { },
1229};
1230MODULE_DEVICE_TABLE(pnp, rtc_ids);
1231
1232static struct pnp_driver cmos_pnp_driver = {
1233 .name = (char *) driver_name,
1234 .id_table = rtc_ids,
1235 .probe = cmos_pnp_probe,
1236 .remove = __exit_p(cmos_pnp_remove),
OGAWA Hirofumi004731b2010-01-08 14:43:11 -08001237 .shutdown = cmos_pnp_shutdown,
David Brownell7be2c7c2007-02-10 01:46:02 -08001238
1239 /* flag ensures resume() gets called, and stops syslog spam */
1240 .flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
Shuah Khana8a38082013-09-11 14:23:11 -07001241 .driver = {
1242 .pm = &cmos_pm_ops,
1243 },
David Brownell7be2c7c2007-02-10 01:46:02 -08001244};
1245
Stas Sergeev1da2e3d2008-06-12 15:21:54 -07001246#endif /* CONFIG_PNP */
David Brownell7be2c7c2007-02-10 01:46:02 -08001247
Sebastian Andrzej Siewior3bcbaf62011-02-22 21:07:46 +01001248#ifdef CONFIG_OF
1249static const struct of_device_id of_cmos_match[] = {
1250 {
1251 .compatible = "motorola,mc146818",
1252 },
1253 { },
1254};
1255MODULE_DEVICE_TABLE(of, of_cmos_match);
1256
1257static __init void cmos_of_init(struct platform_device *pdev)
1258{
1259 struct device_node *node = pdev->dev.of_node;
1260 struct rtc_time time;
1261 int ret;
1262 const __be32 *val;
1263
1264 if (!node)
1265 return;
1266
1267 val = of_get_property(node, "ctrl-reg", NULL);
1268 if (val)
1269 CMOS_WRITE(be32_to_cpup(val), RTC_CONTROL);
1270
1271 val = of_get_property(node, "freq-reg", NULL);
1272 if (val)
1273 CMOS_WRITE(be32_to_cpup(val), RTC_FREQ_SELECT);
1274
Arnd Bergmann5ab788d2016-05-30 20:57:50 +02001275 cmos_read_time(&pdev->dev, &time);
Sebastian Andrzej Siewior3bcbaf62011-02-22 21:07:46 +01001276 ret = rtc_valid_tm(&time);
1277 if (ret) {
1278 struct rtc_time def_time = {
1279 .tm_year = 1,
1280 .tm_mday = 1,
1281 };
Arnd Bergmann5ab788d2016-05-30 20:57:50 +02001282 cmos_set_time(&pdev->dev, &def_time);
Sebastian Andrzej Siewior3bcbaf62011-02-22 21:07:46 +01001283 }
1284}
1285#else
1286static inline void cmos_of_init(struct platform_device *pdev) {}
Sebastian Andrzej Siewior3bcbaf62011-02-22 21:07:46 +01001287#endif
David Brownell7be2c7c2007-02-10 01:46:02 -08001288/*----------------------------------------------------------------*/
1289
Marko Vrh41ac8df2007-05-08 00:34:09 -07001290/* Platform setup should have set up an RTC device, when PNP is
David Brownellbcd9b892007-04-01 23:49:47 -07001291 * unavailable ... this could happen even on (older) PCs.
David Brownell7be2c7c2007-02-10 01:46:02 -08001292 */
1293
1294static int __init cmos_platform_probe(struct platform_device *pdev)
1295{
Maciej W. Rozycki31632db2014-06-06 14:35:49 -07001296 struct resource *resource;
1297 int irq;
1298
Sebastian Andrzej Siewior3bcbaf62011-02-22 21:07:46 +01001299 cmos_of_init(pdev);
Bjorn Helgaasa474aae2008-10-14 13:50:21 -06001300 cmos_wake_setup(&pdev->dev);
Maciej W. Rozycki31632db2014-06-06 14:35:49 -07001301
1302 if (RTC_IOMAPPED)
1303 resource = platform_get_resource(pdev, IORESOURCE_IO, 0);
1304 else
1305 resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1306 irq = platform_get_irq(pdev, 0);
1307 if (irq < 0)
1308 irq = -1;
1309
1310 return cmos_do_probe(&pdev->dev, resource, irq);
David Brownell7be2c7c2007-02-10 01:46:02 -08001311}
1312
1313static int __exit cmos_platform_remove(struct platform_device *pdev)
1314{
1315 cmos_do_remove(&pdev->dev);
1316 return 0;
1317}
1318
1319static void cmos_platform_shutdown(struct platform_device *pdev)
1320{
Maciej W. Rozycki31632db2014-06-06 14:35:49 -07001321 struct device *dev = &pdev->dev;
1322 struct cmos_rtc *cmos = dev_get_drvdata(dev);
1323
Adrian Huang88b8d332015-07-06 12:19:12 +08001324 if (system_state == SYSTEM_POWER_OFF) {
1325 int retval = cmos_poweroff(dev);
1326
1327 if (cmos_aie_poweroff(dev) < 0 && !retval)
1328 return;
1329 }
Rafael J. Wysocki74c46332008-09-02 14:36:11 -07001330
Maciej W. Rozycki31632db2014-06-06 14:35:49 -07001331 cmos_do_shutdown(cmos->irq);
David Brownell7be2c7c2007-02-10 01:46:02 -08001332}
1333
Kay Sieversad28a072008-04-10 21:29:25 -07001334/* work with hotplug and coldplug */
1335MODULE_ALIAS("platform:rtc_cmos");
1336
David Brownell7be2c7c2007-02-10 01:46:02 -08001337static struct platform_driver cmos_platform_driver = {
1338 .remove = __exit_p(cmos_platform_remove),
1339 .shutdown = cmos_platform_shutdown,
1340 .driver = {
Geert Uytterhoevenc823a202014-01-23 15:55:11 -08001341 .name = driver_name,
Paul Fox2fb08e62011-01-12 17:00:07 -08001342 .pm = &cmos_pm_ops,
Sachin Kamatc8a60462013-02-21 16:44:28 -08001343 .of_match_table = of_match_ptr(of_cmos_match),
David Brownell7be2c7c2007-02-10 01:46:02 -08001344 }
1345};
1346
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001347#ifdef CONFIG_PNP
1348static bool pnp_driver_registered;
1349#endif
1350static bool platform_driver_registered;
1351
David Brownell7be2c7c2007-02-10 01:46:02 -08001352static int __init cmos_init(void)
1353{
Bjorn Helgaas72f22b12008-10-14 17:01:59 -06001354 int retval = 0;
1355
Stas Sergeev1da2e3d2008-06-12 15:21:54 -07001356#ifdef CONFIG_PNP
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001357 retval = pnp_register_driver(&cmos_pnp_driver);
1358 if (retval == 0)
1359 pnp_driver_registered = true;
Bjorn Helgaas72f22b12008-10-14 17:01:59 -06001360#endif
1361
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001362 if (!cmos_rtc.dev) {
Bjorn Helgaas72f22b12008-10-14 17:01:59 -06001363 retval = platform_driver_probe(&cmos_platform_driver,
1364 cmos_platform_probe);
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001365 if (retval == 0)
1366 platform_driver_registered = true;
1367 }
Bjorn Helgaas72f22b12008-10-14 17:01:59 -06001368
1369 if (retval == 0)
1370 return 0;
1371
1372#ifdef CONFIG_PNP
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001373 if (pnp_driver_registered)
1374 pnp_unregister_driver(&cmos_pnp_driver);
Bjorn Helgaas72f22b12008-10-14 17:01:59 -06001375#endif
1376 return retval;
David Brownell7be2c7c2007-02-10 01:46:02 -08001377}
1378module_init(cmos_init);
1379
1380static void __exit cmos_exit(void)
1381{
Stas Sergeev1da2e3d2008-06-12 15:21:54 -07001382#ifdef CONFIG_PNP
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001383 if (pnp_driver_registered)
1384 pnp_unregister_driver(&cmos_pnp_driver);
Bjorn Helgaas72f22b12008-10-14 17:01:59 -06001385#endif
Thadeu Lima de Souza Cascardo65909812009-07-29 15:02:13 -07001386 if (platform_driver_registered)
1387 platform_driver_unregister(&cmos_platform_driver);
David Brownell7be2c7c2007-02-10 01:46:02 -08001388}
1389module_exit(cmos_exit);
1390
1391
David Brownell7be2c7c2007-02-10 01:46:02 -08001392MODULE_AUTHOR("David Brownell");
1393MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs");
1394MODULE_LICENSE("GPL");