]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
usb: xilinx: Enable ULPI phy detection for usb
authorMichal Simek <michal.simek@xilinx.com>
Mon, 26 Nov 2012 10:10:24 +0000 (11:10 +0100)
committerMichal Simek <michal.simek@xilinx.com>
Sun, 2 Dec 2012 19:37:09 +0000 (20:37 +0100)
Detect usb ulpi phys and set it up in pdata for others usb drivers.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/usb/host/Kconfig
drivers/usb/host/xusbps-dr-of.c
include/linux/xilinx_devices.h

index 1ad40ffb9fb38923af2687ef2884b9d163dab0dc..6cf3bd89045fa11ac2458a3fbeed155854ac18ce 100644 (file)
@@ -133,6 +133,8 @@ config XPS_USB_HCD_XILINX
 
 config USB_XUSBPS_DR_OF
        tristate
+       select USB_ULPI
+       select USB_ULPI_VIEWPORT
 
 config USB_EHCI_XUSBPS
        bool "Support for Xilinx PS EHCI USB controller"
index bf26360289f5cb52c1d839ef3c7581111902dac9..bc0e4af9f245b806ed01c0f989d411ca0429bbb2 100644 (file)
@@ -27,6 +27,9 @@
 #include <linux/of_platform.h>
 #include <linux/string.h>
 #include <linux/clk.h>
+#include <linux/usb/ulpi.h>
+
+#include "ehci-xilinx-usbps.h"
 
 static u64 dma_mask = 0xFFFFFFF0;
 
@@ -145,7 +148,7 @@ static int __devinit xusbps_dr_of_probe(struct platform_device *ofdev)
        const unsigned char *prop;
        static unsigned int idx;
        struct resource *res;
-       int i;
+       int i, phy_init;
 
        pdata = &data;
        memset(pdata, 0, sizeof(data));
@@ -184,6 +187,21 @@ static int __devinit xusbps_dr_of_probe(struct platform_device *ofdev)
        prop = of_get_property(np, "phy_type", NULL);
        pdata->phy_mode = determine_usb_phy(prop);
 
+       /* If ULPI phy type, set it up */
+       if (pdata->phy_mode == XUSBPS_USB2_PHY_ULPI) {
+               pdata->ulpi = otg_ulpi_create(&ulpi_viewport_access_ops,
+                       ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
+               if (pdata->ulpi)
+                       pdata->ulpi->io_priv = pdata->regs +
+                                                       XUSBPS_SOC_USB_ULPIVP;
+
+               phy_init = usb_phy_init(pdata->ulpi);
+               if (phy_init) {
+                       pr_info("Unable to init transceiver, missing?\n");
+                       return -ENODEV;
+               }
+       }
+
        for (i = 0; i < ARRAY_SIZE(dev_data->drivers); i++) {
                if (!dev_data->drivers[i])
                        continue;
index 454deed21a13fab5ff18e67fd5daaaf9ee780e7f..d3e8b60f97d685533b41ec3254cfc1d1a1b28600 100644 (file)
@@ -136,6 +136,7 @@ struct xusbps_usb2_platform_data {
        void            (*exit)(struct platform_device *);
        void __iomem    *regs;          /* ioremap'd register base */
        struct usb_phy  *otg;
+       struct usb_phy  *ulpi;
        int             irq;
        struct clk      *clk;
        unsigned        big_endian_mmio:1;