rtc: omap: cleanups and dra7x support
cover rtc: omap: cleanups and dra7x support
This patch series does some cleanups on RTC driver and prepares it for DRA7x support.
Applies to linux-next of 5th May.
Tested on DRA7x EVM using some additional patches for platform support. RTC alarm was not tested (needs IRQ cross bar patches).
Sekhar Nori (3):
rtc: omap: remove multiple device id checks
rtc: omap: use BIT() macro
rtc: omap: add support for enabling 32khz clock
drivers/rtc/rtc-omap.c | 71 ++++++++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 26 deletions(-)
Signature · 1 line
1.7.10.1
PATCH 1/3 rtc: omap: remove multiple device id checks
Remove multiple superfluous device id checks. Since an id_table is present in the driver probe() should never encounter an empty device id entry. In case of OF style match, of_match_device() returns an matching entry.
For paranoia sake, check for device id entry once and fail probe() if none is found. This is much better than checking for it multiple times.
--- drivers/rtc/rtc-omap.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/rtc/rtc-omap.c +9 -4
@@ -352,6 +352,12 @@ static int __init omap_rtc_probe(struct platform_device *pdev)if (of_id) pdev->id_entry = of_id->data; + id_entry =platform_get_device_id (pdev); +if (!id_entry) { +dev_err (&pdev->dev,"no matching device entry\n" ); +return -ENODEV ; + } + omap_rtc_timer =platform_get_irq (pdev,0 );if (omap_rtc_timer <=0 ) {pr_debug ("%s: no update irq?\n" , pdev->name);
@@ -373,8 +379,7 @@ static int __init omap_rtc_probe(struct platform_device *pdev)pm_runtime_enable (&pdev->dev);pm_runtime_get_sync (&pdev->dev); - id_entry =platform_get_device_id (pdev); -if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER )) { +if (id_entry->driver_data &OMAP_RTC_HAS_KICKER ) {rtc_writel (KICK0_VALUE ,OMAP_RTC_KICK0_REG );rtc_writel (KICK1_VALUE ,OMAP_RTC_KICK1_REG ); }
@@ -452,7 +457,7 @@ static int __init omap_rtc_probe(struct platform_device *pdev)return 0 ; fail0: -if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER )) +if (id_entry->driver_data &OMAP_RTC_HAS_KICKER )rtc_writel (0 ,OMAP_RTC_KICK0_REG );pm_runtime_put_sync (&pdev->dev);pm_runtime_disable (&pdev->dev);
@@ -469,7 +474,7 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)/* leave rtc running, but disable irqs */ rtc_write (0 ,OMAP_RTC_INTERRUPTS_REG ); -if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER )) +if (id_entry->driver_data &OMAP_RTC_HAS_KICKER )rtc_writel (0 ,OMAP_RTC_KICK0_REG );/* Disable the clock/module */
Signature · 1 line
1.7.10.1
PATCH 2/3 rtc: omap: use BIT() macro
In reply to Sekhar NoriUse BIT() macro for RTC_HAS_<FEATURE> defines
instead of hand-writing bit masks.
Use BIT() macros for register bit field
definitions.
While at it, fix indentation done using spaces.
No functional change in this patch.
--- drivers/rtc/rtc-omap.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)
drivers/rtc/rtc-omap.c +21 -21
@@ -73,43 +73,43 @@#define OMAP_RTC_IRQWAKEEN 0x7c/* OMAP_RTC_CTRL_REG bit fields: */ -#define OMAP_RTC_CTRL_SPLIT (1<<7) -#define OMAP_RTC_CTRL_DISABLE (1<<6) -#define OMAP_RTC_CTRL_SET_32_COUNTER (1<<5) -#define OMAP_RTC_CTRL_TEST (1<<4) -#define OMAP_RTC_CTRL_MODE_12_24 (1<<3) -#define OMAP_RTC_CTRL_AUTO_COMP (1<<2) -#define OMAP_RTC_CTRL_ROUND_30S (1<<1) -#define OMAP_RTC_CTRL_STOP (1<<0) +#define OMAP_RTC_CTRL_SPLIT BIT(7) +#define OMAP_RTC_CTRL_DISABLE BIT(6) +#define OMAP_RTC_CTRL_SET_32_COUNTER BIT(5) +#define OMAP_RTC_CTRL_TEST BIT(4) +#define OMAP_RTC_CTRL_MODE_12_24 BIT(3) +#define OMAP_RTC_CTRL_AUTO_COMP BIT(2) +#define OMAP_RTC_CTRL_ROUND_30S BIT(1) +#define OMAP_RTC_CTRL_STOP BIT(0)/* OMAP_RTC_STATUS_REG bit fields: */ -#define OMAP_RTC_STATUS_POWER_UP (1<<7) -#define OMAP_RTC_STATUS_ALARM (1<<6) -#define OMAP_RTC_STATUS_1D_EVENT (1<<5) -#define OMAP_RTC_STATUS_1H_EVENT (1<<4) -#define OMAP_RTC_STATUS_1M_EVENT (1<<3) -#define OMAP_RTC_STATUS_1S_EVENT (1<<2) -#define OMAP_RTC_STATUS_RUN (1<<1) -#define OMAP_RTC_STATUS_BUSY (1<<0) +#define OMAP_RTC_STATUS_POWER_UP BIT(7) +#define OMAP_RTC_STATUS_ALARM BIT(6) +#define OMAP_RTC_STATUS_1D_EVENT BIT(5) +#define OMAP_RTC_STATUS_1H_EVENT BIT(4) +#define OMAP_RTC_STATUS_1M_EVENT BIT(3) +#define OMAP_RTC_STATUS_1S_EVENT BIT(2) +#define OMAP_RTC_STATUS_RUN BIT(1) +#define OMAP_RTC_STATUS_BUSY BIT(0)/* OMAP_RTC_INTERRUPTS_REG bit fields: */ -#define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3) -#define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) +#define OMAP_RTC_INTERRUPTS_IT_ALARM BIT(3) +#define OMAP_RTC_INTERRUPTS_IT_TIMER BIT(2)/* OMAP_RTC_IRQWAKEEN bit fields: */ -#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN (1<<1) +#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)/* OMAP_RTC_KICKER values */ #define KICK0_VALUE 0x83e70b13#define KICK1_VALUE 0x95a4f1e0 -#define OMAP_RTC_HAS_KICKER 0x1 +#define OMAP_RTC_HAS_KICKER BIT(0)/* * Few RTC IP revisions has special WAKE-EN Register to enable Wakeup * generation for event Alarm. */ -#define OMAP_RTC_HAS_IRQWAKEEN 0x2 +#define OMAP_RTC_HAS_IRQWAKEEN BIT(1)static void __iomem *rtc_base;
Signature · 1 line
1.7.10.1
PATCH 3/3 rtc: omap: add support for enabling 32khz clock
In reply to Sekhar NoriNewer 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.
--- drivers/rtc/rtc-omap.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
drivers/rtc/rtc-omap.c +15 -1
@@ -96,6 +96,9 @@#define OMAP_RTC_INTERRUPTS_IT_ALARM BIT(3)#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: */ #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
@@ -111,6 +114,12 @@*/ #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;#define rtc_read (addr) readb(rtc_base + (addr))
@@ -319,7 +328,8 @@ static struct platform_device_id omap_rtc_devtype[] = { }, [OMAP_RTC_DATA_AM3352_IDX] = { .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] = { .name = "da830-rtc",
@@ -398,6 +408,10 @@ static int __init omap_rtc_probe(struct platform_device *pdev)*/ 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 */ reg =rtc_read (OMAP_RTC_STATUS_REG );if (reg & (u8 )OMAP_RTC_STATUS_POWER_UP ) {
Signature · 1 line
1.7.10.1