USB: Add DT probing support to ehci-spear and ohci-spear
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / usb / host / ehci-spear.c
index 6e928559169cb12551cb008a689034144a54d59d..2e3c89a96650931fb3dce6b68c54d409f9c871a6 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/clk.h>
 #include <linux/jiffies.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 
@@ -168,6 +169,8 @@ static int ehci_spear_drv_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(ehci_spear_pm_ops, ehci_spear_drv_suspend,
                ehci_spear_drv_resume);
 
+static u64 spear_ehci_dma_mask = DMA_BIT_MASK(32);
+
 static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
 {
        struct usb_hcd *hcd ;
@@ -175,12 +178,9 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
        struct resource *res;
        struct clk *usbh_clk;
        const struct hc_driver *driver = &ehci_spear_hc_driver;
-       int *pdata = pdev->dev.platform_data;
        int irq, retval;
        char clk_name[20] = "usbh_clk";
-
-       if (pdata == NULL)
-               return -EFAULT;
+       static int instance = -1;
 
        if (usb_disabled())
                return -ENODEV;
@@ -191,8 +191,22 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
                goto fail_irq_get;
        }
 
-       if (*pdata >= 0)
-               sprintf(clk_name, "usbh.%01d_clk", *pdata);
+       /*
+        * Right now device-tree probed devices don't get dma_mask set.
+        * Since shared usb code relies on it, set it here for now.
+        * Once we have dma capability bindings this can go away.
+        */
+       if (!pdev->dev.dma_mask)
+               pdev->dev.dma_mask = &spear_ehci_dma_mask;
+
+       /*
+        * Increment the device instance, when probing via device-tree
+        */
+       if (pdev->id < 0)
+               instance++;
+       else
+               instance = pdev->id;
+       sprintf(clk_name, "usbh.%01d_clk", instance);
 
        usbh_clk = clk_get(NULL, clk_name);
        if (IS_ERR(usbh_clk)) {
@@ -277,6 +291,11 @@ static int spear_ehci_hcd_drv_remove(struct platform_device *pdev)
        return 0;
 }
 
+static struct of_device_id spear_ehci_id_table[] __devinitdata = {
+       { .compatible = "st,spear600-ehci", },
+       { },
+};
+
 static struct platform_driver spear_ehci_hcd_driver = {
        .probe          = spear_ehci_hcd_drv_probe,
        .remove         = spear_ehci_hcd_drv_remove,
@@ -285,6 +304,7 @@ static struct platform_driver spear_ehci_hcd_driver = {
                .name = "spear-ehci",
                .bus = &platform_bus_type,
                .pm = &ehci_spear_pm_ops,
+               .of_match_table = of_match_ptr(spear_ehci_id_table),
        }
 };