diff options
Diffstat (limited to 'drivers/rtc/rtc-twl.c')
-rw-r--r-- | drivers/rtc/rtc-twl.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index 9277d945bf48..8bc6c80b184c 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/bcd.h> | 27 | #include <linux/bcd.h> |
28 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
29 | #include <linux/interrupt.h> | 29 | #include <linux/interrupt.h> |
30 | #include <linux/of.h> | ||
30 | 31 | ||
31 | #include <linux/i2c/twl.h> | 32 | #include <linux/i2c/twl.h> |
32 | 33 | ||
@@ -233,7 +234,7 @@ static int twl_rtc_alarm_irq_enable(struct device *dev, unsigned enabled) | |||
233 | */ | 234 | */ |
234 | static int twl_rtc_read_time(struct device *dev, struct rtc_time *tm) | 235 | static int twl_rtc_read_time(struct device *dev, struct rtc_time *tm) |
235 | { | 236 | { |
236 | unsigned char rtc_data[ALL_TIME_REGS + 1]; | 237 | unsigned char rtc_data[ALL_TIME_REGS]; |
237 | int ret; | 238 | int ret; |
238 | u8 save_control; | 239 | u8 save_control; |
239 | u8 rtc_control; | 240 | u8 rtc_control; |
@@ -300,15 +301,15 @@ static int twl_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
300 | static int twl_rtc_set_time(struct device *dev, struct rtc_time *tm) | 301 | static int twl_rtc_set_time(struct device *dev, struct rtc_time *tm) |
301 | { | 302 | { |
302 | unsigned char save_control; | 303 | unsigned char save_control; |
303 | unsigned char rtc_data[ALL_TIME_REGS + 1]; | 304 | unsigned char rtc_data[ALL_TIME_REGS]; |
304 | int ret; | 305 | int ret; |
305 | 306 | ||
306 | rtc_data[1] = bin2bcd(tm->tm_sec); | 307 | rtc_data[0] = bin2bcd(tm->tm_sec); |
307 | rtc_data[2] = bin2bcd(tm->tm_min); | 308 | rtc_data[1] = bin2bcd(tm->tm_min); |
308 | rtc_data[3] = bin2bcd(tm->tm_hour); | 309 | rtc_data[2] = bin2bcd(tm->tm_hour); |
309 | rtc_data[4] = bin2bcd(tm->tm_mday); | 310 | rtc_data[3] = bin2bcd(tm->tm_mday); |
310 | rtc_data[5] = bin2bcd(tm->tm_mon + 1); | 311 | rtc_data[4] = bin2bcd(tm->tm_mon + 1); |
311 | rtc_data[6] = bin2bcd(tm->tm_year - 100); | 312 | rtc_data[5] = bin2bcd(tm->tm_year - 100); |
312 | 313 | ||
313 | /* Stop RTC while updating the TC registers */ | 314 | /* Stop RTC while updating the TC registers */ |
314 | ret = twl_rtc_read_u8(&save_control, REG_RTC_CTRL_REG); | 315 | ret = twl_rtc_read_u8(&save_control, REG_RTC_CTRL_REG); |
@@ -341,7 +342,7 @@ out: | |||
341 | */ | 342 | */ |
342 | static int twl_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) | 343 | static int twl_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) |
343 | { | 344 | { |
344 | unsigned char rtc_data[ALL_TIME_REGS + 1]; | 345 | unsigned char rtc_data[ALL_TIME_REGS]; |
345 | int ret; | 346 | int ret; |
346 | 347 | ||
347 | ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data, | 348 | ret = twl_i2c_read(TWL_MODULE_RTC, rtc_data, |
@@ -368,19 +369,19 @@ static int twl_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm) | |||
368 | 369 | ||
369 | static int twl_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | 370 | static int twl_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) |
370 | { | 371 | { |
371 | unsigned char alarm_data[ALL_TIME_REGS + 1]; | 372 | unsigned char alarm_data[ALL_TIME_REGS]; |
372 | int ret; | 373 | int ret; |
373 | 374 | ||
374 | ret = twl_rtc_alarm_irq_enable(dev, 0); | 375 | ret = twl_rtc_alarm_irq_enable(dev, 0); |
375 | if (ret) | 376 | if (ret) |
376 | goto out; | 377 | goto out; |
377 | 378 | ||
378 | alarm_data[1] = bin2bcd(alm->time.tm_sec); | 379 | alarm_data[0] = bin2bcd(alm->time.tm_sec); |
379 | alarm_data[2] = bin2bcd(alm->time.tm_min); | 380 | alarm_data[1] = bin2bcd(alm->time.tm_min); |
380 | alarm_data[3] = bin2bcd(alm->time.tm_hour); | 381 | alarm_data[2] = bin2bcd(alm->time.tm_hour); |
381 | alarm_data[4] = bin2bcd(alm->time.tm_mday); | 382 | alarm_data[3] = bin2bcd(alm->time.tm_mday); |
382 | alarm_data[5] = bin2bcd(alm->time.tm_mon + 1); | 383 | alarm_data[4] = bin2bcd(alm->time.tm_mon + 1); |
383 | alarm_data[6] = bin2bcd(alm->time.tm_year - 100); | 384 | alarm_data[5] = bin2bcd(alm->time.tm_year - 100); |
384 | 385 | ||
385 | /* update all the alarm registers in one shot */ | 386 | /* update all the alarm registers in one shot */ |
386 | ret = twl_i2c_write(TWL_MODULE_RTC, alarm_data, | 387 | ret = twl_i2c_write(TWL_MODULE_RTC, alarm_data, |
@@ -458,7 +459,7 @@ static struct rtc_class_ops twl_rtc_ops = { | |||
458 | 459 | ||
459 | /*----------------------------------------------------------------------*/ | 460 | /*----------------------------------------------------------------------*/ |
460 | 461 | ||
461 | static int __devinit twl_rtc_probe(struct platform_device *pdev) | 462 | static int twl_rtc_probe(struct platform_device *pdev) |
462 | { | 463 | { |
463 | struct rtc_device *rtc; | 464 | struct rtc_device *rtc; |
464 | int ret = -EINVAL; | 465 | int ret = -EINVAL; |
@@ -535,7 +536,7 @@ out1: | |||
535 | * Disable all TWL RTC module interrupts. | 536 | * Disable all TWL RTC module interrupts. |
536 | * Sets status flag to free. | 537 | * Sets status flag to free. |
537 | */ | 538 | */ |
538 | static int __devexit twl_rtc_remove(struct platform_device *pdev) | 539 | static int twl_rtc_remove(struct platform_device *pdev) |
539 | { | 540 | { |
540 | /* leave rtc running, but disable irqs */ | 541 | /* leave rtc running, but disable irqs */ |
541 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 542 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
@@ -588,23 +589,26 @@ static int twl_rtc_resume(struct platform_device *pdev) | |||
588 | #define twl_rtc_resume NULL | 589 | #define twl_rtc_resume NULL |
589 | #endif | 590 | #endif |
590 | 591 | ||
592 | #ifdef CONFIG_OF | ||
591 | static const struct of_device_id twl_rtc_of_match[] = { | 593 | static const struct of_device_id twl_rtc_of_match[] = { |
592 | {.compatible = "ti,twl4030-rtc", }, | 594 | {.compatible = "ti,twl4030-rtc", }, |
593 | { }, | 595 | { }, |
594 | }; | 596 | }; |
595 | MODULE_DEVICE_TABLE(of, twl_rtc_of_match); | 597 | MODULE_DEVICE_TABLE(of, twl_rtc_of_match); |
598 | #endif | ||
599 | |||
596 | MODULE_ALIAS("platform:twl_rtc"); | 600 | MODULE_ALIAS("platform:twl_rtc"); |
597 | 601 | ||
598 | static struct platform_driver twl4030rtc_driver = { | 602 | static struct platform_driver twl4030rtc_driver = { |
599 | .probe = twl_rtc_probe, | 603 | .probe = twl_rtc_probe, |
600 | .remove = __devexit_p(twl_rtc_remove), | 604 | .remove = twl_rtc_remove, |
601 | .shutdown = twl_rtc_shutdown, | 605 | .shutdown = twl_rtc_shutdown, |
602 | .suspend = twl_rtc_suspend, | 606 | .suspend = twl_rtc_suspend, |
603 | .resume = twl_rtc_resume, | 607 | .resume = twl_rtc_resume, |
604 | .driver = { | 608 | .driver = { |
605 | .owner = THIS_MODULE, | 609 | .owner = THIS_MODULE, |
606 | .name = "twl_rtc", | 610 | .name = "twl_rtc", |
607 | .of_match_table = twl_rtc_of_match, | 611 | .of_match_table = of_match_ptr(twl_rtc_of_match), |
608 | }, | 612 | }, |
609 | }; | 613 | }; |
610 | 614 | ||