i2c: omap: adopt pinctrl support
authorSebastien Guiriec <s-guiriec@ti.com>
Tue, 16 Oct 2012 15:23:20 +0000 (15:23 +0000)
committerWolfram Sang <w.sang@pengutronix.de>
Wed, 14 Nov 2012 16:44:37 +0000 (17:44 +0100)
Some GPIO expanders need some early pin control muxing. Due to
legacy boards sometimes the driver uses subsys_initcall instead of
module_init. This patch takes advantage of defer probe feature
and pin control in order to wait until pin control probing before
GPIO driver probing. It has been tested on OMAP5 board with TCA6424
driver.

Signed-off-by: Sebastien Guiriec <s-guiriec@ti.com>
Acked-by: Shubhrajyoti D <shubhrajyoti@ti.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
drivers/i2c/busses/i2c-omap.c

index 3525c9e..16afb28 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/slab.h>
 #include <linux/i2c-omap.h>
 #include <linux/pm_runtime.h>
+#include <linux/pinctrl/consumer.h>
 
 /* I2C controller revisions */
 #define OMAP_I2C_OMAP1_REV_2           0x20
@@ -213,6 +214,8 @@ struct omap_i2c_dev {
        u16                     syscstate;
        u16                     westate;
        u16                     errata;
+
+       struct pinctrl          *pins;
 };
 
 static const u8 reg_map_ip_v1[] = {
@@ -1104,6 +1107,16 @@ omap_i2c_probe(struct platform_device *pdev)
                dev->dtrev = pdata->rev;
        }
 
+       dev->pins = devm_pinctrl_get_select_default(&pdev->dev);
+       if (IS_ERR(dev->pins)) {
+               if (PTR_ERR(dev->pins) == -EPROBE_DEFER)
+                       return -EPROBE_DEFER;
+
+               dev_warn(&pdev->dev, "did not get pins for i2c error: %li\n",
+                        PTR_ERR(dev->pins));
+               dev->pins = NULL;
+       }
+
        dev->dev = &pdev->dev;
        dev->irq = irq;