]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/rtc/rtc-twl4030.c
137c3ef0c39b416341aef0eb22fd4d7134fc0ec2
[linux-2.6-omap-h63xx.git] / drivers / rtc / rtc-twl4030.c
1 /*
2  * rtc-twl4030.c -- TWL4030 Real Time Clock interface
3  *
4  * Copyright (C) 2007 MontaVista Software, Inc
5  * Author: Alexandre Rusev <source@mvista.com>
6  *
7  * Based on original TI driver twl4030-rtc.c
8  *   Copyright (C) 2006 Texas Instruments, Inc.
9  *
10  * Based on rtc-omap.c
11  *   Copyright (C) 2003 MontaVista Software, Inc.
12  *   Author: George G. Davis <gdavis@mvista.com> or <source@mvista.com>
13  *   Copyright (C) 2006 David Brownell
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version
18  * 2 of the License, or (at your option) any later version.
19  */
20
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/module.h>
24 #include <linux/types.h>
25 #include <linux/rtc.h>
26 #include <linux/bcd.h>
27 #include <linux/platform_device.h>
28 #include <linux/interrupt.h>
29
30 #include <linux/i2c/twl4030.h>
31 #include <linux/i2c/twl4030-rtc.h>
32
33
34 #define ALL_TIME_REGS           6
35
36 /*
37  * Supports 1 byte read from TWL4030 RTC register.
38  */
39 static int twl4030_rtc_read_u8(u8 *data, u8 reg)
40 {
41         int ret;
42
43         ret = twl4030_i2c_read_u8(TWL4030_MODULE_RTC, data, reg);
44         if (ret < 0)
45                 pr_err("twl4030_rtc: Could not read TWL4030"
46                        "register %X - error %d\n", reg, ret);
47         return ret;
48 }
49
50 /*
51  * Supports 1 byte write to TWL4030 RTC registers.
52  */
53 static int twl4030_rtc_write_u8(u8 data, u8 reg)
54 {
55         int ret;
56
57         ret = twl4030_i2c_write_u8(TWL4030_MODULE_RTC, data, reg);
58         if (ret < 0)
59                 pr_err("twl4030_rtc: Could not write TWL4030"
60                        "register %X - error %d\n", reg, ret);
61         return ret;
62 }
63
64 /*
65  * Cache the value for timer/alarm interrupts register; this is
66  * only changed by callers holding rtc ops lock (or resume).
67  */
68 static unsigned char rtc_irq_bits;
69
70 /*
71  * Enable timer and/or alarm interrupts.
72  */
73 static int set_rtc_irq_bit(unsigned char bit)
74 {
75         unsigned char val;
76         int ret;
77
78         val = rtc_irq_bits | bit;
79         ret = twl4030_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
80         if (ret == 0)
81                 rtc_irq_bits = val;
82
83         return ret;
84 }
85
86 /*
87  * Disable timer and/or alarm interrupts.
88  */
89 static int mask_rtc_irq_bit(unsigned char bit)
90 {
91         unsigned char val;
92         int ret;
93
94         val = rtc_irq_bits & ~bit;
95         ret = twl4030_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
96         if (ret == 0)
97                 rtc_irq_bits = val;
98
99         return ret;
100 }
101
102 static inline int twl4030_rtc_alarm_irq_set_state(int enabled)
103 {
104         int ret;
105
106         if (enabled)
107                 ret = set_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
108         else
109                 ret = mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
110
111         return ret;
112 }
113
114 static inline int twl4030_rtc_irq_set_state(int enabled)
115 {
116         int ret;
117
118         if (enabled)
119                 ret = set_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M);
120         else
121                 ret = mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M);
122
123         return ret;
124 }
125
126 /*
127  * Gets current TWL4030 RTC time and date parameters.
128  *
129  * The RTC's time/alarm representation is not what gmtime(3) requires
130  * Linux to use:
131  *
132  *  - Months are 1..12 vs Linux 0-11
133  *  - Years are 0..99 vs Linux 1900..N (we assume 21st century)
134  */
135 static int twl4030_rtc_read_time(struct device *dev, struct rtc_time *tm)
136 {
137         unsigned char rtc_data[ALL_TIME_REGS + 1];
138         int ret;
139         u8 save_control;
140
141         ret = twl4030_rtc_read_u8(&save_control, REG_RTC_CTRL_REG);
142         if (ret < 0)
143                 return ret;
144
145         save_control |= BIT_RTC_CTRL_REG_GET_TIME_M;
146
147         ret = twl4030_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
148         if (ret < 0)
149                 return ret;
150
151         ret = twl4030_i2c_read(TWL4030_MODULE_RTC, rtc_data,
152                                REG_SECONDS_REG, ALL_TIME_REGS);
153
154         if (ret < 0) {
155                 dev_err(dev, "rtc_read_time error %d\n", ret);
156                 return ret;
157         }
158
159         tm->tm_sec = bcd2bin(rtc_data[0]);
160         tm->tm_min = bcd2bin(rtc_data[1]);
161         tm->tm_hour = bcd2bin(rtc_data[2]);
162         tm->tm_mday = bcd2bin(rtc_data[3]);
163         tm->tm_mon = bcd2bin(rtc_data[4]) - 1;
164         tm->tm_year = bcd2bin(rtc_data[5]) + 100;
165
166         return ret;
167 }
168
169 static int twl4030_rtc_set_time(struct device *dev, struct rtc_time *tm)
170 {
171         unsigned char save_control;
172         unsigned char rtc_data[ALL_TIME_REGS + 1];
173         int ret;
174
175         rtc_data[1] = bin2bcd(tm->tm_sec);
176         rtc_data[2] = bin2bcd(tm->tm_min);
177         rtc_data[3] = bin2bcd(tm->tm_hour);
178         rtc_data[4] = bin2bcd(tm->tm_mday);
179         rtc_data[5] = bin2bcd(tm->tm_mon + 1);
180         rtc_data[6] = bin2bcd(tm->tm_year - 100);
181
182         /* Stop RTC while updating the TC registers */
183         ret = twl4030_rtc_read_u8(&save_control, REG_RTC_CTRL_REG);
184         if (ret < 0)
185                 goto out;
186
187         save_control &= ~BIT_RTC_CTRL_REG_STOP_RTC_M;
188         twl4030_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
189         if (ret < 0)
190                 goto out;
191
192         /* update all the time registers in one shot */
193         ret = twl4030_i2c_write(TWL4030_MODULE_RTC, rtc_data,
194                         REG_SECONDS_REG, ALL_TIME_REGS);
195         if (ret < 0) {
196                 dev_err(dev, "rtc_set_time error %d\n", ret);
197                 goto out;
198         }
199
200         /* Start back RTC */
201         save_control |= BIT_RTC_CTRL_REG_STOP_RTC_M;
202         ret = twl4030_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
203
204 out:
205         return ret;
206 }
207
208 /*
209  * Gets current TWL4030 RTC alarm time.
210  */
211 static int twl4030_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
212 {
213         unsigned char rtc_data[ALL_TIME_REGS + 1];
214         int ret;
215
216         ret = twl4030_i2c_read(TWL4030_MODULE_RTC, rtc_data,
217                                REG_ALARM_SECONDS_REG, ALL_TIME_REGS);
218         if (ret < 0) {
219                 dev_err(dev, "rtc_read_alarm error %d\n", ret);
220                 return ret;
221         }
222
223         /* some of these fields may be wildcard/"match all" */
224         alm->time.tm_sec = bcd2bin(rtc_data[0]);
225         alm->time.tm_min = bcd2bin(rtc_data[1]);
226         alm->time.tm_hour = bcd2bin(rtc_data[2]);
227         alm->time.tm_mday = bcd2bin(rtc_data[3]);
228         alm->time.tm_mon = bcd2bin(rtc_data[4]) - 1;
229         alm->time.tm_year = bcd2bin(rtc_data[5]) + 100;
230
231         /* report cached alarm enable state */
232         if (rtc_irq_bits & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M)
233                 alm->enabled = 1;
234
235         return ret;
236 }
237
238 static int twl4030_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
239 {
240         unsigned char alarm_data[ALL_TIME_REGS + 1];
241         int ret;
242
243         ret = twl4030_rtc_alarm_irq_set_state(0);
244         if (ret)
245                 goto out;
246
247         alarm_data[1] = bin2bcd(alm->time.tm_sec);
248         alarm_data[2] = bin2bcd(alm->time.tm_min);
249         alarm_data[3] = bin2bcd(alm->time.tm_hour);
250         alarm_data[4] = bin2bcd(alm->time.tm_mday);
251         alarm_data[5] = bin2bcd(alm->time.tm_mon + 1);
252         alarm_data[6] = bin2bcd(alm->time.tm_year - 100);
253
254         /* update all the alarm registers in one shot */
255         ret = twl4030_i2c_write(TWL4030_MODULE_RTC, alarm_data,
256                         REG_ALARM_SECONDS_REG, ALL_TIME_REGS);
257         if (ret) {
258                 dev_err(dev, "rtc_set_alarm error %d\n", ret);
259                 goto out;
260         }
261
262         if (alm->enabled)
263                 ret = twl4030_rtc_alarm_irq_set_state(1);
264 out:
265         return ret;
266 }
267
268 #ifdef  CONFIG_RTC_INTF_DEV
269
270 static int twl4030_rtc_ioctl(struct device *dev, unsigned int cmd,
271                              unsigned long arg)
272 {
273         switch (cmd) {
274         case RTC_AIE_OFF:
275                 return twl4030_rtc_alarm_irq_set_state(0);
276         case RTC_AIE_ON:
277                 return twl4030_rtc_alarm_irq_set_state(1);
278         case RTC_UIE_OFF:
279                 return twl4030_rtc_irq_set_state(0);
280         case RTC_UIE_ON:
281                 return twl4030_rtc_irq_set_state(1);
282
283         default:
284                 return -ENOIOCTLCMD;
285         }
286 }
287
288 #else
289 #define omap_rtc_ioctl  NULL
290 #endif
291
292 static irqreturn_t twl4030_rtc_interrupt(int irq, void *rtc)
293 {
294         unsigned long events = 0;
295         int ret = IRQ_NONE;
296         int res;
297         u8 rd_reg;
298
299         res = twl4030_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
300         if (res)
301                 goto out;
302         /*
303          * Figure out source of interrupt: ALARM or TIMER in RTC_STATUS_REG.
304          * only one (ALARM or RTC) interrupt source may be enabled
305          * at time, we also could check our results
306          * by reading RTS_INTERRUPTS_REGISTER[IT_TIMER,IT_ALARM]
307          */
308         if (rd_reg & BIT_RTC_STATUS_REG_ALARM_M)
309                 events |= RTC_IRQF | RTC_AF;
310         else
311                 events |= RTC_IRQF | RTC_UF;
312
313         res = twl4030_rtc_write_u8(rd_reg | BIT_RTC_STATUS_REG_ALARM_M,
314                                    REG_RTC_STATUS_REG);
315         if (res)
316                 goto out;
317
318         /* Clear on Read enabled. RTC_IT bit of REG_PWR_ISR1 needs
319          * 2 reads to clear the interrupt. One read is done in
320          * do_twl4030_pwrirq(). Doing the second read, to clear
321          * the bit.
322          */
323         res = twl4030_i2c_read_u8(TWL4030_MODULE_INT, &rd_reg, REG_PWR_ISR1);
324         if (res)
325                 goto out;
326
327         /* Notify RTC core on event */
328         rtc_update_irq(rtc, 1, events);
329
330         ret = IRQ_HANDLED;
331 out:
332         return ret;
333 }
334
335 static struct rtc_class_ops twl4030_rtc_ops = {
336         .ioctl          = twl4030_rtc_ioctl,
337         .read_time      = twl4030_rtc_read_time,
338         .set_time       = twl4030_rtc_set_time,
339         .read_alarm     = twl4030_rtc_read_alarm,
340         .set_alarm      = twl4030_rtc_set_alarm,
341 };
342
343 static int __devinit twl4030_rtc_probe(struct platform_device *pdev)
344 {
345         struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
346         struct rtc_device *rtc;
347         int ret = 0;
348         int irq = platform_get_irq(pdev, 0);
349         u8 rd_reg;
350
351         if (irq < 0)
352                 return irq;
353
354         if (pdata != NULL && pdata->init != NULL) {
355                 ret = pdata->init();
356                 if (ret < 0)
357                         goto out;
358         }
359
360         rtc = rtc_device_register(pdev->name,
361                                   &pdev->dev, &twl4030_rtc_ops, THIS_MODULE);
362         if (IS_ERR(rtc)) {
363                 ret = -EINVAL;
364                 dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
365                         PTR_ERR(rtc));
366                 goto out0;
367
368         }
369
370         platform_set_drvdata(pdev, rtc);
371
372         ret = twl4030_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
373
374         if (ret < 0)
375                 goto out1;
376
377         if (rd_reg & BIT_RTC_STATUS_REG_POWER_UP_M)
378                 dev_warn(&pdev->dev, "Power up reset detected.\n");
379
380         if (rd_reg & BIT_RTC_STATUS_REG_ALARM_M)
381                 dev_warn(&pdev->dev, "Pending Alarm interrupt detected.\n");
382
383         /* Clear RTC Power up reset and pending alarm interrupts */
384         ret = twl4030_rtc_write_u8(rd_reg, REG_RTC_STATUS_REG);
385         if (ret < 0)
386                 goto out1;
387
388         ret = request_irq(irq, twl4030_rtc_interrupt,
389                                 0, rtc->dev.bus_id, rtc);
390         if (ret < 0) {
391                 dev_err(&pdev->dev, "IRQ is not free.\n");
392                 goto out1;
393         }
394
395         /* Check RTC module status, Enable if it is off */
396         ret = twl4030_rtc_read_u8(&rd_reg, REG_RTC_CTRL_REG);
397         if (ret < 0)
398                 goto out2;
399
400         if (!(rd_reg & BIT_RTC_CTRL_REG_STOP_RTC_M)) {
401                 dev_info(&pdev->dev, "Enabling TWL4030-RTC.\n");
402                 rd_reg = BIT_RTC_CTRL_REG_STOP_RTC_M;
403                 ret = twl4030_rtc_write_u8(rd_reg, REG_RTC_CTRL_REG);
404                 if (ret < 0)
405                         goto out2;
406         }
407
408         ret = twl4030_i2c_read_u8(TWL4030_MODULE_INT, &rd_reg, REG_PWR_IMR1);
409         if (ret < 0)
410                 goto out2;
411
412         rd_reg &= PWR_RTC_IT_UNMASK;
413         /* MASK PWR - we will need this */
414         ret = twl4030_i2c_write_u8(TWL4030_MODULE_INT, rd_reg, REG_PWR_IMR1);
415         if (ret < 0)
416                 goto out2;
417
418         ret = twl4030_i2c_read_u8(TWL4030_MODULE_INT, &rd_reg, REG_PWR_EDR1);
419         if (ret < 0)
420                 goto out2;
421
422         /* Rising edge detection enabled, needed for RTC alarm */
423         rd_reg |= 0x80;
424         ret = twl4030_i2c_write_u8(TWL4030_MODULE_INT, rd_reg, REG_PWR_EDR1);
425         if (ret < 0)
426                 goto out2;
427
428         /* init cached IRQ enable bits */
429         ret = twl4030_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG);
430         if (ret < 0)
431                 goto out2;
432
433         return ret;
434
435
436 out2:
437         free_irq(irq, rtc);
438 out1:
439         rtc_device_unregister(rtc);
440 out0:
441         if (pdata != NULL && pdata->exit != NULL)
442                 pdata->exit();
443 out:
444         return ret;
445 }
446
447 /*
448  * Disable all TWL4030 RTC module interrupts.
449  * Sets status flag to free.
450  */
451 static int __devexit twl4030_rtc_remove(struct platform_device *pdev)
452 {
453         /* leave rtc running, but disable irqs */
454         struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
455         struct rtc_device *rtc = platform_get_drvdata(pdev);
456         int irq = platform_get_irq(pdev, 0);
457
458         mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
459         mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M);
460
461         free_irq(irq, rtc);
462
463         if (pdata != NULL && pdata->exit != NULL)
464                 pdata->exit();
465
466         rtc_device_unregister(rtc);
467         platform_set_drvdata(pdev, NULL);
468         return 0;
469 }
470
471 static void twl4030_rtc_shutdown(struct platform_device *pdev)
472 {
473         mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M |
474                          BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
475 }
476
477 #ifdef CONFIG_PM
478
479 static unsigned char irqstat;
480
481 static int twl4030_rtc_suspend(struct platform_device *pdev, pm_message_t state)
482 {
483         irqstat = rtc_irq_bits;
484
485         /* REVISIT alarm may need to wake us from sleep */
486         mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M |
487                          BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
488         return 0;
489 }
490
491 static int twl4030_rtc_resume(struct platform_device *pdev)
492 {
493         set_rtc_irq_bit(irqstat);
494         return 0;
495 }
496
497 #else
498 #define twl4030_rtc_suspend NULL
499 #define twl4030_rtc_resume  NULL
500 #endif
501
502 MODULE_ALIAS("platform:twl4030_rtc");
503
504 static struct platform_driver twl4030rtc_driver = {
505         .probe          = twl4030_rtc_probe,
506         .remove         = __devexit_p(twl4030_rtc_remove),
507         .shutdown       = twl4030_rtc_shutdown,
508         .suspend        = twl4030_rtc_suspend,
509         .resume         = twl4030_rtc_resume,
510         .driver         = {
511                 .owner  = THIS_MODULE,
512                 .name   = "twl4030_rtc",
513         },
514 };
515
516 static int __init twl4030_rtc_init(void)
517 {
518         return platform_driver_register(&twl4030rtc_driver);
519 }
520 module_init(twl4030_rtc_init);
521
522 static void __exit twl4030_rtc_exit(void)
523 {
524         platform_driver_unregister(&twl4030rtc_driver);
525 }
526 module_exit(twl4030_rtc_exit);
527
528 MODULE_AUTHOR("Texas Instruments, MontaVista Software");
529 MODULE_LICENSE("GPL");