From: Michael Walle <mich...@walle.cc>

Signed-off-by: Michael Walle <mich...@walle.cc>
Signed-off-by: Jason Cooper <ja...@lakedaemon.net>
---
 .../devicetree/bindings/usb/ehci-orion.txt         |    5 ++
 drivers/usb/host/ehci-orion.c                      |   50 +++++++++++++++++++-
 2 files changed, 53 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/usb/ehci-orion.txt

diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt 
b/Documentation/devicetree/bindings/usb/ehci-orion.txt
new file mode 100644
index 0000000..b46d825
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/ehci-orion.txt
@@ -0,0 +1,5 @@
+Marvell Orion SoC USB controller
+
+Required properties :
+ - compatible : should be "mrvl,orion-ehci".
+ - phy_version : should be "orion".
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
index 6c6a5a3..f1dec1d 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -12,6 +12,8 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/mbus.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 #include <plat/ehci-orion.h>
 
 #define rdl(off)       __raw_readl(hcd->regs + (off))
@@ -191,6 +193,29 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
        }
 }
 
+static const char *phy_versions[] = {
+       [EHCI_PHY_NA]           = "",
+       [EHCI_PHY_ORION]        = "orion",
+       [EHCI_PHY_DD]           = "dd", /* XXX dd? */
+       [EHCI_PHY_KW]           = "kirkwood",
+};
+
+static const int get_phy_version(struct device_node *np)
+{
+       const char *pm;
+       int err, i;
+
+       err = of_property_read_string(np, "phy-version", &pm);
+       if (err < 0)
+               return err;
+
+       for (i = 0; i < ARRAY_SIZE(phy_versions); i++)
+               if (!strcasecmp(pm, phy_versions[i]))
+                       return i;
+
+       return -ENODEV;
+}
+
 static int __devinit ehci_orion_drv_probe(struct platform_device *pdev)
 {
        struct orion_ehci_data *pd = pdev->dev.platform_data;
@@ -200,6 +225,7 @@ static int __devinit ehci_orion_drv_probe(struct 
platform_device *pdev)
        struct ehci_hcd *ehci;
        void __iomem *regs;
        int irq, err;
+       enum orion_ehci_phy_ver phy_version;
 
        if (usb_disabled())
                return -ENODEV;
@@ -267,7 +293,15 @@ static int __devinit ehci_orion_drv_probe(struct 
platform_device *pdev)
        /*
         * setup Orion USB controller.
         */
-       switch (pd->phy_version) {
+       if (pdev->dev.of_node) {
+               phy_version = get_phy_version(pdev->dev.of_node);
+               if (phy_version < 0)
+                       goto err3;
+       } else {
+               phy_version = pd->phy_version;
+       }
+
+       switch (phy_version) {
        case EHCI_PHY_NA:       /* dont change USB phy settings */
                break;
        case EHCI_PHY_ORION:
@@ -312,9 +346,21 @@ static int __exit ehci_orion_drv_remove(struct 
platform_device *pdev)
 
 MODULE_ALIAS("platform:orion-ehci");
 
+#ifdef CONFIG_OF
+static const struct of_device_id ehci_orion_dt_ids[] __devinitdata = {
+       { .compatible = "mrvl,orion-ehci", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, ehci_orion_dt_ids);
+#endif
+
 static struct platform_driver ehci_orion_driver = {
        .probe          = ehci_orion_drv_probe,
        .remove         = __exit_p(ehci_orion_drv_remove),
        .shutdown       = usb_hcd_platform_shutdown,
-       .driver.name    = "orion-ehci",
+       .driver = {
+               .name   = "orion-ehci",
+               .owner = THIS_MODULE,
+               .of_match_table = of_match_ptr(ehci_orion_dt_ids),
+       },
 };
-- 
1.7.3.4

_______________________________________________
devicetree-discuss mailing list
devicetree-discuss@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/devicetree-discuss

Reply via email to