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