diff options
-rw-r--r-- | drivers/rtc/rtc-omap.c | 16 |
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 | |||
114 | static void __iomem *rtc_base; | 123 | static 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) { |