|
@@ -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),
|
|
|
}
|
|
|
};
|
|
|
|