| From 3984903a2e3906d3def220e688040ce93368200a Mon Sep 17 00:00:00 2001 |
| From: Lokesh Vutla <lokeshvutla@ti.com> |
| Date: Thu, 27 Oct 2016 11:27:25 +0530 |
| Subject: rtc: omap: Fix selecting external osc |
| |
| From: Lokesh Vutla <lokeshvutla@ti.com> |
| |
| commit 3984903a2e3906d3def220e688040ce93368200a upstream. |
| |
| RTC can be clocked from an external 32KHz oscillator, or from the |
| Peripheral PLL. The RTC has an internal oscillator buffer to support |
| direct operation with a crystal. |
| |
| ---------------------------------------- |
| | Device --------- | |
| | | | | |
| | | RTCSS | | |
| | --------- | | | |
| OSC |<------| RTC | | | | |
| |------>| OSC |--- | | | |
| | -------- | | | | |
| | ----|clk | | |
| | -------- | | | | |
| | | PRCM |--- | | | |
| | -------- -------- | |
| ---------------------------------------- |
| |
| The RTC functional clock is sourced by default from the clock derived |
| from the Peripheral PLL. In order to select source as external osc clk |
| the following changes needs to be done: |
| - Enable the RTC OSC (RTC_OSC_REG[4]OSC32K_GZ = 0) |
| - Enable the clock mux(RTC_OSC_REG[6]K32CLK_EN = 1) |
| - Select the external clock source (RTC_OSC_REG[3]32KCLK_SEL = 1) |
| |
| Fixes: 399cf0f63f6f2 ("rtc: omap: Add external clock enabling support") |
| Signed-off-by: Keerthy <j-keerthy@ti.com> |
| Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> |
| Signed-off-by: Dave Gerlach <d-gerlach@ti.com> |
| Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/rtc/rtc-omap.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/rtc/rtc-omap.c |
| +++ b/drivers/rtc/rtc-omap.c |
| @@ -109,6 +109,7 @@ |
| /* OMAP_RTC_OSC_REG bit fields: */ |
| #define OMAP_RTC_OSC_32KCLK_EN BIT(6) |
| #define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3) |
| +#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4) |
| |
| /* OMAP_RTC_IRQWAKEEN bit fields: */ |
| #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1) |
| @@ -646,8 +647,9 @@ static int omap_rtc_probe(struct platfor |
| */ |
| if (rtc->has_ext_clk) { |
| reg = rtc_read(rtc, OMAP_RTC_OSC_REG); |
| - rtc_write(rtc, OMAP_RTC_OSC_REG, |
| - reg | OMAP_RTC_OSC_SEL_32KCLK_SRC); |
| + reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE; |
| + reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC; |
| + rtc_writel(rtc, OMAP_RTC_OSC_REG, reg); |
| } |
| |
| rtc->type->lock(rtc); |