39a2fcd98c2d85df814ead98b6d930c47b13b9ce
[safe/jmp/linux-2.6] / drivers / rtc / rtc-sh.c
1 /*
2  * SuperH On-Chip RTC Support
3  *
4  * Copyright (C) 2006 - 2009  Paul Mundt
5  * Copyright (C) 2006  Jamie Lenehan
6  * Copyright (C) 2008  Angelo Castello
7  *
8  * Based on the old arch/sh/kernel/cpu/rtc.c by:
9  *
10  *  Copyright (C) 2000  Philipp Rumpf <prumpf@tux.org>
11  *  Copyright (C) 1999  Tetsuya Okada & Niibe Yutaka
12  *
13  * This file is subject to the terms and conditions of the GNU General Public
14  * License.  See the file "COPYING" in the main directory of this archive
15  * for more details.
16  */
17 #include <linux/module.h>
18 #include <linux/kernel.h>
19 #include <linux/bcd.h>
20 #include <linux/rtc.h>
21 #include <linux/init.h>
22 #include <linux/platform_device.h>
23 #include <linux/seq_file.h>
24 #include <linux/interrupt.h>
25 #include <linux/spinlock.h>
26 #include <linux/io.h>
27 #include <linux/log2.h>
28 #include <linux/clk.h>
29 #include <asm/rtc.h>
30
31 #define DRV_NAME        "sh-rtc"
32 #define DRV_VERSION     "0.2.3"
33
34 #define RTC_REG(r)      ((r) * rtc_reg_size)
35
36 #define R64CNT          RTC_REG(0)
37
38 #define RSECCNT         RTC_REG(1)      /* RTC sec */
39 #define RMINCNT         RTC_REG(2)      /* RTC min */
40 #define RHRCNT          RTC_REG(3)      /* RTC hour */
41 #define RWKCNT          RTC_REG(4)      /* RTC week */
42 #define RDAYCNT         RTC_REG(5)      /* RTC day */
43 #define RMONCNT         RTC_REG(6)      /* RTC month */
44 #define RYRCNT          RTC_REG(7)      /* RTC year */
45 #define RSECAR          RTC_REG(8)      /* ALARM sec */
46 #define RMINAR          RTC_REG(9)      /* ALARM min */
47 #define RHRAR           RTC_REG(10)     /* ALARM hour */
48 #define RWKAR           RTC_REG(11)     /* ALARM week */
49 #define RDAYAR          RTC_REG(12)     /* ALARM day */
50 #define RMONAR          RTC_REG(13)     /* ALARM month */
51 #define RCR1            RTC_REG(14)     /* Control */
52 #define RCR2            RTC_REG(15)     /* Control */
53
54 /*
55  * Note on RYRAR and RCR3: Up until this point most of the register
56  * definitions are consistent across all of the available parts. However,
57  * the placement of the optional RYRAR and RCR3 (the RYRAR control
58  * register used to control RYRCNT/RYRAR compare) varies considerably
59  * across various parts, occasionally being mapped in to a completely
60  * unrelated address space. For proper RYRAR support a separate resource
61  * would have to be handed off, but as this is purely optional in
62  * practice, we simply opt not to support it, thereby keeping the code
63  * quite a bit more simplified.
64  */
65
66 /* ALARM Bits - or with BCD encoded value */
67 #define AR_ENB          0x80    /* Enable for alarm cmp   */
68
69 /* Period Bits */
70 #define PF_HP           0x100   /* Enable Half Period to support 8,32,128Hz */
71 #define PF_COUNT        0x200   /* Half periodic counter */
72 #define PF_OXS          0x400   /* Periodic One x Second */
73 #define PF_KOU          0x800   /* Kernel or User periodic request 1=kernel */
74 #define PF_MASK         0xf00
75
76 /* RCR1 Bits */
77 #define RCR1_CF         0x80    /* Carry Flag             */
78 #define RCR1_CIE        0x10    /* Carry Interrupt Enable */
79 #define RCR1_AIE        0x08    /* Alarm Interrupt Enable */
80 #define RCR1_AF         0x01    /* Alarm Flag             */
81
82 /* RCR2 Bits */
83 #define RCR2_PEF        0x80    /* PEriodic interrupt Flag */
84 #define RCR2_PESMASK    0x70    /* Periodic interrupt Set  */
85 #define RCR2_RTCEN      0x08    /* ENable RTC              */
86 #define RCR2_ADJ        0x04    /* ADJustment (30-second)  */
87 #define RCR2_RESET      0x02    /* Reset bit               */
88 #define RCR2_START      0x01    /* Start bit               */
89
90 struct sh_rtc {
91         void __iomem            *regbase;
92         unsigned long           regsize;
93         struct resource         *res;
94         int                     alarm_irq;
95         int                     periodic_irq;
96         int                     carry_irq;
97         struct clk              *clk;
98         struct rtc_device       *rtc_dev;
99         spinlock_t              lock;
100         unsigned long           capabilities;   /* See asm/rtc.h for cap bits */
101         unsigned short          periodic_freq;
102 };
103
104 static int __sh_rtc_interrupt(struct sh_rtc *rtc)
105 {
106         unsigned int tmp, pending;
107
108         tmp = readb(rtc->regbase + RCR1);
109         pending = tmp & RCR1_CF;
110         tmp &= ~RCR1_CF;
111         writeb(tmp, rtc->regbase + RCR1);
112
113         /* Users have requested One x Second IRQ */
114         if (pending && rtc->periodic_freq & PF_OXS)
115                 rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
116
117         return pending;
118 }
119
120 static int __sh_rtc_alarm(struct sh_rtc *rtc)
121 {
122         unsigned int tmp, pending;
123
124         tmp = readb(rtc->regbase + RCR1);
125         pending = tmp & RCR1_AF;
126         tmp &= ~(RCR1_AF | RCR1_AIE);
127         writeb(tmp, rtc->regbase + RCR1);
128
129         if (pending)
130                 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
131
132         return pending;
133 }
134
135 static int __sh_rtc_periodic(struct sh_rtc *rtc)
136 {
137         struct rtc_device *rtc_dev = rtc->rtc_dev;
138         struct rtc_task *irq_task;
139         unsigned int tmp, pending;
140
141         tmp = readb(rtc->regbase + RCR2);
142         pending = tmp & RCR2_PEF;
143         tmp &= ~RCR2_PEF;
144         writeb(tmp, rtc->regbase + RCR2);
145
146         if (!pending)
147                 return 0;
148
149         /* Half period enabled than one skipped and the next notified */
150         if ((rtc->periodic_freq & PF_HP) && (rtc->periodic_freq & PF_COUNT))
151                 rtc->periodic_freq &= ~PF_COUNT;
152         else {
153                 if (rtc->periodic_freq & PF_HP)
154                         rtc->periodic_freq |= PF_COUNT;
155                 if (rtc->periodic_freq & PF_KOU) {
156                         spin_lock(&rtc_dev->irq_task_lock);
157                         irq_task = rtc_dev->irq_task;
158                         if (irq_task)
159                                 irq_task->func(irq_task->private_data);
160                         spin_unlock(&rtc_dev->irq_task_lock);
161                 } else
162                         rtc_update_irq(rtc->rtc_dev, 1, RTC_PF | RTC_IRQF);
163         }
164
165         return pending;
166 }
167
168 static irqreturn_t sh_rtc_interrupt(int irq, void *dev_id)
169 {
170         struct sh_rtc *rtc = dev_id;
171         int ret;
172
173         spin_lock(&rtc->lock);
174         ret = __sh_rtc_interrupt(rtc);
175         spin_unlock(&rtc->lock);
176
177         return IRQ_RETVAL(ret);
178 }
179
180 static irqreturn_t sh_rtc_alarm(int irq, void *dev_id)
181 {
182         struct sh_rtc *rtc = dev_id;
183         int ret;
184
185         spin_lock(&rtc->lock);
186         ret = __sh_rtc_alarm(rtc);
187         spin_unlock(&rtc->lock);
188
189         return IRQ_RETVAL(ret);
190 }
191
192 static irqreturn_t sh_rtc_periodic(int irq, void *dev_id)
193 {
194         struct sh_rtc *rtc = dev_id;
195         int ret;
196
197         spin_lock(&rtc->lock);
198         ret = __sh_rtc_periodic(rtc);
199         spin_unlock(&rtc->lock);
200
201         return IRQ_RETVAL(ret);
202 }
203
204 static irqreturn_t sh_rtc_shared(int irq, void *dev_id)
205 {
206         struct sh_rtc *rtc = dev_id;
207         int ret;
208
209         spin_lock(&rtc->lock);
210         ret = __sh_rtc_interrupt(rtc);
211         ret |= __sh_rtc_alarm(rtc);
212         ret |= __sh_rtc_periodic(rtc);
213         spin_unlock(&rtc->lock);
214
215         return IRQ_RETVAL(ret);
216 }
217
218 static int sh_rtc_irq_set_state(struct device *dev, int enable)
219 {
220         struct sh_rtc *rtc = dev_get_drvdata(dev);
221         unsigned int tmp;
222
223         spin_lock_irq(&rtc->lock);
224
225         tmp = readb(rtc->regbase + RCR2);
226
227         if (enable) {
228                 rtc->periodic_freq |= PF_KOU;
229                 tmp &= ~RCR2_PEF;       /* Clear PES bit */
230                 tmp |= (rtc->periodic_freq & ~PF_HP);   /* Set PES2-0 */
231         } else {
232                 rtc->periodic_freq &= ~PF_KOU;
233                 tmp &= ~(RCR2_PESMASK | RCR2_PEF);
234         }
235
236         writeb(tmp, rtc->regbase + RCR2);
237
238         spin_unlock_irq(&rtc->lock);
239
240         return 0;
241 }
242
243 static int sh_rtc_irq_set_freq(struct device *dev, int freq)
244 {
245         struct sh_rtc *rtc = dev_get_drvdata(dev);
246         int tmp, ret = 0;
247
248         spin_lock_irq(&rtc->lock);
249         tmp = rtc->periodic_freq & PF_MASK;
250
251         switch (freq) {
252         case 0:
253                 rtc->periodic_freq = 0x00;
254                 break;
255         case 1:
256                 rtc->periodic_freq = 0x60;
257                 break;
258         case 2:
259                 rtc->periodic_freq = 0x50;
260                 break;
261         case 4:
262                 rtc->periodic_freq = 0x40;
263                 break;
264         case 8:
265                 rtc->periodic_freq = 0x30 | PF_HP;
266                 break;
267         case 16:
268                 rtc->periodic_freq = 0x30;
269                 break;
270         case 32:
271                 rtc->periodic_freq = 0x20 | PF_HP;
272                 break;
273         case 64:
274                 rtc->periodic_freq = 0x20;
275                 break;
276         case 128:
277                 rtc->periodic_freq = 0x10 | PF_HP;
278                 break;
279         case 256:
280                 rtc->periodic_freq = 0x10;
281                 break;
282         default:
283                 ret = -ENOTSUPP;
284         }
285
286         if (ret == 0) {
287                 rtc->periodic_freq |= tmp;
288                 rtc->rtc_dev->irq_freq = freq;
289         }
290
291         spin_unlock_irq(&rtc->lock);
292         return ret;
293 }
294
295 static inline void sh_rtc_setaie(struct device *dev, unsigned int enable)
296 {
297         struct sh_rtc *rtc = dev_get_drvdata(dev);
298         unsigned int tmp;
299
300         spin_lock_irq(&rtc->lock);
301
302         tmp = readb(rtc->regbase + RCR1);
303
304         if (enable)
305                 tmp |= RCR1_AIE;
306         else
307                 tmp &= ~RCR1_AIE;
308
309         writeb(tmp, rtc->regbase + RCR1);
310
311         spin_unlock_irq(&rtc->lock);
312 }
313
314 static int sh_rtc_proc(struct device *dev, struct seq_file *seq)
315 {
316         struct sh_rtc *rtc = dev_get_drvdata(dev);
317         unsigned int tmp;
318
319         tmp = readb(rtc->regbase + RCR1);
320         seq_printf(seq, "carry_IRQ\t: %s\n", (tmp & RCR1_CIE) ? "yes" : "no");
321
322         tmp = readb(rtc->regbase + RCR2);
323         seq_printf(seq, "periodic_IRQ\t: %s\n",
324                    (tmp & RCR2_PESMASK) ? "yes" : "no");
325
326         return 0;
327 }
328
329 static inline void sh_rtc_setcie(struct device *dev, unsigned int enable)
330 {
331         struct sh_rtc *rtc = dev_get_drvdata(dev);
332         unsigned int tmp;
333
334         spin_lock_irq(&rtc->lock);
335
336         tmp = readb(rtc->regbase + RCR1);
337
338         if (!enable)
339                 tmp &= ~RCR1_CIE;
340         else
341                 tmp |= RCR1_CIE;
342
343         writeb(tmp, rtc->regbase + RCR1);
344
345         spin_unlock_irq(&rtc->lock);
346 }
347
348 static int sh_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
349 {
350         struct sh_rtc *rtc = dev_get_drvdata(dev);
351         unsigned int ret = 0;
352
353         switch (cmd) {
354         case RTC_AIE_OFF:
355         case RTC_AIE_ON:
356                 sh_rtc_setaie(dev, cmd == RTC_AIE_ON);
357                 break;
358         case RTC_UIE_OFF:
359                 rtc->periodic_freq &= ~PF_OXS;
360                 sh_rtc_setcie(dev, 0);
361                 break;
362         case RTC_UIE_ON:
363                 rtc->periodic_freq |= PF_OXS;
364                 sh_rtc_setcie(dev, 1);
365                 break;
366         default:
367                 ret = -ENOIOCTLCMD;
368         }
369
370         return ret;
371 }
372
373 static int sh_rtc_read_time(struct device *dev, struct rtc_time *tm)
374 {
375         struct platform_device *pdev = to_platform_device(dev);
376         struct sh_rtc *rtc = platform_get_drvdata(pdev);
377         unsigned int sec128, sec2, yr, yr100, cf_bit;
378
379         do {
380                 unsigned int tmp;
381
382                 spin_lock_irq(&rtc->lock);
383
384                 tmp = readb(rtc->regbase + RCR1);
385                 tmp &= ~RCR1_CF; /* Clear CF-bit */
386                 tmp |= RCR1_CIE;
387                 writeb(tmp, rtc->regbase + RCR1);
388
389                 sec128 = readb(rtc->regbase + R64CNT);
390
391                 tm->tm_sec      = bcd2bin(readb(rtc->regbase + RSECCNT));
392                 tm->tm_min      = bcd2bin(readb(rtc->regbase + RMINCNT));
393                 tm->tm_hour     = bcd2bin(readb(rtc->regbase + RHRCNT));
394                 tm->tm_wday     = bcd2bin(readb(rtc->regbase + RWKCNT));
395                 tm->tm_mday     = bcd2bin(readb(rtc->regbase + RDAYCNT));
396                 tm->tm_mon      = bcd2bin(readb(rtc->regbase + RMONCNT)) - 1;
397
398                 if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
399                         yr  = readw(rtc->regbase + RYRCNT);
400                         yr100 = bcd2bin(yr >> 8);
401                         yr &= 0xff;
402                 } else {
403                         yr  = readb(rtc->regbase + RYRCNT);
404                         yr100 = bcd2bin((yr == 0x99) ? 0x19 : 0x20);
405                 }
406
407                 tm->tm_year = (yr100 * 100 + bcd2bin(yr)) - 1900;
408
409                 sec2 = readb(rtc->regbase + R64CNT);
410                 cf_bit = readb(rtc->regbase + RCR1) & RCR1_CF;
411
412                 spin_unlock_irq(&rtc->lock);
413         } while (cf_bit != 0 || ((sec128 ^ sec2) & RTC_BIT_INVERTED) != 0);
414
415 #if RTC_BIT_INVERTED != 0
416         if ((sec128 & RTC_BIT_INVERTED))
417                 tm->tm_sec--;
418 #endif
419
420         /* only keep the carry interrupt enabled if UIE is on */
421         if (!(rtc->periodic_freq & PF_OXS))
422                 sh_rtc_setcie(dev, 0);
423
424         dev_dbg(dev, "%s: tm is secs=%d, mins=%d, hours=%d, "
425                 "mday=%d, mon=%d, year=%d, wday=%d\n",
426                 __func__,
427                 tm->tm_sec, tm->tm_min, tm->tm_hour,
428                 tm->tm_mday, tm->tm_mon + 1, tm->tm_year, tm->tm_wday);
429
430         return rtc_valid_tm(tm);
431 }
432
433 static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm)
434 {
435         struct platform_device *pdev = to_platform_device(dev);
436         struct sh_rtc *rtc = platform_get_drvdata(pdev);
437         unsigned int tmp;
438         int year;
439
440         spin_lock_irq(&rtc->lock);
441
442         /* Reset pre-scaler & stop RTC */
443         tmp = readb(rtc->regbase + RCR2);
444         tmp |= RCR2_RESET;
445         tmp &= ~RCR2_START;
446         writeb(tmp, rtc->regbase + RCR2);
447
448         writeb(bin2bcd(tm->tm_sec),  rtc->regbase + RSECCNT);
449         writeb(bin2bcd(tm->tm_min),  rtc->regbase + RMINCNT);
450         writeb(bin2bcd(tm->tm_hour), rtc->regbase + RHRCNT);
451         writeb(bin2bcd(tm->tm_wday), rtc->regbase + RWKCNT);
452         writeb(bin2bcd(tm->tm_mday), rtc->regbase + RDAYCNT);
453         writeb(bin2bcd(tm->tm_mon + 1), rtc->regbase + RMONCNT);
454
455         if (rtc->capabilities & RTC_CAP_4_DIGIT_YEAR) {
456                 year = (bin2bcd((tm->tm_year + 1900) / 100) << 8) |
457                         bin2bcd(tm->tm_year % 100);
458                 writew(year, rtc->regbase + RYRCNT);
459         } else {
460                 year = tm->tm_year % 100;
461                 writeb(bin2bcd(year), rtc->regbase + RYRCNT);
462         }
463
464         /* Start RTC */
465         tmp = readb(rtc->regbase + RCR2);
466         tmp &= ~RCR2_RESET;
467         tmp |= RCR2_RTCEN | RCR2_START;
468         writeb(tmp, rtc->regbase + RCR2);
469
470         spin_unlock_irq(&rtc->lock);
471
472         return 0;
473 }
474
475 static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off)
476 {
477         unsigned int byte;
478         int value = 0xff;       /* return 0xff for ignored values */
479
480         byte = readb(rtc->regbase + reg_off);
481         if (byte & AR_ENB) {
482                 byte &= ~AR_ENB;        /* strip the enable bit */
483                 value = bcd2bin(byte);
484         }
485
486         return value;
487 }
488
489 static int sh_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
490 {
491         struct platform_device *pdev = to_platform_device(dev);
492         struct sh_rtc *rtc = platform_get_drvdata(pdev);
493         struct rtc_time *tm = &wkalrm->time;
494
495         spin_lock_irq(&rtc->lock);
496
497         tm->tm_sec      = sh_rtc_read_alarm_value(rtc, RSECAR);
498         tm->tm_min      = sh_rtc_read_alarm_value(rtc, RMINAR);
499         tm->tm_hour     = sh_rtc_read_alarm_value(rtc, RHRAR);
500         tm->tm_wday     = sh_rtc_read_alarm_value(rtc, RWKAR);
501         tm->tm_mday     = sh_rtc_read_alarm_value(rtc, RDAYAR);
502         tm->tm_mon      = sh_rtc_read_alarm_value(rtc, RMONAR);
503         if (tm->tm_mon > 0)
504                 tm->tm_mon -= 1; /* RTC is 1-12, tm_mon is 0-11 */
505         tm->tm_year     = 0xffff;
506
507         wkalrm->enabled = (readb(rtc->regbase + RCR1) & RCR1_AIE) ? 1 : 0;
508
509         spin_unlock_irq(&rtc->lock);
510
511         return 0;
512 }
513
514 static inline void sh_rtc_write_alarm_value(struct sh_rtc *rtc,
515                                             int value, int reg_off)
516 {
517         /* < 0 for a value that is ignored */
518         if (value < 0)
519                 writeb(0, rtc->regbase + reg_off);
520         else
521                 writeb(bin2bcd(value) | AR_ENB,  rtc->regbase + reg_off);
522 }
523
524 static int sh_rtc_check_alarm(struct rtc_time *tm)
525 {
526         /*
527          * The original rtc says anything > 0xc0 is "don't care" or "match
528          * all" - most users use 0xff but rtc-dev uses -1 for the same thing.
529          * The original rtc doesn't support years - some things use -1 and
530          * some 0xffff. We use -1 to make out tests easier.
531          */
532         if (tm->tm_year == 0xffff)
533                 tm->tm_year = -1;
534         if (tm->tm_mon >= 0xff)
535                 tm->tm_mon = -1;
536         if (tm->tm_mday >= 0xff)
537                 tm->tm_mday = -1;
538         if (tm->tm_wday >= 0xff)
539                 tm->tm_wday = -1;
540         if (tm->tm_hour >= 0xff)
541                 tm->tm_hour = -1;
542         if (tm->tm_min >= 0xff)
543                 tm->tm_min = -1;
544         if (tm->tm_sec >= 0xff)
545                 tm->tm_sec = -1;
546
547         if (tm->tm_year > 9999 ||
548                 tm->tm_mon >= 12 ||
549                 tm->tm_mday == 0 || tm->tm_mday >= 32 ||
550                 tm->tm_wday >= 7 ||
551                 tm->tm_hour >= 24 ||
552                 tm->tm_min >= 60 ||
553                 tm->tm_sec >= 60)
554                 return -EINVAL;
555
556         return 0;
557 }
558
559 static int sh_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *wkalrm)
560 {
561         struct platform_device *pdev = to_platform_device(dev);
562         struct sh_rtc *rtc = platform_get_drvdata(pdev);
563         unsigned int rcr1;
564         struct rtc_time *tm = &wkalrm->time;
565         int mon, err;
566
567         err = sh_rtc_check_alarm(tm);
568         if (unlikely(err < 0))
569                 return err;
570
571         spin_lock_irq(&rtc->lock);
572
573         /* disable alarm interrupt and clear the alarm flag */
574         rcr1 = readb(rtc->regbase + RCR1);
575         rcr1 &= ~(RCR1_AF | RCR1_AIE);
576         writeb(rcr1, rtc->regbase + RCR1);
577
578         /* set alarm time */
579         sh_rtc_write_alarm_value(rtc, tm->tm_sec,  RSECAR);
580         sh_rtc_write_alarm_value(rtc, tm->tm_min,  RMINAR);
581         sh_rtc_write_alarm_value(rtc, tm->tm_hour, RHRAR);
582         sh_rtc_write_alarm_value(rtc, tm->tm_wday, RWKAR);
583         sh_rtc_write_alarm_value(rtc, tm->tm_mday, RDAYAR);
584         mon = tm->tm_mon;
585         if (mon >= 0)
586                 mon += 1;
587         sh_rtc_write_alarm_value(rtc, mon, RMONAR);
588
589         if (wkalrm->enabled) {
590                 rcr1 |= RCR1_AIE;
591                 writeb(rcr1, rtc->regbase + RCR1);
592         }
593
594         spin_unlock_irq(&rtc->lock);
595
596         return 0;
597 }
598
599 static struct rtc_class_ops sh_rtc_ops = {
600         .ioctl          = sh_rtc_ioctl,
601         .read_time      = sh_rtc_read_time,
602         .set_time       = sh_rtc_set_time,
603         .read_alarm     = sh_rtc_read_alarm,
604         .set_alarm      = sh_rtc_set_alarm,
605         .irq_set_state  = sh_rtc_irq_set_state,
606         .irq_set_freq   = sh_rtc_irq_set_freq,
607         .proc           = sh_rtc_proc,
608 };
609
610 static int __init sh_rtc_probe(struct platform_device *pdev)
611 {
612         struct sh_rtc *rtc;
613         struct resource *res;
614         struct rtc_time r;
615         char clk_name[6];
616         int clk_id, ret;
617
618         rtc = kzalloc(sizeof(struct sh_rtc), GFP_KERNEL);
619         if (unlikely(!rtc))
620                 return -ENOMEM;
621
622         spin_lock_init(&rtc->lock);
623
624         /* get periodic/carry/alarm irqs */
625         ret = platform_get_irq(pdev, 0);
626         if (unlikely(ret <= 0)) {
627                 ret = -ENOENT;
628                 dev_err(&pdev->dev, "No IRQ resource\n");
629                 goto err_badres;
630         }
631
632         rtc->periodic_irq = ret;
633         rtc->carry_irq = platform_get_irq(pdev, 1);
634         rtc->alarm_irq = platform_get_irq(pdev, 2);
635
636         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
637         if (unlikely(res == NULL)) {
638                 ret = -ENOENT;
639                 dev_err(&pdev->dev, "No IO resource\n");
640                 goto err_badres;
641         }
642
643         rtc->regsize = resource_size(res);
644
645         rtc->res = request_mem_region(res->start, rtc->regsize, pdev->name);
646         if (unlikely(!rtc->res)) {
647                 ret = -EBUSY;
648                 goto err_badres;
649         }
650
651         rtc->regbase = ioremap_nocache(rtc->res->start, rtc->regsize);
652         if (unlikely(!rtc->regbase)) {
653                 ret = -EINVAL;
654                 goto err_badmap;
655         }
656
657         clk_id = pdev->id;
658         /* With a single device, the clock id is still "rtc0" */
659         if (clk_id < 0)
660                 clk_id = 0;
661
662         snprintf(clk_name, sizeof(clk_name), "rtc%d", clk_id);
663
664         rtc->clk = clk_get(&pdev->dev, clk_name);
665         if (IS_ERR(rtc->clk)) {
666                 /*
667                  * No error handling for rtc->clk intentionally, not all
668                  * platforms will have a unique clock for the RTC, and
669                  * the clk API can handle the struct clk pointer being
670                  * NULL.
671                  */
672                 rtc->clk = NULL;
673         }
674
675         clk_enable(rtc->clk);
676
677         rtc->capabilities = RTC_DEF_CAPABILITIES;
678         if (pdev->dev.platform_data) {
679                 struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data;
680
681                 /*
682                  * Some CPUs have special capabilities in addition to the
683                  * default set. Add those in here.
684                  */
685                 rtc->capabilities |= pinfo->capabilities;
686         }
687
688         if (rtc->carry_irq <= 0) {
689                 /* register shared periodic/carry/alarm irq */
690                 ret = request_irq(rtc->periodic_irq, sh_rtc_shared,
691                                   IRQF_DISABLED, "sh-rtc", rtc);
692                 if (unlikely(ret)) {
693                         dev_err(&pdev->dev,
694                                 "request IRQ failed with %d, IRQ %d\n", ret,
695                                 rtc->periodic_irq);
696                         goto err_unmap;
697                 }
698         } else {
699                 /* register periodic/carry/alarm irqs */
700                 ret = request_irq(rtc->periodic_irq, sh_rtc_periodic,
701                                   IRQF_DISABLED, "sh-rtc period", rtc);
702                 if (unlikely(ret)) {
703                         dev_err(&pdev->dev,
704                                 "request period IRQ failed with %d, IRQ %d\n",
705                                 ret, rtc->periodic_irq);
706                         goto err_unmap;
707                 }
708
709                 ret = request_irq(rtc->carry_irq, sh_rtc_interrupt,
710                                   IRQF_DISABLED, "sh-rtc carry", rtc);
711                 if (unlikely(ret)) {
712                         dev_err(&pdev->dev,
713                                 "request carry IRQ failed with %d, IRQ %d\n",
714                                 ret, rtc->carry_irq);
715                         free_irq(rtc->periodic_irq, rtc);
716                         goto err_unmap;
717                 }
718
719                 ret = request_irq(rtc->alarm_irq, sh_rtc_alarm,
720                                   IRQF_DISABLED, "sh-rtc alarm", rtc);
721                 if (unlikely(ret)) {
722                         dev_err(&pdev->dev,
723                                 "request alarm IRQ failed with %d, IRQ %d\n",
724                                 ret, rtc->alarm_irq);
725                         free_irq(rtc->carry_irq, rtc);
726                         free_irq(rtc->periodic_irq, rtc);
727                         goto err_unmap;
728                 }
729         }
730
731         platform_set_drvdata(pdev, rtc);
732
733         /* everything disabled by default */
734         sh_rtc_irq_set_freq(&pdev->dev, 0);
735         sh_rtc_irq_set_state(&pdev->dev, 0);
736         sh_rtc_setaie(&pdev->dev, 0);
737         sh_rtc_setcie(&pdev->dev, 0);
738
739         rtc->rtc_dev = rtc_device_register("sh", &pdev->dev,
740                                            &sh_rtc_ops, THIS_MODULE);
741         if (IS_ERR(rtc->rtc_dev)) {
742                 ret = PTR_ERR(rtc->rtc_dev);
743                 free_irq(rtc->periodic_irq, rtc);
744                 free_irq(rtc->carry_irq, rtc);
745                 free_irq(rtc->alarm_irq, rtc);
746                 goto err_unmap;
747         }
748
749         rtc->rtc_dev->max_user_freq = 256;
750
751         /* reset rtc to epoch 0 if time is invalid */
752         if (rtc_read_time(rtc->rtc_dev, &r) < 0) {
753                 rtc_time_to_tm(0, &r);
754                 rtc_set_time(rtc->rtc_dev, &r);
755         }
756
757         device_init_wakeup(&pdev->dev, 1);
758         return 0;
759
760 err_unmap:
761         clk_disable(rtc->clk);
762         clk_put(rtc->clk);
763         iounmap(rtc->regbase);
764 err_badmap:
765         release_resource(rtc->res);
766 err_badres:
767         kfree(rtc);
768
769         return ret;
770 }
771
772 static int __exit sh_rtc_remove(struct platform_device *pdev)
773 {
774         struct sh_rtc *rtc = platform_get_drvdata(pdev);
775
776         rtc_device_unregister(rtc->rtc_dev);
777         sh_rtc_irq_set_state(&pdev->dev, 0);
778
779         sh_rtc_setaie(&pdev->dev, 0);
780         sh_rtc_setcie(&pdev->dev, 0);
781
782         free_irq(rtc->periodic_irq, rtc);
783
784         if (rtc->carry_irq > 0) {
785                 free_irq(rtc->carry_irq, rtc);
786                 free_irq(rtc->alarm_irq, rtc);
787         }
788
789         iounmap(rtc->regbase);
790         release_resource(rtc->res);
791
792         clk_disable(rtc->clk);
793         clk_put(rtc->clk);
794
795         platform_set_drvdata(pdev, NULL);
796
797         kfree(rtc);
798
799         return 0;
800 }
801
802 static void sh_rtc_set_irq_wake(struct device *dev, int enabled)
803 {
804         struct platform_device *pdev = to_platform_device(dev);
805         struct sh_rtc *rtc = platform_get_drvdata(pdev);
806
807         set_irq_wake(rtc->periodic_irq, enabled);
808
809         if (rtc->carry_irq > 0) {
810                 set_irq_wake(rtc->carry_irq, enabled);
811                 set_irq_wake(rtc->alarm_irq, enabled);
812         }
813 }
814
815 static int sh_rtc_suspend(struct device *dev)
816 {
817         if (device_may_wakeup(dev))
818                 sh_rtc_set_irq_wake(dev, 1);
819
820         return 0;
821 }
822
823 static int sh_rtc_resume(struct device *dev)
824 {
825         if (device_may_wakeup(dev))
826                 sh_rtc_set_irq_wake(dev, 0);
827
828         return 0;
829 }
830
831 static struct dev_pm_ops sh_rtc_dev_pm_ops = {
832         .suspend = sh_rtc_suspend,
833         .resume = sh_rtc_resume,
834 };
835
836 static struct platform_driver sh_rtc_platform_driver = {
837         .driver         = {
838                 .name   = DRV_NAME,
839                 .owner  = THIS_MODULE,
840                 .pm     = &sh_rtc_dev_pm_ops,
841         },
842         .remove         = __exit_p(sh_rtc_remove),
843 };
844
845 static int __init sh_rtc_init(void)
846 {
847         return platform_driver_probe(&sh_rtc_platform_driver, sh_rtc_probe);
848 }
849
850 static void __exit sh_rtc_exit(void)
851 {
852         platform_driver_unregister(&sh_rtc_platform_driver);
853 }
854
855 module_init(sh_rtc_init);
856 module_exit(sh_rtc_exit);
857
858 MODULE_DESCRIPTION("SuperH on-chip RTC driver");
859 MODULE_VERSION(DRV_VERSION);
860 MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>, "
861               "Jamie Lenehan <lenehan@twibble.org>, "
862               "Angelo Castello <angelo.castello@st.com>");
863 MODULE_LICENSE("GPL");
864 MODULE_ALIAS("platform:" DRV_NAME);