[v4,3/5] rtc: omap: dt support

Submitted by Mohammed Afzal on Oct. 19, 2012, 9:59 a.m.

Details

Message ID 061c670b0a05570d7b83d8a8f105ee5b35583f7f.1350633036.git.afzal@ti.com
State Accepted
Headers show

Commit Message

Mohammed Afzal Oct. 19, 2012, 9:59 a.m.
enhance rtc-omap driver with DT capability

Signed-off-by: Afzal Mohammed <afzal@ti.com>
Acked-by: Sekhar Nori <nsekhar@ti.com>
---

v4:
 Proper devicetree documentation

v2:
 Use compatible as ti,da830-rtc instead of ti,am1808-rtc

 Documentation/devicetree/bindings/rtc/rtc-omap.txt | 17 +++++++++++++++++
 drivers/rtc/rtc-omap.c                             | 18 ++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/rtc/rtc-omap.txt

Comments

Daniel Mack Oct. 21, 2012, 7:51 p.m.
On 19.10.2012 11:59, Afzal Mohammed wrote:
> enhance rtc-omap driver with DT capability
> 
> Signed-off-by: Afzal Mohammed <afzal@ti.com>
> Acked-by: Sekhar Nori <nsekhar@ti.com>
> ---
> 
> v4:
>  Proper devicetree documentation
> 
> v2:
>  Use compatible as ti,da830-rtc instead of ti,am1808-rtc
> 
>  Documentation/devicetree/bindings/rtc/rtc-omap.txt | 17 +++++++++++++++++
>  drivers/rtc/rtc-omap.c                             | 18 ++++++++++++++++++
>  2 files changed, 35 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/rtc/rtc-omap.txt
> 
> diff --git a/Documentation/devicetree/bindings/rtc/rtc-omap.txt b/Documentation/devicetree/bindings/rtc/rtc-omap.txt
> new file mode 100644
> index 0000000..b47aa41
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/rtc/rtc-omap.txt
> @@ -0,0 +1,17 @@
> +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
> +
> +Example:
> +
> +rtc@1c23000 {
> +	compatible = "ti,da830-rtc";
> +	reg = <0x23000 0x1000>;
> +	interrupts = <19
> +		      19>;
> +	interrupt-parent = <&intc>;
> +};
> diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
> index d948426..dff9ff4 100644
> --- a/drivers/rtc/rtc-omap.c
> +++ b/drivers/rtc/rtc-omap.c
> @@ -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,
> @@ -309,12 +313,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],

Wouldn't it make sense to list all the compatible models here? The
advantage of a compatible list is that we can name the models
explicitly, or maybe at least "davinci-rtc". Is there any reason for
this particular name?



Daniel


> +	},
> +	{},
> +};
> +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) {
> @@ -510,6 +527,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,
>  };
>
Afzal Mohammed Oct. 29, 2012, 8:03 a.m.
Hi Daniel,

On Monday 22 October 2012 01:21 AM, Daniel Mack wrote:
> On 19.10.2012 11:59, Afzal Mohammed wrote:

>> +static const struct of_device_id omap_rtc_of_match[] = {
>> +	{	.compatible	= "ti,da830-rtc",
>> +		.data		=&omap_rtc_devtype[OMAP_RTC_DATA_DA830_IDX],

> Wouldn't it make sense to list all the compatible models here? The
> advantage of a compatible list is that we can name the models
> explicitly, or maybe at least "davinci-rtc". Is there any reason for
> this particular name?

Exact name followed by compatible models needs to be
specified in DT node only, right ? (when driver for the
first variant can handle it)

And when additional features of newer IP's has to be
leveraged, new entries can be added in the driver
match table.

First known variant of SoC for DT is da830 (exact name),
hence it was used.

Regards
Afzal

Patch hide | download patch | download mbox

diff --git a/Documentation/devicetree/bindings/rtc/rtc-omap.txt b/Documentation/devicetree/bindings/rtc/rtc-omap.txt
new file mode 100644
index 0000000..b47aa41
--- /dev/null
+++ b/Documentation/devicetree/bindings/rtc/rtc-omap.txt
@@ -0,0 +1,17 @@ 
+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
+
+Example:
+
+rtc@1c23000 {
+	compatible = "ti,da830-rtc";
+	reg = <0x23000 0x1000>;
+	interrupts = <19
+		      19>;
+	interrupt-parent = <&intc>;
+};
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
index d948426..dff9ff4 100644
--- a/drivers/rtc/rtc-omap.c
+++ b/drivers/rtc/rtc-omap.c
@@ -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,
@@ -309,12 +313,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) {
@@ -510,6 +527,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,
 };