UBI: improve comment
[pandora-kernel.git] / drivers / rtc / rtc-cmos.c
1 /*
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  */
31 #include <linux/kernel.h>
32 #include <linux/module.h>
33 #include <linux/init.h>
34 #include <linux/interrupt.h>
35 #include <linux/spinlock.h>
36 #include <linux/platform_device.h>
37 #include <linux/mod_devicetable.h>
38
39 /* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
40 #include <asm-generic/rtc.h>
41
42
43 struct cmos_rtc {
44         struct rtc_device       *rtc;
45         struct device           *dev;
46         int                     irq;
47         struct resource         *iomem;
48
49         void                    (*wake_on)(struct device *);
50         void                    (*wake_off)(struct device *);
51
52         u8                      enabled_wake;
53         u8                      suspend_ctrl;
54
55         /* newer hardware extends the original register set */
56         u8                      day_alrm;
57         u8                      mon_alrm;
58         u8                      century;
59 };
60
61 /* both platform and pnp busses use negative numbers for invalid irqs */
62 #define is_valid_irq(n)         ((n) >= 0)
63
64 static const char driver_name[] = "rtc_cmos";
65
66 /* The RTC_INTR register may have e.g. RTC_PF set even if RTC_PIE is clear;
67  * always mask it against the irq enable bits in RTC_CONTROL.  Bit values
68  * are the same: PF==PIE, AF=AIE, UF=UIE; so RTC_IRQMASK works with both.
69  */
70 #define RTC_IRQMASK     (RTC_PF | RTC_AF | RTC_UF)
71
72 static inline int is_intr(u8 rtc_intr)
73 {
74         if (!(rtc_intr & RTC_IRQF))
75                 return 0;
76         return rtc_intr & RTC_IRQMASK;
77 }
78
79 /*----------------------------------------------------------------*/
80
81 static int cmos_read_time(struct device *dev, struct rtc_time *t)
82 {
83         /* REVISIT:  if the clock has a "century" register, use
84          * that instead of the heuristic in get_rtc_time().
85          * That'll make Y3K compatility (year > 2070) easy!
86          */
87         get_rtc_time(t);
88         return 0;
89 }
90
91 static int cmos_set_time(struct device *dev, struct rtc_time *t)
92 {
93         /* REVISIT:  set the "century" register if available
94          *
95          * NOTE: this ignores the issue whereby updating the seconds
96          * takes effect exactly 500ms after we write the register.
97          * (Also queueing and other delays before we get this far.)
98          */
99         return set_rtc_time(t);
100 }
101
102 static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)
103 {
104         struct cmos_rtc *cmos = dev_get_drvdata(dev);
105         unsigned char   rtc_control;
106
107         if (!is_valid_irq(cmos->irq))
108                 return -EIO;
109
110         /* Basic alarms only support hour, minute, and seconds fields.
111          * Some also support day and month, for alarms up to a year in
112          * the future.
113          */
114         t->time.tm_mday = -1;
115         t->time.tm_mon = -1;
116
117         spin_lock_irq(&rtc_lock);
118         t->time.tm_sec = CMOS_READ(RTC_SECONDS_ALARM);
119         t->time.tm_min = CMOS_READ(RTC_MINUTES_ALARM);
120         t->time.tm_hour = CMOS_READ(RTC_HOURS_ALARM);
121
122         if (cmos->day_alrm) {
123                 t->time.tm_mday = CMOS_READ(cmos->day_alrm);
124                 if (!t->time.tm_mday)
125                         t->time.tm_mday = -1;
126
127                 if (cmos->mon_alrm) {
128                         t->time.tm_mon = CMOS_READ(cmos->mon_alrm);
129                         if (!t->time.tm_mon)
130                                 t->time.tm_mon = -1;
131                 }
132         }
133
134         rtc_control = CMOS_READ(RTC_CONTROL);
135         spin_unlock_irq(&rtc_lock);
136
137         /* REVISIT this assumes PC style usage:  always BCD */
138
139         if (((unsigned)t->time.tm_sec) < 0x60)
140                 t->time.tm_sec = BCD2BIN(t->time.tm_sec);
141         else
142                 t->time.tm_sec = -1;
143         if (((unsigned)t->time.tm_min) < 0x60)
144                 t->time.tm_min = BCD2BIN(t->time.tm_min);
145         else
146                 t->time.tm_min = -1;
147         if (((unsigned)t->time.tm_hour) < 0x24)
148                 t->time.tm_hour = BCD2BIN(t->time.tm_hour);
149         else
150                 t->time.tm_hour = -1;
151
152         if (cmos->day_alrm) {
153                 if (((unsigned)t->time.tm_mday) <= 0x31)
154                         t->time.tm_mday = BCD2BIN(t->time.tm_mday);
155                 else
156                         t->time.tm_mday = -1;
157                 if (cmos->mon_alrm) {
158                         if (((unsigned)t->time.tm_mon) <= 0x12)
159                                 t->time.tm_mon = BCD2BIN(t->time.tm_mon) - 1;
160                         else
161                                 t->time.tm_mon = -1;
162                 }
163         }
164         t->time.tm_year = -1;
165
166         t->enabled = !!(rtc_control & RTC_AIE);
167         t->pending = 0;
168
169         return 0;
170 }
171
172 static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
173 {
174         struct cmos_rtc *cmos = dev_get_drvdata(dev);
175         unsigned char   mon, mday, hrs, min, sec;
176         unsigned char   rtc_control, rtc_intr;
177
178         if (!is_valid_irq(cmos->irq))
179                 return -EIO;
180
181         /* REVISIT this assumes PC style usage:  always BCD */
182
183         /* Writing 0xff means "don't care" or "match all".  */
184
185         mon = t->time.tm_mon;
186         mon = (mon < 12) ? BIN2BCD(mon) : 0xff;
187         mon++;
188
189         mday = t->time.tm_mday;
190         mday = (mday >= 1 && mday <= 31) ? BIN2BCD(mday) : 0xff;
191
192         hrs = t->time.tm_hour;
193         hrs = (hrs < 24) ? BIN2BCD(hrs) : 0xff;
194
195         min = t->time.tm_min;
196         min = (min < 60) ? BIN2BCD(min) : 0xff;
197
198         sec = t->time.tm_sec;
199         sec = (sec < 60) ? BIN2BCD(sec) : 0xff;
200
201         spin_lock_irq(&rtc_lock);
202
203         /* next rtc irq must not be from previous alarm setting */
204         rtc_control = CMOS_READ(RTC_CONTROL);
205         rtc_control &= ~RTC_AIE;
206         CMOS_WRITE(rtc_control, RTC_CONTROL);
207         rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
208         rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
209         if (is_intr(rtc_intr))
210                 rtc_update_irq(cmos->rtc, 1, rtc_intr);
211
212         /* update alarm */
213         CMOS_WRITE(hrs, RTC_HOURS_ALARM);
214         CMOS_WRITE(min, RTC_MINUTES_ALARM);
215         CMOS_WRITE(sec, RTC_SECONDS_ALARM);
216
217         /* the system may support an "enhanced" alarm */
218         if (cmos->day_alrm) {
219                 CMOS_WRITE(mday, cmos->day_alrm);
220                 if (cmos->mon_alrm)
221                         CMOS_WRITE(mon, cmos->mon_alrm);
222         }
223
224         if (t->enabled) {
225                 rtc_control |= RTC_AIE;
226                 CMOS_WRITE(rtc_control, RTC_CONTROL);
227                 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
228                 rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
229                 if (is_intr(rtc_intr))
230                         rtc_update_irq(cmos->rtc, 1, rtc_intr);
231         }
232
233         spin_unlock_irq(&rtc_lock);
234
235         return 0;
236 }
237
238 static int cmos_irq_set_freq(struct device *dev, int freq)
239 {
240         struct cmos_rtc *cmos = dev_get_drvdata(dev);
241         int             f;
242         unsigned long   flags;
243
244         if (!is_valid_irq(cmos->irq))
245                 return -ENXIO;
246
247         /* 0 = no irqs; 1 = 2^15 Hz ... 15 = 2^0 Hz */
248         f = ffs(freq);
249         if (f-- > 16)
250                 return -EINVAL;
251         f = 16 - f;
252
253         spin_lock_irqsave(&rtc_lock, flags);
254         CMOS_WRITE(RTC_REF_CLCK_32KHZ | f, RTC_FREQ_SELECT);
255         spin_unlock_irqrestore(&rtc_lock, flags);
256
257         return 0;
258 }
259
260 static int cmos_irq_set_state(struct device *dev, int enabled)
261 {
262         struct cmos_rtc *cmos = dev_get_drvdata(dev);
263         unsigned char   rtc_control, rtc_intr;
264         unsigned long   flags;
265
266         if (!is_valid_irq(cmos->irq))
267                 return -ENXIO;
268
269         spin_lock_irqsave(&rtc_lock, flags);
270         rtc_control = CMOS_READ(RTC_CONTROL);
271
272         if (enabled)
273                 rtc_control |= RTC_PIE;
274         else
275                 rtc_control &= ~RTC_PIE;
276
277         CMOS_WRITE(rtc_control, RTC_CONTROL);
278
279         rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
280         rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
281         if (is_intr(rtc_intr))
282                 rtc_update_irq(cmos->rtc, 1, rtc_intr);
283
284         spin_unlock_irqrestore(&rtc_lock, flags);
285         return 0;
286 }
287
288 #if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE)
289
290 static int
291 cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
292 {
293         struct cmos_rtc *cmos = dev_get_drvdata(dev);
294         unsigned char   rtc_control, rtc_intr;
295         unsigned long   flags;
296
297         switch (cmd) {
298         case RTC_AIE_OFF:
299         case RTC_AIE_ON:
300         case RTC_UIE_OFF:
301         case RTC_UIE_ON:
302         case RTC_PIE_OFF:
303         case RTC_PIE_ON:
304                 if (!is_valid_irq(cmos->irq))
305                         return -EINVAL;
306                 break;
307         default:
308                 return -ENOIOCTLCMD;
309         }
310
311         spin_lock_irqsave(&rtc_lock, flags);
312         rtc_control = CMOS_READ(RTC_CONTROL);
313         switch (cmd) {
314         case RTC_AIE_OFF:       /* alarm off */
315                 rtc_control &= ~RTC_AIE;
316                 break;
317         case RTC_AIE_ON:        /* alarm on */
318                 rtc_control |= RTC_AIE;
319                 break;
320         case RTC_UIE_OFF:       /* update off */
321                 rtc_control &= ~RTC_UIE;
322                 break;
323         case RTC_UIE_ON:        /* update on */
324                 rtc_control |= RTC_UIE;
325                 break;
326         case RTC_PIE_OFF:       /* periodic off */
327                 rtc_control &= ~RTC_PIE;
328                 break;
329         case RTC_PIE_ON:        /* periodic on */
330                 rtc_control |= RTC_PIE;
331                 break;
332         }
333         CMOS_WRITE(rtc_control, RTC_CONTROL);
334         rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
335         rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF;
336         if (is_intr(rtc_intr))
337                 rtc_update_irq(cmos->rtc, 1, rtc_intr);
338         spin_unlock_irqrestore(&rtc_lock, flags);
339         return 0;
340 }
341
342 #else
343 #define cmos_rtc_ioctl  NULL
344 #endif
345
346 #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
347
348 static int cmos_procfs(struct device *dev, struct seq_file *seq)
349 {
350         struct cmos_rtc *cmos = dev_get_drvdata(dev);
351         unsigned char   rtc_control, valid;
352
353         spin_lock_irq(&rtc_lock);
354         rtc_control = CMOS_READ(RTC_CONTROL);
355         valid = CMOS_READ(RTC_VALID);
356         spin_unlock_irq(&rtc_lock);
357
358         /* NOTE:  at least ICH6 reports battery status using a different
359          * (non-RTC) bit; and SQWE is ignored on many current systems.
360          */
361         return seq_printf(seq,
362                         "periodic_IRQ\t: %s\n"
363                         "update_IRQ\t: %s\n"
364                         // "square_wave\t: %s\n"
365                         // "BCD\t\t: %s\n"
366                         "DST_enable\t: %s\n"
367                         "periodic_freq\t: %d\n"
368                         "batt_status\t: %s\n",
369                         (rtc_control & RTC_PIE) ? "yes" : "no",
370                         (rtc_control & RTC_UIE) ? "yes" : "no",
371                         // (rtc_control & RTC_SQWE) ? "yes" : "no",
372                         // (rtc_control & RTC_DM_BINARY) ? "no" : "yes",
373                         (rtc_control & RTC_DST_EN) ? "yes" : "no",
374                         cmos->rtc->irq_freq,
375                         (valid & RTC_VRT) ? "okay" : "dead");
376 }
377
378 #else
379 #define cmos_procfs     NULL
380 #endif
381
382 static const struct rtc_class_ops cmos_rtc_ops = {
383         .ioctl          = cmos_rtc_ioctl,
384         .read_time      = cmos_read_time,
385         .set_time       = cmos_set_time,
386         .read_alarm     = cmos_read_alarm,
387         .set_alarm      = cmos_set_alarm,
388         .proc           = cmos_procfs,
389         .irq_set_freq   = cmos_irq_set_freq,
390         .irq_set_state  = cmos_irq_set_state,
391 };
392
393 /*----------------------------------------------------------------*/
394
395 static struct cmos_rtc  cmos_rtc;
396
397 static irqreturn_t cmos_interrupt(int irq, void *p)
398 {
399         u8              irqstat;
400
401         spin_lock(&rtc_lock);
402         irqstat = CMOS_READ(RTC_INTR_FLAGS);
403         irqstat &= (CMOS_READ(RTC_CONTROL) & RTC_IRQMASK) | RTC_IRQF;
404         spin_unlock(&rtc_lock);
405
406         if (is_intr(irqstat)) {
407                 rtc_update_irq(p, 1, irqstat);
408                 return IRQ_HANDLED;
409         } else
410                 return IRQ_NONE;
411 }
412
413 #ifdef  CONFIG_PNP
414 #define is_pnp()        1
415 #define INITSECTION
416
417 #else
418 #define is_pnp()        0
419 #define INITSECTION     __init
420 #endif
421
422 static int INITSECTION
423 cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
424 {
425         struct cmos_rtc_board_info      *info = dev->platform_data;
426         int                             retval = 0;
427         unsigned char                   rtc_control;
428
429         /* there can be only one ... */
430         if (cmos_rtc.dev)
431                 return -EBUSY;
432
433         if (!ports)
434                 return -ENODEV;
435
436         /* Claim I/O ports ASAP, minimizing conflict with legacy driver.
437          *
438          * REVISIT non-x86 systems may instead use memory space resources
439          * (needing ioremap etc), not i/o space resources like this ...
440          */
441         ports = request_region(ports->start,
442                         ports->end + 1 - ports->start,
443                         driver_name);
444         if (!ports) {
445                 dev_dbg(dev, "i/o registers already in use\n");
446                 return -EBUSY;
447         }
448
449         cmos_rtc.irq = rtc_irq;
450         cmos_rtc.iomem = ports;
451
452         /* For ACPI systems extension info comes from the FADT.  On others,
453          * board specific setup provides it as appropriate.  Systems where
454          * the alarm IRQ isn't automatically a wakeup IRQ (like ACPI, and
455          * some almost-clones) can provide hooks to make that behave.
456          */
457         if (info) {
458                 cmos_rtc.day_alrm = info->rtc_day_alarm;
459                 cmos_rtc.mon_alrm = info->rtc_mon_alarm;
460                 cmos_rtc.century = info->rtc_century;
461
462                 if (info->wake_on && info->wake_off) {
463                         cmos_rtc.wake_on = info->wake_on;
464                         cmos_rtc.wake_off = info->wake_off;
465                 }
466         }
467
468         cmos_rtc.rtc = rtc_device_register(driver_name, dev,
469                                 &cmos_rtc_ops, THIS_MODULE);
470         if (IS_ERR(cmos_rtc.rtc)) {
471                 retval = PTR_ERR(cmos_rtc.rtc);
472                 goto cleanup0;
473         }
474
475         cmos_rtc.dev = dev;
476         dev_set_drvdata(dev, &cmos_rtc);
477         rename_region(ports, cmos_rtc.rtc->dev.bus_id);
478
479         spin_lock_irq(&rtc_lock);
480
481         /* force periodic irq to CMOS reset default of 1024Hz;
482          *
483          * REVISIT it's been reported that at least one x86_64 ALI mobo
484          * doesn't use 32KHz here ... for portability we might need to
485          * do something about other clock frequencies.
486          */
487         CMOS_WRITE(RTC_REF_CLCK_32KHZ | 0x06, RTC_FREQ_SELECT);
488         cmos_rtc.rtc->irq_freq = 1024;
489
490         /* disable irqs.
491          *
492          * NOTE after changing RTC_xIE bits we always read INTR_FLAGS;
493          * allegedly some older rtcs need that to handle irqs properly
494          */
495         rtc_control = CMOS_READ(RTC_CONTROL);
496         rtc_control &= ~(RTC_PIE | RTC_AIE | RTC_UIE);
497         CMOS_WRITE(rtc_control, RTC_CONTROL);
498         CMOS_READ(RTC_INTR_FLAGS);
499
500         spin_unlock_irq(&rtc_lock);
501
502         /* FIXME teach the alarm code how to handle binary mode;
503          * <asm-generic/rtc.h> doesn't know 12-hour mode either.
504          */
505         if (!(rtc_control & RTC_24H) || (rtc_control & (RTC_DM_BINARY))) {
506                 dev_dbg(dev, "only 24-hr BCD mode supported\n");
507                 retval = -ENXIO;
508                 goto cleanup1;
509         }
510
511         if (is_valid_irq(rtc_irq))
512                 retval = request_irq(rtc_irq, cmos_interrupt, IRQF_DISABLED,
513                                 cmos_rtc.rtc->dev.bus_id,
514                                 cmos_rtc.rtc);
515         if (retval < 0) {
516                 dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq);
517                 goto cleanup1;
518         }
519
520         /* REVISIT optionally make 50 or 114 bytes NVRAM available,
521          * like rtc-ds1553, rtc-ds1742 ... this will often include
522          * registers for century, and day/month alarm.
523          */
524
525         pr_info("%s: alarms up to one %s%s\n",
526                         cmos_rtc.rtc->dev.bus_id,
527                         is_valid_irq(rtc_irq)
528                                 ?  (cmos_rtc.mon_alrm
529                                         ? "year"
530                                         : (cmos_rtc.day_alrm
531                                                 ? "month" : "day"))
532                                 : "no",
533                         cmos_rtc.century ? ", y3k" : ""
534                         );
535
536         return 0;
537
538 cleanup1:
539         cmos_rtc.dev = NULL;
540         rtc_device_unregister(cmos_rtc.rtc);
541 cleanup0:
542         release_region(ports->start, ports->end + 1 - ports->start);
543         return retval;
544 }
545
546 static void cmos_do_shutdown(void)
547 {
548         unsigned char   rtc_control;
549
550         spin_lock_irq(&rtc_lock);
551         rtc_control = CMOS_READ(RTC_CONTROL);
552         rtc_control &= ~(RTC_PIE|RTC_AIE|RTC_UIE);
553         CMOS_WRITE(rtc_control, RTC_CONTROL);
554         CMOS_READ(RTC_INTR_FLAGS);
555         spin_unlock_irq(&rtc_lock);
556 }
557
558 static void __exit cmos_do_remove(struct device *dev)
559 {
560         struct cmos_rtc *cmos = dev_get_drvdata(dev);
561         struct resource *ports;
562
563         cmos_do_shutdown();
564
565         if (is_valid_irq(cmos->irq))
566                 free_irq(cmos->irq, cmos->rtc);
567
568         rtc_device_unregister(cmos->rtc);
569         cmos->rtc = NULL;
570
571         ports = cmos->iomem;
572         release_region(ports->start, ports->end + 1 - ports->start);
573         cmos->iomem = NULL;
574
575         cmos->dev = NULL;
576         dev_set_drvdata(dev, NULL);
577 }
578
579 #ifdef  CONFIG_PM
580
581 static int cmos_suspend(struct device *dev, pm_message_t mesg)
582 {
583         struct cmos_rtc *cmos = dev_get_drvdata(dev);
584         int             do_wake = device_may_wakeup(dev);
585         unsigned char   tmp;
586
587         /* only the alarm might be a wakeup event source */
588         spin_lock_irq(&rtc_lock);
589         cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL);
590         if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
591                 unsigned char   irqstat;
592
593                 if (do_wake)
594                         tmp &= ~(RTC_PIE|RTC_UIE);
595                 else
596                         tmp &= ~(RTC_PIE|RTC_AIE|RTC_UIE);
597                 CMOS_WRITE(tmp, RTC_CONTROL);
598                 irqstat = CMOS_READ(RTC_INTR_FLAGS);
599                 irqstat &= (tmp & RTC_IRQMASK) | RTC_IRQF;
600                 if (is_intr(irqstat))
601                         rtc_update_irq(cmos->rtc, 1, irqstat);
602         }
603         spin_unlock_irq(&rtc_lock);
604
605         if (tmp & RTC_AIE) {
606                 cmos->enabled_wake = 1;
607                 if (cmos->wake_on)
608                         cmos->wake_on(dev);
609                 else
610                         enable_irq_wake(cmos->irq);
611         }
612
613         pr_debug("%s: suspend%s, ctrl %02x\n",
614                         cmos_rtc.rtc->dev.bus_id,
615                         (tmp & RTC_AIE) ? ", alarm may wake" : "",
616                         tmp);
617
618         return 0;
619 }
620
621 static int cmos_resume(struct device *dev)
622 {
623         struct cmos_rtc *cmos = dev_get_drvdata(dev);
624         unsigned char   tmp = cmos->suspend_ctrl;
625
626         /* re-enable any irqs previously active */
627         if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
628
629                 if (cmos->enabled_wake) {
630                         if (cmos->wake_off)
631                                 cmos->wake_off(dev);
632                         else
633                                 disable_irq_wake(cmos->irq);
634                         cmos->enabled_wake = 0;
635                 }
636
637                 spin_lock_irq(&rtc_lock);
638                 CMOS_WRITE(tmp, RTC_CONTROL);
639                 tmp = CMOS_READ(RTC_INTR_FLAGS);
640                 tmp &= (cmos->suspend_ctrl & RTC_IRQMASK) | RTC_IRQF;
641                 if (is_intr(tmp))
642                         rtc_update_irq(cmos->rtc, 1, tmp);
643                 spin_unlock_irq(&rtc_lock);
644         }
645
646         pr_debug("%s: resume, ctrl %02x\n",
647                         cmos_rtc.rtc->dev.bus_id,
648                         cmos->suspend_ctrl);
649
650
651         return 0;
652 }
653
654 #else
655 #define cmos_suspend    NULL
656 #define cmos_resume     NULL
657 #endif
658
659 /*----------------------------------------------------------------*/
660
661 /* The "CMOS" RTC normally lives on the platform_bus.  On ACPI systems,
662  * the device node will always be created as a PNPACPI device.  Plus
663  * pre-ACPI PCs probably list it in the PNPBIOS tables.
664  */
665
666 #ifdef  CONFIG_PNP
667
668 #include <linux/pnp.h>
669
670 static int __devinit
671 cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
672 {
673         /* REVISIT paranoia argues for a shutdown notifier, since PNP
674          * drivers can't provide shutdown() methods to disable IRQs.
675          * Or better yet, fix PNP to allow those methods...
676          */
677         if (pnp_port_start(pnp,0) == 0x70 && !pnp_irq_valid(pnp,0))
678                 /* Some machines contain a PNP entry for the RTC, but
679                  * don't define the IRQ. It should always be safe to
680                  * hardcode it in these cases
681                  */
682                 return cmos_do_probe(&pnp->dev, &pnp->res.port_resource[0], 8);
683         else
684                 return cmos_do_probe(&pnp->dev,
685                                      &pnp->res.port_resource[0],
686                                      pnp->res.irq_resource[0].start);
687 }
688
689 static void __exit cmos_pnp_remove(struct pnp_dev *pnp)
690 {
691         cmos_do_remove(&pnp->dev);
692 }
693
694 #ifdef  CONFIG_PM
695
696 static int cmos_pnp_suspend(struct pnp_dev *pnp, pm_message_t mesg)
697 {
698         return cmos_suspend(&pnp->dev, mesg);
699 }
700
701 static int cmos_pnp_resume(struct pnp_dev *pnp)
702 {
703         return cmos_resume(&pnp->dev);
704 }
705
706 #else
707 #define cmos_pnp_suspend        NULL
708 #define cmos_pnp_resume         NULL
709 #endif
710
711
712 static const struct pnp_device_id rtc_ids[] = {
713         { .id = "PNP0b00", },
714         { .id = "PNP0b01", },
715         { .id = "PNP0b02", },
716         { },
717 };
718 MODULE_DEVICE_TABLE(pnp, rtc_ids);
719
720 static struct pnp_driver cmos_pnp_driver = {
721         .name           = (char *) driver_name,
722         .id_table       = rtc_ids,
723         .probe          = cmos_pnp_probe,
724         .remove         = __exit_p(cmos_pnp_remove),
725
726         /* flag ensures resume() gets called, and stops syslog spam */
727         .flags          = PNP_DRIVER_RES_DO_NOT_CHANGE,
728         .suspend        = cmos_pnp_suspend,
729         .resume         = cmos_pnp_resume,
730 };
731
732 static int __init cmos_init(void)
733 {
734         return pnp_register_driver(&cmos_pnp_driver);
735 }
736 module_init(cmos_init);
737
738 static void __exit cmos_exit(void)
739 {
740         pnp_unregister_driver(&cmos_pnp_driver);
741 }
742 module_exit(cmos_exit);
743
744 #else   /* no PNP */
745
746 /*----------------------------------------------------------------*/
747
748 /* Platform setup should have set up an RTC device, when PNP is
749  * unavailable ... this could happen even on (older) PCs.
750  */
751
752 static int __init cmos_platform_probe(struct platform_device *pdev)
753 {
754         return cmos_do_probe(&pdev->dev,
755                         platform_get_resource(pdev, IORESOURCE_IO, 0),
756                         platform_get_irq(pdev, 0));
757 }
758
759 static int __exit cmos_platform_remove(struct platform_device *pdev)
760 {
761         cmos_do_remove(&pdev->dev);
762         return 0;
763 }
764
765 static void cmos_platform_shutdown(struct platform_device *pdev)
766 {
767         cmos_do_shutdown();
768 }
769
770 static struct platform_driver cmos_platform_driver = {
771         .remove         = __exit_p(cmos_platform_remove),
772         .shutdown       = cmos_platform_shutdown,
773         .driver = {
774                 .name           = (char *) driver_name,
775                 .suspend        = cmos_suspend,
776                 .resume         = cmos_resume,
777         }
778 };
779
780 static int __init cmos_init(void)
781 {
782         return platform_driver_probe(&cmos_platform_driver,
783                         cmos_platform_probe);
784 }
785 module_init(cmos_init);
786
787 static void __exit cmos_exit(void)
788 {
789         platform_driver_unregister(&cmos_platform_driver);
790 }
791 module_exit(cmos_exit);
792
793
794 #endif  /* !PNP */
795
796 MODULE_AUTHOR("David Brownell");
797 MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs");
798 MODULE_LICENSE("GPL");