Commit cd914bba authored by Sekhar Nori's avatar Sekhar Nori Committed by Linus Torvalds

drivers/rtc/rtc-omap.c: add support for enabling 32khz clock

Newer versions of OMAP RTC IP such as those found in AM335x and DRA7x
need an explicit enable of 32khz functional clock which ticks the RTC.

AM335x support was working so far because of settings done in U-Boot.
However, the DRA7x U-Boot does no such enable of 32khz clock and this
patch is need to get the RTC to work on DRA7x at least.  In general, it
is better to not depend on settings done in U-Boot.

Thanks to Lokesh Vutla for noticing this.
Signed-off-by: default avatarSekhar Nori <nsekhar@ti.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Lokesh Vutla <lokeshvutla@ti.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 92adb96a
...@@ -96,6 +96,9 @@ ...@@ -96,6 +96,9 @@
#define OMAP_RTC_INTERRUPTS_IT_ALARM BIT(3) #define OMAP_RTC_INTERRUPTS_IT_ALARM BIT(3)
#define OMAP_RTC_INTERRUPTS_IT_TIMER BIT(2) #define OMAP_RTC_INTERRUPTS_IT_TIMER BIT(2)
/* OMAP_RTC_OSC_REG bit fields: */
#define OMAP_RTC_OSC_32KCLK_EN BIT(6)
/* OMAP_RTC_IRQWAKEEN bit fields: */ /* OMAP_RTC_IRQWAKEEN bit fields: */
#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1) #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
...@@ -111,6 +114,12 @@ ...@@ -111,6 +114,12 @@
*/ */
#define OMAP_RTC_HAS_IRQWAKEEN BIT(1) #define OMAP_RTC_HAS_IRQWAKEEN BIT(1)
/*
* Some RTC IP revisions (like those in AM335x and DRA7x) need
* the 32KHz clock to be explicitly enabled.
*/
#define OMAP_RTC_HAS_32KCLK_EN BIT(2)
static void __iomem *rtc_base; static void __iomem *rtc_base;
#define rtc_read(addr) readb(rtc_base + (addr)) #define rtc_read(addr) readb(rtc_base + (addr))
...@@ -319,7 +328,8 @@ static struct platform_device_id omap_rtc_devtype[] = { ...@@ -319,7 +328,8 @@ static struct platform_device_id omap_rtc_devtype[] = {
}, },
[OMAP_RTC_DATA_AM3352_IDX] = { [OMAP_RTC_DATA_AM3352_IDX] = {
.name = "am3352-rtc", .name = "am3352-rtc",
.driver_data = OMAP_RTC_HAS_KICKER | OMAP_RTC_HAS_IRQWAKEEN, .driver_data = OMAP_RTC_HAS_KICKER | OMAP_RTC_HAS_IRQWAKEEN |
OMAP_RTC_HAS_32KCLK_EN,
}, },
[OMAP_RTC_DATA_DA830_IDX] = { [OMAP_RTC_DATA_DA830_IDX] = {
.name = "da830-rtc", .name = "da830-rtc",
...@@ -398,6 +408,10 @@ static int __init omap_rtc_probe(struct platform_device *pdev) ...@@ -398,6 +408,10 @@ static int __init omap_rtc_probe(struct platform_device *pdev)
*/ */
rtc_write(0, OMAP_RTC_INTERRUPTS_REG); rtc_write(0, OMAP_RTC_INTERRUPTS_REG);
/* enable RTC functional clock */
if (id_entry->driver_data & OMAP_RTC_HAS_32KCLK_EN)
rtc_writel(OMAP_RTC_OSC_32KCLK_EN, OMAP_RTC_OSC_REG);
/* clear old status */ /* clear old status */
reg = rtc_read(OMAP_RTC_STATUS_REG); reg = rtc_read(OMAP_RTC_STATUS_REG);
if (reg & (u8) OMAP_RTC_STATUS_POWER_UP) { if (reg & (u8) OMAP_RTC_STATUS_POWER_UP) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment