aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/rtc/rtc-omap.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
index 734e40804732..03bce134414c 100644
--- a/drivers/rtc/rtc-omap.c
+++ b/drivers/rtc/rtc-omap.c
@@ -96,6 +96,9 @@
96#define OMAP_RTC_INTERRUPTS_IT_ALARM BIT(3) 96#define OMAP_RTC_INTERRUPTS_IT_ALARM BIT(3)
97#define OMAP_RTC_INTERRUPTS_IT_TIMER BIT(2) 97#define OMAP_RTC_INTERRUPTS_IT_TIMER BIT(2)
98 98
99/* OMAP_RTC_OSC_REG bit fields: */
100#define OMAP_RTC_OSC_32KCLK_EN BIT(6)
101
99/* OMAP_RTC_IRQWAKEEN bit fields: */ 102/* OMAP_RTC_IRQWAKEEN bit fields: */
100#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1) 103#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
101 104
@@ -111,6 +114,12 @@
111 */ 114 */
112#define OMAP_RTC_HAS_IRQWAKEEN BIT(1) 115#define OMAP_RTC_HAS_IRQWAKEEN BIT(1)
113 116
117/*
118 * Some RTC IP revisions (like those in AM335x and DRA7x) need
119 * the 32KHz clock to be explicitly enabled.
120 */
121#define OMAP_RTC_HAS_32KCLK_EN BIT(2)
122
114static void __iomem *rtc_base; 123static void __iomem *rtc_base;
115 124
116#define rtc_read(addr) readb(rtc_base + (addr)) 125#define rtc_read(addr) readb(rtc_base + (addr))
@@ -319,7 +328,8 @@ static struct platform_device_id omap_rtc_devtype[] = {
319 }, 328 },
320 [OMAP_RTC_DATA_AM3352_IDX] = { 329 [OMAP_RTC_DATA_AM3352_IDX] = {
321 .name = "am3352-rtc", 330 .name = "am3352-rtc",
322 .driver_data = OMAP_RTC_HAS_KICKER | OMAP_RTC_HAS_IRQWAKEEN, 331 .driver_data = OMAP_RTC_HAS_KICKER | OMAP_RTC_HAS_IRQWAKEEN |
332 OMAP_RTC_HAS_32KCLK_EN,
323 }, 333 },
324 [OMAP_RTC_DATA_DA830_IDX] = { 334 [OMAP_RTC_DATA_DA830_IDX] = {
325 .name = "da830-rtc", 335 .name = "da830-rtc",
@@ -398,6 +408,10 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
398 */ 408 */
399 rtc_write(0, OMAP_RTC_INTERRUPTS_REG); 409 rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
400 410
411 /* enable RTC functional clock */
412 if (id_entry->driver_data & OMAP_RTC_HAS_32KCLK_EN)
413 rtc_writel(OMAP_RTC_OSC_32KCLK_EN, OMAP_RTC_OSC_REG);
414
401 /* clear old status */ 415 /* clear old status */
402 reg = rtc_read(OMAP_RTC_STATUS_REG); 416 reg = rtc_read(OMAP_RTC_STATUS_REG);
403 if (reg & (u8) OMAP_RTC_STATUS_POWER_UP) { 417 if (reg & (u8) OMAP_RTC_STATUS_POWER_UP) {