Thread (16 messages) 16 messages, 5 authors, 2011-08-03

Re: [PATCH 4/4] dt: i2c-omap: Convert i2c driver to use device tree

From: Grant Likely <hidden>
Date: 2011-07-13 23:20:28
Also in: linux-arm-kernel, linux-omap

On Thu, Jul 14, 2011 at 7:06 AM, G, Manjunath Kondaiah [off-list ref] wrote:
quoted hunk ↗ jump to hunk
The i2c-omap driver is converted for supporting both
dt and non dt builds and driver is modified to use dt
data partially.

Tested on OMAP3 beagle board.

Signed-off-by: G, Manjunath Kondaiah <redacted>
---
 drivers/i2c/busses/i2c-omap.c |   48 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 47 insertions(+), 1 deletions(-)
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index ae1545b..6d11a13 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -38,9 +38,13 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/of_i2c.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
 #include <linux/slab.h>
 #include <linux/i2c-omap.h>
 #include <linux/pm_runtime.h>
+#include <plat/i2c.h>

 /* I2C controller revisions */
 #define OMAP_I2C_REV_2                 0x20
@@ -972,6 +976,10 @@ static const struct i2c_algorithm omap_i2c_algo = {
       .functionality  = omap_i2c_func,
 };

+#if defined(CONFIG_OF)
+static const struct of_device_id omap_i2c_of_match[];
+#endif
+
 static int __devinit
 omap_i2c_probe(struct platform_device *pdev)
 {
@@ -979,10 +987,17 @@ omap_i2c_probe(struct platform_device *pdev)
       struct i2c_adapter      *adap;
       struct resource         *mem, *irq, *ioarea;
       struct omap_i2c_bus_platform_data *pdata = pdev->dev.platform_data;
+#if defined(CONFIG_OF)
+       const struct of_device_id *match;
+#endif
       irq_handler_t isr;
       int r;
       u32 speed = 0;

+#if defined(CONFIG_OF)
+       match = of_match_device(omap_i2c_of_match, &pdev->dev);
+#endif
of_match_device() is an empty inline when CONFIG_OF is not defined.
You can drop the #if defined() protection around this statement.
quoted hunk ↗ jump to hunk
+
       /* NOTE: driver uses the static register mapping */
       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
       if (!mem) {
@@ -1011,11 +1026,25 @@ omap_i2c_probe(struct platform_device *pdev)
       if (pdata != NULL) {
               speed = pdata->clkrate;
               dev->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat;
+#if defined(CONFIG_OF)
+       } else if (pdev->dev.of_node) {
+               u32 prop;
+               if (!of_property_read_u32(pdev->dev.of_node, "clock-frequency",
+                                                                       &prop))
+                       speed = prop/100;
+               else
+                       speed = 100;
If you move the 'speed = 100' statement above the if(pdata != NULL)
test, then this whole block can become simpler for both the pdata and
DT situations.
quoted hunk ↗ jump to hunk
+#else
       } else {
               speed = 100;    /* Default speed */
-               dev->set_mpu_wkup_lat = NULL;
+#endif
       }

+#if defined(CONFIG_OF)
+       /* TODO: remove this after DT depencies with hwmod are resolved */
+       if (match)
+               return 0;
+#endif
       dev->speed = speed;
       dev->idle = 1;
       dev->dev = &pdev->dev;
@@ -1096,7 +1125,9 @@ omap_i2c_probe(struct platform_device *pdev)
       strlcpy(adap->name, "OMAP I2C adapter", sizeof(adap->name));
       adap->algo = &omap_i2c_algo;
       adap->dev.parent = &pdev->dev;
+#if defined(CONFIG_OF)
       adap->dev.of_node = pdev->dev.of_node;
+#endif
The #if defined() can be safely removed here.
quoted hunk ↗ jump to hunk
       /* i2c device drivers may be active on return from add_adapter() */
       adap->nr = pdev->id;
@@ -1106,7 +1137,9 @@ omap_i2c_probe(struct platform_device *pdev)
               goto err_free_irq;
       }

+#if defined(CONFIG_OF)
       of_i2c_register_devices(adap);
+#endif
Ditto here. of_i2c_register_devices() is an empty inline when !CONFIG_OF
quoted hunk ↗ jump to hunk
       return 0;
@@ -1162,6 +1195,16 @@ static int omap_i2c_resume(struct device *dev)
       return 0;
 }

+#if defined(CONFIG_OF)
+static const struct of_device_id omap_i2c_of_match[] = {
+       {.compatible = "ti,omap3-i2c", },
+       {},
+}
+MODULE_DEVICE_TABLE(of, omap_i2c_of_match);
+#else
+#define omap_i2c_of_match NULL
+#endif
You can move this whole block up to where omap_i2c_of_match is forward
declared, which will make the patch smaller.
quoted hunk ↗ jump to hunk
+
 static struct dev_pm_ops omap_i2c_pm_ops = {
       .suspend = omap_i2c_suspend,
       .resume = omap_i2c_resume,
@@ -1178,6 +1221,9 @@ static struct platform_driver omap_i2c_driver = {
               .name   = "omap_i2c",
               .owner  = THIS_MODULE,
               .pm     = OMAP_I2C_PM_OPS,
+#if defined(CONFIG_OF)
+               .of_match_table = omap_i2c_of_match,
+#endif
Drop the #if defined() protection.

g.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help