2 * drivers/rtc/rtc-twl4030.c
4 * TWL4030 Real Time Clock interface
6 * Copyright (C) 2007 MontaVista Software, Inc
7 * Author: Alexandre Rusev <source@mvista.com>
9 * Based on original TI driver twl4030-rtc.c
10 * Copyright (C) 2006 Texas Instruments, Inc.
13 * Copyright (C) 2003 MontaVista Software, Inc.
14 * Author: George G. Davis <gdavis@mvista.com> or <source@mvista.com>
16 * Copyright (C) 2006 David Brownell
18 * This program is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU General Public License
20 * as published by the Free Software Foundation; either version
21 * 2 of the License, or (at your option) any later version.
25 #include <linux/kernel.h>
26 #include <linux/init.h>
27 #include <linux/module.h>
28 #include <linux/ioport.h>
29 #include <linux/delay.h>
30 #include <linux/types.h>
31 #include <linux/rtc.h>
32 #include <linux/bcd.h>
33 #include <linux/platform_device.h>
34 #include <linux/spinlock.h>
35 #include <linux/interrupt.h>
36 #include <linux/device.h>
37 #include <linux/i2c/twl4030.h>
38 #include <linux/i2c/twl4030-rtc.h>
41 #include <asm/mach/time.h>
42 #include <asm/system.h>
43 #include <asm/hardware.h>
46 #define ALL_TIME_REGS 6
49 * If this driver ever becomes modularised, it will be really nice
50 * to make the epoch retain its value across module reload...
52 static int epoch = 1900; /* year corresponding to 0x00 */
55 * Supports 1 byte read from TWL4030 RTC register.
57 static int twl4030_rtc_read_u8(u8 * data, u8 reg)
61 ret = twl4030_i2c_read_u8(TWL4030_MODULE_RTC, data, reg);
63 printk(KERN_WARNING "twl4030_rtc: Could not read TWL4030"
64 "register %X - returned %d[%x]\n", reg, ret, ret);
70 * Supports 1 byte write to TWL4030 RTC registers.
72 static int twl4030_rtc_write_u8(u8 data, u8 reg)
76 ret = twl4030_i2c_write_u8(TWL4030_MODULE_RTC, data, reg);
78 printk(KERN_WARNING "twl4030_rtc: Could not write TWL4030"
79 "register %X - returned %d[%x]\n", reg, ret, ret);
85 * Enables timer or alarm interrupts.
87 static int set_rtc_irq_bit(unsigned char bit)
92 ret = twl4030_rtc_read_u8(&val, REG_RTC_INTERRUPTS_REG);
97 ret = twl4030_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
105 * Read timer or alarm interrupts register.
107 static int get_rtc_irq_bit(unsigned char *val)
111 ret = twl4030_rtc_read_u8(val, REG_RTC_INTERRUPTS_REG);
116 * Disables timer or alarm interrupts.
118 static int mask_rtc_irq_bit(unsigned char bit)
123 ret = twl4030_rtc_read_u8(&val, REG_RTC_INTERRUPTS_REG);
128 ret = twl4030_rtc_write_u8(val, REG_RTC_INTERRUPTS_REG);
134 static int twl4030_rtc_alarm_irq_set_state(struct device *dev, int enabled)
138 /* Allow ints for RTC ALARM updates. */
140 ret = set_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
142 ret = mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
148 * Gets current TWL4030 RTC time and date parameters.
150 static int get_rtc_time(struct rtc_time *rtc_tm)
152 unsigned char rtc_data[ALL_TIME_REGS + 1];
156 ret = twl4030_rtc_read_u8(&save_control, REG_RTC_CTRL_REG);
160 save_control |= BIT_RTC_CTRL_REG_GET_TIME_M;
162 ret = twl4030_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
166 ret = twl4030_i2c_read(TWL4030_MODULE_RTC, rtc_data,
167 REG_SECONDS_REG, ALL_TIME_REGS);
170 printk(KERN_ERR "twl4030_rtc: twl4030_i2c_read error.\n");
174 rtc_tm->tm_sec = BCD2BIN(rtc_data[0]);
175 rtc_tm->tm_min = BCD2BIN(rtc_data[1]);
176 rtc_tm->tm_hour = BCD2BIN(rtc_data[2]);
177 rtc_tm->tm_mday = BCD2BIN(rtc_data[3]);
178 rtc_tm->tm_mon = BCD2BIN(rtc_data[4]);
179 rtc_tm->tm_year = BCD2BIN(rtc_data[5]);
182 * Account for differences between how the RTC uses the values
183 * and how they are defined in a struct rtc_time;
185 if ((rtc_tm->tm_year += (epoch - 1900)) <= 69)
186 rtc_tm->tm_year += 100;
193 static int twl4030_rtc_set_time(struct device *dev, struct rtc_time *tm)
195 unsigned char save_control;
196 unsigned char rtc_data[ALL_TIME_REGS + 1];
199 /* Month range is 01..12 */
202 rtc_data[1] = BIN2BCD(tm->tm_sec);
203 rtc_data[2] = BIN2BCD(tm->tm_min);
204 rtc_data[3] = BIN2BCD(tm->tm_hour);
205 rtc_data[4] = BIN2BCD(tm->tm_mday);
206 rtc_data[5] = BIN2BCD(tm->tm_mon);
207 rtc_data[6] = BIN2BCD(tm->tm_year);
209 /* Stop RTC while updating the TC registers */
210 ret = twl4030_rtc_read_u8(&save_control, REG_RTC_CTRL_REG);
214 save_control &= ~BIT_RTC_CTRL_REG_STOP_RTC_M;
215 twl4030_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
219 /* update all the alarm registers in one shot */
220 ret = twl4030_i2c_write(TWL4030_MODULE_RTC, rtc_data,
221 REG_SECONDS_REG, ALL_TIME_REGS);
223 printk(KERN_ERR "twl4030: twl4030_i2c_write error.\n");
228 save_control |= BIT_RTC_CTRL_REG_STOP_RTC_M;
229 ret = twl4030_rtc_write_u8(save_control, REG_RTC_CTRL_REG);
236 * Gets current TWL4030 RTC alarm time.
238 static int get_rtc_alm_time(struct rtc_time *alm_tm)
240 unsigned char rtc_data[ALL_TIME_REGS + 1];
243 ret = twl4030_i2c_read(TWL4030_MODULE_RTC, rtc_data,
244 REG_ALARM_SECONDS_REG, ALL_TIME_REGS);
246 printk(KERN_ERR "twl4030_rtc: twl4030_i2c_read error.\n");
250 alm_tm->tm_sec = BCD2BIN(rtc_data[0]);
251 alm_tm->tm_min = BCD2BIN(rtc_data[1]);
252 alm_tm->tm_hour = BCD2BIN(rtc_data[2]);
253 alm_tm->tm_mday = BCD2BIN(rtc_data[3]);
254 alm_tm->tm_mon = BCD2BIN(rtc_data[4]);
255 alm_tm->tm_year = BCD2BIN(rtc_data[5]);
258 * Account for differences between how the RTC uses the values
259 * and how they are defined in a struct rtc_time;
261 if ((alm_tm->tm_year += (epoch - 1900)) <= 69)
262 alm_tm->tm_year += 100;
269 static int twl4030_rtc_read_time(struct device *dev, struct rtc_time *tm)
273 memset(tm, 0, sizeof(struct rtc_time));
274 ret = get_rtc_time(tm);
280 * Gets current TWL4030 RTC alarm time.
282 static int twl4030_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
285 u8 rtc_interrupts_reg = 0;
288 * This returns a struct rtc_time. Reading >= 0xc0
289 * means "don't care" or "match all". Only the tm_hour,
290 * tm_min, and tm_sec values are filled in.
292 memset(&alm->time, 0, sizeof(struct rtc_time));
293 ret = get_rtc_alm_time(&alm->time);
298 /* Check alarm enabled flag state */
300 ret | twl4030_i2c_read_u8(TWL4030_MODULE_RTC, &rtc_interrupts_reg,
301 REG_RTC_INTERRUPTS_REG);
306 if ((rtc_interrupts_reg & BIT_RTC_INTERRUPTS_REG_IT_ALARM_M) != 0)
315 static int twl4030_rtc_irq_set_state(struct device *dev, int enabled)
319 /* Allow ints for RTC updates. */
321 ret = set_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M);
323 ret = mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M);
328 static int twl4030_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
330 unsigned char alarm_data[ALL_TIME_REGS + 1];
333 /* Month range is 01..12 */
336 alarm_data[1] = BIN2BCD(alm->time.tm_sec);
337 alarm_data[2] = BIN2BCD(alm->time.tm_min);
338 alarm_data[3] = BIN2BCD(alm->time.tm_hour);
339 alarm_data[4] = BIN2BCD(alm->time.tm_mday);
340 alarm_data[5] = BIN2BCD(alm->time.tm_mon);
341 alarm_data[6] = BIN2BCD(alm->time.tm_year);
343 /* update all the alarm registers in one shot */
344 ret = twl4030_i2c_write(TWL4030_MODULE_RTC, alarm_data,
345 REG_ALARM_SECONDS_REG, ALL_TIME_REGS);
347 printk(KERN_ERR "twl4030: twl4030_i2c_write error.\n");
351 ret = twl4030_rtc_alarm_irq_set_state(dev, alm->enabled);
357 * We will just handle setting the frequency and make use the framework for
358 * reading the periodic interupts.
359 * @freq: Current periodic IRQ freq
361 static int twl4030_rtc_irq_set_freq(struct device *dev, int freq)
363 struct rtc_device *rtc = dev_get_drvdata(dev);
365 if (freq < 0 || freq > 3)
368 rtc->irq_freq = freq;
370 /* set rtc irq freq to user defined value */
371 set_rtc_irq_bit(freq);
376 #ifdef CONFIG_RTC_INTF_DEV
378 static int twl4030_rtc_ioctl(struct device *dev, unsigned int cmd,
384 return twl4030_rtc_alarm_irq_set_state(dev, 0);
386 return twl4030_rtc_alarm_irq_set_state(dev, 1);
391 /* Mask ints from RTC updates. */
392 return twl4030_rtc_irq_set_state(dev, 0);
396 /* Allow ints for RTC updates. */
397 return twl4030_rtc_irq_set_state(dev, 1);
400 return put_user(epoch, (unsigned long *)arg);
403 * There were no RTC clocks before 1900.
408 if (!capable(CAP_SYS_TIME))
419 #define omap_rtc_ioctl NULL
422 static irqreturn_t twl4030_rtc_interrupt(int irq, void *rtc)
424 unsigned long events = 0;
429 /* clear the RTC interrupt in TWL4030 power module */
430 res = twl4030_i2c_read_u8(TWL4030_MODULE_INT, &rd_reg, REG_PWR_ISR1);
434 /* Check if interrupt is sourced by RTC */
435 if (!(rd_reg & PWR_RTC_INT_CLR))
438 res = twl4030_i2c_write_u8(TWL4030_MODULE_INT, PWR_RTC_INT_CLR, REG_PWR_ISR1);
442 res = twl4030_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
446 * Figure out source of interrupt: ALARM or TIMER in RTC_STATUS_REG.
447 * only one (ALARM or RTC) interrupt source may be enabled
448 * at time, we also could check our results
449 * by reading RTS_INTERRUPTS_REGISTER[IT_TIMER,IT_ALARM]
451 if (rd_reg & BIT_RTC_STATUS_REG_ALARM_M)
452 events |= RTC_IRQF | RTC_AF;
454 events |= RTC_IRQF | RTC_UF;
456 res = twl4030_rtc_write_u8(rd_reg | BIT_RTC_STATUS_REG_ALARM_M,
461 * Workaround for strange behaviour with T2. Need to write into ISR
462 * register one more time to clear the interrupt. Otherwise, the same
463 * RTC event generates 2 interrupts in a row.
464 * (no errata document available)
466 res = twl4030_i2c_write_u8(TWL4030_MODULE_INT, PWR_RTC_INT_CLR, REG_PWR_ISR1);
470 /* Notify RTC core on event */
471 rtc_update_irq(rtc, 1, events);
478 static struct rtc_class_ops twl4030_rtc_ops = {
479 .ioctl = twl4030_rtc_ioctl,
480 .read_time = twl4030_rtc_read_time,
481 .set_time = twl4030_rtc_set_time,
482 .read_alarm = twl4030_rtc_read_alarm,
483 .set_alarm = twl4030_rtc_set_alarm,
484 .irq_set_freq = twl4030_rtc_irq_set_freq,
487 static int __devinit twl4030_rtc_probe(struct platform_device *pdev)
489 struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
490 struct rtc_device *rtc;
494 if (pdata != NULL && pdata->init != NULL) {
500 rtc = rtc_device_register(pdev->name,
501 &pdev->dev, &twl4030_rtc_ops, THIS_MODULE);
504 dev_err(&pdev->dev, "can't register RTC device, err %ld\n",
510 /* Set the irq freq to every second */
513 platform_set_drvdata(pdev, rtc);
515 ret = twl4030_rtc_read_u8(&rd_reg, REG_RTC_STATUS_REG);
520 if (rd_reg & BIT_RTC_STATUS_REG_POWER_UP_M)
521 dev_warn(&pdev->dev, "Power up reset detected.\n");
523 if (rd_reg & BIT_RTC_STATUS_REG_ALARM_M)
524 dev_warn(&pdev->dev, "Pending Alarm interrupt detected.\n");
526 /* Clear RTC Power up reset and pending alarm interrupts */
527 ret = twl4030_rtc_write_u8(rd_reg, REG_RTC_STATUS_REG);
531 ret = request_irq(TWL4030_MODIRQ_PWR, twl4030_rtc_interrupt,
532 IRQF_DISABLED | IRQF_SHARED, rtc->dev.bus_id, rtc);
534 dev_err(&pdev->dev, "IRQ is not free.\n");
538 /* Check RTC module status, Enable if it is off */
539 ret = twl4030_rtc_read_u8(&rd_reg, REG_RTC_CTRL_REG);
543 if (!(rd_reg & BIT_RTC_CTRL_REG_STOP_RTC_M)) {
544 dev_info(&pdev->dev, "Enabling TWL4030-RTC.\n");
545 rd_reg = BIT_RTC_CTRL_REG_STOP_RTC_M;
546 ret = twl4030_rtc_write_u8(rd_reg, REG_RTC_CTRL_REG);
551 ret = twl4030_i2c_read_u8(TWL4030_MODULE_INT, &rd_reg, REG_PWR_IMR1);
555 rd_reg &= PWR_RTC_IT_UNMASK;
556 /* MASK PWR - we will need this */
557 ret = twl4030_i2c_write_u8(TWL4030_MODULE_INT, rd_reg, REG_PWR_IMR1);
561 ret = twl4030_i2c_read_u8(TWL4030_MODULE_INT, &rd_reg, REG_PWR_EDR1);
565 /* Rising edge detection enabled, needed for RTC alarm */
567 ret = twl4030_i2c_write_u8(TWL4030_MODULE_INT, rd_reg, REG_PWR_EDR1);
575 free_irq(TWL4030_MODIRQ_PWR, rtc);
577 rtc_device_unregister(rtc);
579 if (pdata != NULL && pdata->exit != NULL)
586 * Disable all TWL4030 RTC module interrupts.
587 * Sets status flag to free.
589 static int __devexit twl4030_rtc_remove(struct platform_device *pdev)
591 /* leave rtc running, but disable irqs */
592 struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
593 struct rtc_device *rtc = platform_get_drvdata(pdev);
595 mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
596 mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M);
598 free_irq(TWL4030_MODIRQ_PWR, rtc);
600 if (pdata != NULL && pdata->exit != NULL)
603 rtc_device_unregister(rtc);
604 platform_set_drvdata(pdev, NULL);
608 static void twl4030_rtc_shutdown(struct platform_device *pdev)
610 twl4030_rtc_alarm_irq_set_state(&pdev->dev, 0);
611 twl4030_rtc_irq_set_state(&pdev->dev, 0);
616 static unsigned char irqstat = 0;
618 static int twl4030_rtc_suspend(struct platform_device *pdev, pm_message_t state)
620 get_rtc_irq_bit(&irqstat);
622 mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M |
623 BIT_RTC_INTERRUPTS_REG_IT_ALARM_M);
627 static int twl4030_rtc_resume(struct platform_device *pdev)
629 set_rtc_irq_bit(irqstat);
633 #define twl4030_rtc_suspend NULL
634 #define twl4030_rtc_resume NULL
637 MODULE_ALIAS("twl4030_rtc");
638 static struct platform_driver twl4030rtc_driver = {
639 .probe = twl4030_rtc_probe,
640 .remove = __devexit_p(twl4030_rtc_remove),
641 .shutdown = twl4030_rtc_shutdown,
642 .suspend = twl4030_rtc_suspend,
643 .resume = twl4030_rtc_resume,
645 .owner = THIS_MODULE,
646 .name = "twl4030_rtc",
650 static int __init twl4030_rtc_init(void)
652 return platform_driver_register(&twl4030rtc_driver);
655 static void __exit twl4030_rtc_exit(void)
657 platform_driver_unregister(&twl4030rtc_driver);
660 MODULE_AUTHOR("Texas Instruments, MontaVista Software");
661 MODULE_LICENSE("GPL");;
663 module_init(twl4030_rtc_init);
664 module_exit(twl4030_rtc_exit);