omap-am33xx rtc dt support
Subsystems (5)
v2 cover omap-am33xx rtc dt support
Hi,
This series makes rtc-omap driver DT capable, adds AM33xx RTC DT support along with a few enchancments to the driver.
rtc-omap driver is made intelligent enough to handle kicker mechanism. This helps in removing kicker mechanism support done for DaVinci at platform level.
This has been tested on Beaglebone (AM33xx platform) and on DaVinci DA850 EVM.
This series is based over linux-omap master and can be directly applied over linux-next, except for [PATCH 6/6] arm/dts: am33xx rtc node.
PATCH 6/6 should go through linux-omap tree and needs
http://www.mail-archive.com/[email protected]/msg71644.html
(arm/dts: am33xx wdt node) to get applied cleanly
Regards
Afzal
v2:
Use device name da830-rtc instead of am1808-rtc, similar change in compatible for DT
Newly added register name made similar to that existing in the driver Better commit message description
Modify Kconfig help, resolve checkpatch warning
Afzal Mohammed (5):
rtc: omap: kicker mechanism support
ARM: davinci: remove rtc kicker release
rtc: omap: dt support
rtc: omap: depend on am33xx
arm/dts: am33xx rtc node
Vaibhav Hiremath (1):
rtc: omap: Add runtime pm support
Documentation/devicetree/bindings/rtc/rtc-omap.txt | 20 +++++ arch/arm/boot/dts/am33xx.dtsi | 5 ++ arch/arm/mach-davinci/devices-da8xx.c | 13 +--- drivers/rtc/Kconfig | 10 ++- drivers/rtc/rtc-omap.c | 75 +++++++++++++++++++- 5 files changed, 106 insertions(+), 17 deletions(-) create mode 100644 Documentation/devicetree/bindings/rtc/rtc-omap.txt
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH v2 1/6 rtc: omap: kicker mechanism support
OMAP RTC IP can have kicker feature. This prevents spurious writes to register. To write to registers kicker lock has to be released. Procedure to do it as follows,
1. write to kick0 register, 0x83e70b13
2. write to kick1 register, 0x95a4f1e0
Writing value other than 0x83e70b13 to kick0 enables write locking, more details about kicker mechanism can be found in section 20.3.3.5.3 of AM335X TRM @www.ti.com/am335x
Here id table information is added and is used to distinguish those that require kicker handling and the ones that doesn't need it. There are more features in the newer IP's compared to legacy ones other than kicker, which driver currently doesn't handle, supporting additional features would be easier with the addition of id table.
Older IP (of OMAP1) doesn't have revision register as per TRM, so revision register can't be relied always to find features, hence id table is being used.
---
v2:
Use device name da830-rtc instead of am1808-rtc
Newly added register name made similar to that existing in the driver Better commit message description
drivers/rtc/rtc-omap.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 38 insertions(+), 1 deletions(-)
drivers/rtc/rtc-omap.c +38 -1
@@ -38,6 +38,8 @@* the SoC). See the BOARD-SPECIFIC CUSTOMIZATION comment. */ +#define DRIVER_NAME "omap_rtc" +#define OMAP_RTC_BASE 0xfffb4800/* RTC registers */
@@ -64,6 +66,9 @@#define OMAP_RTC_COMP_MSB_REG 0x50#define OMAP_RTC_OSC_REG 0x54 +#define OMAP_RTC_KICK0_REG 0x6c +#define OMAP_RTC_KICK1_REG 0x70 +/* OMAP_RTC_CTRL_REG bit fields: */ #define OMAP_RTC_CTRL_SPLIT (1<<7)#define OMAP_RTC_CTRL_DISABLE (1<<6)
@@ -88,11 +93,19 @@#define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3)#define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) +/* OMAP_RTC_KICKER values */ +#define KICK0_VALUE (0x83e70b13) +#define KICK1_VALUE (0x95a4f1e0) + +#define OMAP_RTC_HAS_KICKER 0x1 +static void __iomem *rtc_base;#define rtc_read (addr) __raw_readb(rtc_base + (addr))#define rtc_write (val, addr) __raw_writeb(val, rtc_base + (addr)) +#define rtc_writel (val, addr) writel(val, rtc_base + (addr)) +/* we rely on the rtc framework to handle locking (rtc->ops_lock), * so the only other requirement is that register accesses which
@@ -285,11 +298,22 @@ static struct rtc_class_ops omap_rtc_ops = {static int omap_rtc_alarm;static int omap_rtc_timer; +static struct platform_device_id omap_rtc_devtype[] = { + { + .name =DRIVER_NAME , + }, { + .name ="da830-rtc" , + .driver_data =OMAP_RTC_HAS_KICKER , + } +}; +MODULE_DEVICE_TABLE (platform, omap_rtc_devtype); +static int __init omap_rtc_probe (struct platform_device *pdev) {struct resource *res, *mem;struct rtc_device *rtc;u8 reg, new_ctrl; +const struct platform_device_id *id_entry; omap_rtc_timer =platform_get_irq (pdev,0 );if (omap_rtc_timer <=0 ) {
@@ -322,6 +346,12 @@ static int __init omap_rtc_probe(struct platform_device *pdev) goto fail; } + id_entry =platform_get_device_id (pdev); +if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER )) { +rtc_writel (KICK0_VALUE ,OMAP_RTC_KICK0_REG ); +rtc_writel (KICK1_VALUE ,OMAP_RTC_KICK1_REG ); + } + rtc =rtc_device_register (pdev->name, &pdev->dev, &omap_rtc_ops,THIS_MODULE );if (IS_ERR (rtc)) {
@@ -398,6 +428,8 @@ fail2: fail1:rtc_device_unregister (rtc); fail0: +if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER )) +rtc_writel (0 ,OMAP_RTC_KICK0_REG );iounmap (rtc_base); fail:release_mem_region (mem->start,resource_size (mem));
@@ -408,6 +440,8 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) {struct rtc_device *rtc =platform_get_drvdata (pdev);struct resource *mem =dev_get_drvdata (&rtc->dev); +const struct platform_device_id *id_entry = +platform_get_device_id (pdev);device_init_wakeup (&pdev->dev,0 );
@@ -420,6 +454,8 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)free_irq (omap_rtc_alarm, rtc);rtc_device_unregister (rtc); +if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER )) +rtc_writel (0 ,OMAP_RTC_KICK0_REG );iounmap (rtc_base);release_mem_region (mem->start,resource_size (mem));return 0 ;
@@ -471,9 +507,10 @@ static struct platform_driver omap_rtc_driver = { .resume = omap_rtc_resume, .shutdown = omap_rtc_shutdown, .driver = { - .name = "omap_rtc", + .name = DRIVER_NAME, .owner = THIS_MODULE, }, + .id_table = omap_rtc_devtype, };static int __init rtc_init (void )
Signature · 1 line
1.7.1
Re: [PATCH v2 1/6] rtc: omap: kicker mechanism support
Hello.
Quoted 57 lines · Afzal Mohammed
OMAP RTC IP can have kicker feature. This prevents spurious writes to register. To write to registers kicker lock has to be released. Procedure to do it as follows,
1. write to kick0 register,
0x83e70b13
2. write to kick1 register,0x95a4f1e0Writing value other than
0x83e70b13to kick0 enables write locking, more details about kicker mechanism can be found in section 20.3.3.5.3 of AM335X TRM @www.ti.com/am335xHere id table information is added and is used to distinguish those that require kicker handling and the ones that doesn't need it. There are more features in the newer IP's compared to legacy ones other than kicker, which driver currently doesn't handle, supporting additional features would be easier with the addition of id table.
Older IP (of OMAP1) doesn't have revision register as per TRM, so revision register can't be relied always to find features, hence id table is being used.
Signed-off-by Afzal Mohammed <[email protected]>---
v2:
Use device name da830-rtc instead of am1808-rtc
Newly added register name made similar to that existing in the driver Better commit message descriptiondrivers/rtc/rtc-omap.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 38 insertions(+), 1 deletions(-)drivers/rtc/rtc-omap.c +5
-0@@ -38,6 +38,8 @@* the SoC). See the BOARD-SPECIFIC CUSTOMIZATION comment. */ +#define DRIVER_NAME "omap_rtc" +#define OMAP_RTC_BASE 0xfffb4800/* RTC registers */ @@ -64,6 +66,9 @@#define OMAP_RTC_COMP_MSB_REG 0x50#define OMAP_RTC_OSC_REG 0x54 +#define OMAP_RTC_KICK0_REG 0x6c +#define OMAP_RTC_KICK1_REG 0x70 +/* OMAP_RTC_CTRL_REG bit fields: */ #define OMAP_RTC_CTRL_SPLIT (1<<7)#define OMAP_RTC_CTRL_DISABLE (1<<6)
drivers/rtc/rtc-omap.c line 98
Quoted 6 lines
drivers/rtc/rtc-omap.c +3
-0@@ -88,11 +93,19 @@#define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3)#define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) +/* OMAP_RTC_KICKER values */ +#define KICK0_VALUE (0x83e70b13) +#define KICK1_VALUE (0x95a4f1e0)
Parens not needed around simple literals.
drivers/rtc/rtc-omap.c line 108
Quoted 7 lines
drivers/rtc/rtc-omap.c +2
-0static void __iomem *rtc_base;#define rtc_read (addr) __raw_readb(rtc_base + (addr))#define rtc_write (val, addr) __raw_writeb(val, rtc_base + (addr)) +#define rtc_writel (val, addr) writel(val, rtc_base + (addr)) +
Why not __raw_writel() like the above functions?
WBR, Sergei
RE: [PATCH v2 1/6] rtc: omap: kicker mechanism support
Hi Sergei,
Quoted 5 lines · Sergei Shtylyov
drivers/rtc/rtc-omap.c line 98
Quoted 3 lines
drivers/rtc/rtc-omap.c +3
-0+/* OMAP_RTC_KICKER values */ +#define KICK0_VALUE (0x83e70b13) +#define KICK1_VALUE (0x95a4f1e0)Parens not needed around simple literals.
Thanks for catching it
Quoted 10 lines
drivers/rtc/rtc-omap.c line 108
Quoted 8 lines
static void
__iomem*rtc_base;#define rtc_read(addr) __raw_readb(rtc_base + (addr)) #define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr))drivers/rtc/rtc-omap.c +2
-0+#define rtc_writel (val, addr) writel(val, rtc_base + (addr)) +Why not
__raw_writel()like the above functions?
This driver would be used in AM335X, it being ARMv7, writel would be safe (existing __raw_readb/__raw_writeb too needs to be replaced)
Regards
Afzal
PATCH v2 2/6 ARM: davinci: remove rtc kicker release
In reply to a message not in the archivertc-omap driver is now capable of handling kicker mechanism, hence remove kicker handling at platform level, instead provide proper device name so that driver can handle kicker mechanism by itself
---
v2:
Use device name da830-rtc instead of am1808-rtc
arch/arm/mach-davinci/devices-da8xx.c | 13 +------------ 1 files changed, 1 insertions(+), 12 deletions(-)
arch/arm/mach-davinci/devices-da8xx.c +1 -12
@@ -679,7 +679,7 @@ static struct resource da8xx_rtc_resources[] = { };static struct platform_device da8xx_rtc_device = { - .name ="omap_rtc" , + .name ="da830-rtc" , .id =-1 , .num_resources =ARRAY_SIZE (da8xx_rtc_resources), .resource = da8xx_rtc_resources,
@@ -688,17 +688,6 @@ static struct platform_device da8xx_rtc_device = {int da8xx_register_rtc (void ) {int ret; -void __iomem *base; - - base =ioremap (DA8XX_RTC_BASE ,SZ_4K ); -if (WARN_ON (!base)) -return -ENOMEM ; - -/* Unlock the rtc's registers */ -__raw_writel (0x83e70b13 , base +0x6c ); -__raw_writel (0x95a4f1e0 , base +0x70 ); - -iounmap (base); ret =platform_device_register (&da8xx_rtc_device);if (!ret)
Signature · 1 line
1.7.1
PATCH v2 3/6 rtc: omap: dt support
In reply to a message not in the archiveEnhance rtc-omap driver with DT capability
---
v2:
Use compatible as ti,da830-rtc instead of ti,am1808-rtc
Documentation/devicetree/bindings/rtc/rtc-omap.txt | 20 ++++++++++++++++++++ drivers/rtc/rtc-omap.c | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+), 0 deletions(-) create mode 100644 Documentation/devicetree/bindings/rtc/rtc-omap.txt
Documentation/devicetree/bindings/rtc/rtc-omap.txt new file +20 -0
@@ -0,0 +1,20 @@ +TI Real Time Clock + +Required properties: +- compatible: "ti,da830-rtc" +- reg: Address range of rtc register set +- interrupts: rtc timer, alarm interrupts in order +- interrupt-parent: phandle for the interrupt controller + +Alternative for reg and interrupt properties on OMAP: +- ti,hwmods: Name of the hwmod associated to the RTC + +Example: + +rtc@1c23000 { + compatible = "ti,da830-rtc"; + reg = <0x23000 0x1000>; + interrupts = <19 + 19>; + interrupt-parent = <&intc>; +};
drivers/rtc/rtc-omap.c +18 -0
@@ -20,6 +20,8 @@#include <linux/rtc.h> #include <linux/bcd.h> #include <linux/platform_device.h> +#include <linux/of.h> +#include <linux/of_device.h> #include <asm/io.h>
@@ -298,6 +300,8 @@ static struct rtc_class_ops omap_rtc_ops = {static int omap_rtc_alarm;static int omap_rtc_timer; +#define OMAP_RTC_DATA_DA830_IDX 1 +static struct platform_device_id omap_rtc_devtype[] = { { .name =DRIVER_NAME ,
@@ -308,12 +312,25 @@ static struct platform_device_id omap_rtc_devtype[] = { };MODULE_DEVICE_TABLE (platform, omap_rtc_devtype); +static const struct of_device_id omap_rtc_of_match[] = { + { .compatible ="ti,da830-rtc" , + .data = &omap_rtc_devtype[OMAP_RTC_DATA_DA830_IDX ], + }, + {}, +}; +MODULE_DEVICE_TABLE (of, omap_rtc_of_match); +static int __init omap_rtc_probe (struct platform_device *pdev) {struct resource *res, *mem;struct rtc_device *rtc;u8 reg, new_ctrl;const struct platform_device_id *id_entry; +const struct of_device_id *of_id; + + of_id =of_match_device (omap_rtc_of_match, &pdev->dev); +if (of_id) + pdev->id_entry = of_id->data; omap_rtc_timer =platform_get_irq (pdev,0 );if (omap_rtc_timer <=0 ) {
@@ -509,6 +526,7 @@ static struct platform_driver omap_rtc_driver = { .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, + .of_match_table = of_match_ptr(omap_rtc_of_match), }, .id_table = omap_rtc_devtype, };
Signature · 1 line
1.7.1
PATCH v2 4/6 rtc: omap: depend on am33xx
In reply to a message not in the archivertc-omap driver can be reused for AM33xx RTC.
Provide dependency in Kconfig.
---
v2:
Modify Kconfig help, resolve checkpatch warning
drivers/rtc/Kconfig | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
drivers/rtc/Kconfig +6 -4
@@ -729,11 +729,13 @@ config RTC_DRV_IMXDI config RTC_DRV_OMAP tristate "TI OMAP1" - depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_DAVINCI_DA8XX + depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_DAVINCI_DA8XX || SOC_AM33XX help - Say "yes" here to support the real time clock on TI OMAP1 and - DA8xx/OMAP-L13x chips. This driver can also be built as a - module called rtc-omap. + Say "yes" here to support the on chip real time clock + present on TI OMAP1, AM33xx and DA8xx/OMAP-L13x. + + This driver can also be built as a module, if so, module + will be called rtc-omap. config HAVE_S3C_RTC bool
Signature · 1 line
1.7.1
PATCH v2 5/6 rtc: omap: Add runtime pm support
In reply to a message not in the archiveFrom: Vaibhav Hiremath <[email protected]>
OMAP1 RTC driver is used in multiple devices like,
OMAPL138 and AM33XX. Driver currently doesn't handle any clocks, which may be right for OMAP1 architecture but in case of AM33XX, the clock/module needs to be enabled in order to access the registers.
So covert this driver to runtime pm, which internally handles rest.
Afzal: handle error path
--- drivers/rtc/rtc-omap.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-)
drivers/rtc/rtc-omap.c +18 -0
@@ -22,6 +22,7 @@#include <linux/platform_device.h> #include <linux/of.h> #include <linux/of_device.h> +#include <linux/pm_runtime.h> #include <asm/io.h>
@@ -363,6 +364,10 @@ static int __init omap_rtc_probe(struct platform_device *pdev) goto fail; } +/* Enable the clock/module so that we can access the registers */ +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 )) {rtc_writel (KICK0_VALUE ,OMAP_RTC_KICK0_REG );
@@ -447,6 +452,8 @@ fail1: fail0:if (id_entry && (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);iounmap (rtc_base); fail:release_mem_region (mem->start,resource_size (mem));
@@ -473,6 +480,11 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)rtc_device_unregister (rtc);if (id_entry && (id_entry->driver_data &OMAP_RTC_HAS_KICKER ))rtc_writel (0 ,OMAP_RTC_KICK0_REG ); + +/* Disable the clock/module */ +pm_runtime_put_sync (&pdev->dev); +pm_runtime_disable (&pdev->dev); +iounmap (rtc_base);release_mem_region (mem->start,resource_size (mem));return 0 ;
@@ -495,11 +507,17 @@ static int omap_rtc_suspend(struct platform_device *pdev, pm_message_t state)else rtc_write (0 ,OMAP_RTC_INTERRUPTS_REG ); +/* Disable the clock/module */ +pm_runtime_put_sync (&pdev->dev); +return 0 ; }static int omap_rtc_resume (struct platform_device *pdev) { +/* Enable the clock/module so that we can access the registers */ +pm_runtime_get_sync (&pdev->dev); +if (device_may_wakeup (&pdev->dev))disable_irq_wake (omap_rtc_alarm);else
Signature · 1 line
1.7.1
PATCH v2 6/6 arm/dts: am33xx rtc node
In reply to a message not in the archiveAdd AM33xx rtc node.
---
v2:
Use compatible as ti,da830-rtc instead of ti,am1808-rtc
arch/arm/boot/dts/am33xx.dtsi | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
arch/arm/boot/dts/am33xx.dtsi +5 -0
@@ -159,5 +159,10 @@ compatible = "ti,omap3-wdt"; ti,hwmods = "wd_timer2"; }; + + rtc@44e3e000 { + compatible = "ti,da830-rtc"; + ti,hwmods = "rtc"; + }; }; };
Signature · 1 line
1.7.1
Re: [PATCH v2 6/6] arm/dts: am33xx rtc node
Hello.
Quoted 16 lines · Afzal Mohammed
Add AM33xx rtc node.
Signed-off-by Afzal Mohammed <[email protected]>---
v2:
Use compatible as ti,da830-rtc instead of ti,am1808-rtcarch/arm/boot/dts/am33xx.dtsi | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)arch/arm/boot/dts/am33xx.dtsi +0
-0
arch/arm/boot/dts/am33xx.dtsi line 163
Quoted 5 lines
arch/arm/boot/dts/am33xx.dtsi +2
-0@@ -159,5 +159,10 @@ compatible = "ti,omap3-wdt"; ti,hwmods = "wd_timer2"; }; + + rtc at 44e3e000 {
Address postfix in the node name without "reg" property?
arch/arm/boot/dts/am33xx.dtsi line 166
Quoted 3 lines
arch/arm/boot/dts/am33xx.dtsi +3
-0+ compatible = "ti,da830-rtc"; + ti,hwmods = "rtc"; + };
WBR, Sergei
RE: [PATCH v2 6/6] arm/dts: am33xx rtc node
Hi Sergei,
Quoted 3 lines · Sergei Shtylyov
Review
Quoted 1 line
(quoted diff) +1
-0+ rtc at 44e3e000 {Address postfix in the node name without "reg" property?
As per [1], "The unit-address is included if the node describes a device with an address".
Here even though reg property is not present, as via hwmod (see below) it is getting address, isn't it better to have it
Quoted 3 lines
arch/arm/boot/dts/am33xx.dtsi line 165
Quoted 3 lines
arch/arm/boot/dts/am33xx.dtsi +2
-0+ compatible = "ti,da830-rtc"; + ti,hwmods = "rtc";
Regards
Afzal
Re: [PATCH v2 6/6] arm/dts: am33xx rtc node
Hello.
Quoted 6 lines · Afzal
Quoted 3 lines
Review
Quoted 1 line
(quoted diff) +1
-0+ rtc at 44e3e000 {Address postfix in the node name without "reg" property?
As per [1], "The unit-address is included if the node describes a device with an address".
Which in this case it doesn't.
Quoted 2 lines
Here even though reg property is not present, as via hwmod (see below) it is getting address, isn't it better to have it
I think not.
Quoted 2 lines
Quoted 2 lines
arch/arm/boot/dts/am33xx.dtsi line 165
Quoted 2 lines
arch/arm/boot/dts/am33xx.dtsi +2
-0+ compatible = "ti,da830-rtc"; + ti,hwmods = "rtc";
WBR, Sergei
RE: [PATCH v2 6/6] arm/dts: am33xx rtc node
Hi Sergei,
Quoted 7 lines · Sergei Shtylyov
Quoted 6 lines
Quoted 3 lines
Review
Quoted 1 line
(quoted diff) +1
-0+ rtc at 44e3e000 {Address postfix in the node name without "reg" property?
As per [1], "The unit-address is included if the node describes a device with an address".
Quoted 6 lines
Which in this case it doesn't.
Quoted 2 lines
Here even though reg property is not present, as via hwmod (see below) it is getting address, isn't it better to have it
I think not.
Ok, I will remove it
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
arch/arm/boot/dts/am33xx.dtsi line 165
Quoted 2 lines
arch/arm/boot/dts/am33xx.dtsi +2
-0+ compatible = "ti,da830-rtc"; + ti,hwmods = "rtc";
Regards
Afzal