usb: twl4030: Add device tree support for twl4030 usb
authorKishon Vijay Abraham I <kishon@ti.com>
Thu, 6 Sep 2012 14:57:09 +0000 (20:27 +0530)
committerFelipe Balbi <balbi@ti.com>
Thu, 6 Sep 2012 17:16:07 +0000 (20:16 +0300)
Add device tree support for twl4030 usb driver.
Update the Documentation with device tree binding information.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Documentation/devicetree/bindings/usb/twlxxxx-usb.txt
drivers/usb/otg/twl4030-usb.c

index 930f9ff2952a6c3a9471f2dcce1c3f8197a65b88..36b9aede3f40d04b4b173ffede953b3b226135ea 100644 (file)
@@ -19,3 +19,22 @@ Board specific device node entry
 &twl6030-usb {
        usb-supply = <&vusb>;
 };
+
+TWL4030 USB PHY AND COMPARATOR
+ - compatible : Should be "ti,twl4030-usb"
+ - interrupts : The interrupt numbers to the cpu should be specified. First
+   interrupt number is the otg interrupt number that raises ID interrupts
+   and VBUS interrupts. The second interrupt number is optional.
+ - <supply-name>-supply : phandle to the regulator device tree node.
+   <supply-name> should be vusb1v5, vusb1v8 and vusb3v1
+ - usb_mode : The mode used by the phy to connect to the controller. "1"
+   specifies "ULPI" mode and "2" specifies "CEA2011_3PIN" mode.
+
+twl4030-usb {
+       compatible = "ti,twl4030-usb";
+       interrupts = < 10 4 >;
+       usb1v5-supply = <&vusb1v5>;
+       usb1v8-supply = <&vusb1v8>;
+       usb3v1-supply = <&vusb3v1>;
+       usb_mode = <1>;
+};
index 523cad5bfea947deca4d288a338cc3acc4c9c3a1..f0d2e7530cfea4ecb01bdec31411de4afd1e7097 100644 (file)
@@ -585,23 +585,28 @@ static int __devinit twl4030_usb_probe(struct platform_device *pdev)
        struct twl4030_usb      *twl;
        int                     status, err;
        struct usb_otg          *otg;
-
-       if (!pdata) {
-               dev_dbg(&pdev->dev, "platform_data not available\n");
-               return -EINVAL;
-       }
+       struct device_node      *np = pdev->dev.of_node;
 
        twl = devm_kzalloc(&pdev->dev, sizeof *twl, GFP_KERNEL);
        if (!twl)
                return -ENOMEM;
 
+       if (np)
+               of_property_read_u32(np, "usb_mode",
+                               (enum twl4030_usb_mode *)&twl->usb_mode);
+       else if (pdata)
+               twl->usb_mode = pdata->usb_mode;
+       else {
+               dev_err(&pdev->dev, "twl4030 initialized without pdata\n");
+               return -EINVAL;
+       }
+
        otg = devm_kzalloc(&pdev->dev, sizeof *otg, GFP_KERNEL);
        if (!otg)
                return -ENOMEM;
 
        twl->dev                = &pdev->dev;
        twl->irq                = platform_get_irq(pdev, 0);
-       twl->usb_mode           = pdata->usb_mode;
        twl->vbus_supplied      = false;
        twl->asleep             = 1;
        twl->linkstat           = OMAP_MUSB_UNKNOWN;
@@ -690,12 +695,21 @@ static int __exit twl4030_usb_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_OF
+static const struct of_device_id twl4030_usb_id_table[] = {
+       { .compatible = "ti,twl4030-usb" },
+       {}
+};
+MODULE_DEVICE_TABLE(of, twl4030_usb_id_table);
+#endif
+
 static struct platform_driver twl4030_usb_driver = {
        .probe          = twl4030_usb_probe,
        .remove         = __exit_p(twl4030_usb_remove),
        .driver         = {
                .name   = "twl4030_usb",
                .owner  = THIS_MODULE,
+               .of_match_table = of_match_ptr(twl4030_usb_id_table),
        },
 };