dm: usb: Allow setting up a USB controller as a device/gadget
authorSimon Glass <sjg@chromium.org>
Wed, 25 Mar 2015 18:22:32 +0000 (12:22 -0600)
committerSimon Glass <sjg@chromium.org>
Sat, 18 Apr 2015 17:11:25 +0000 (11:11 -0600)
Some controllers support OTG (on-the-go) where they can operate as either
host or device. The gadget layer in U-Boot supports this.

While this layer does not interact with driver model, we can provide a
function which sets up the controller in the correct way. This way the code
at least builds (although it likely will not work).

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
drivers/usb/gadget/ci_udc.c
drivers/usb/host/usb-uclass.c

index 3b7024c4986c63d5b116fa58f4761c6cbe1bdff3..22d288c711c8266b158e21973ea4110d893e706a 100644 (file)
@@ -883,7 +883,11 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
        if (driver->speed != USB_SPEED_FULL && driver->speed != USB_SPEED_HIGH)
                return -EINVAL;
 
+#ifdef CONFIG_DM_USB
+       ret = usb_setup_ehci_gadget(&controller.ctrl);
+#else
        ret = usb_lowlevel_init(0, USB_INIT_DEVICE, (void **)&controller.ctrl);
+#endif
        if (ret)
                return ret;
 
index fa5f14e7e27a9d8ad83ce31c6e135dd6c1a28dc5..29ef5d98e25f31462f9597af7ddb70651878a0f4 100644 (file)
@@ -249,6 +249,30 @@ int usb_legacy_port_reset(struct usb_device *parent, int portnr)
        return usb_port_reset(parent, portnr);
 }
 
+int usb_setup_ehci_gadget(struct ehci_ctrl **ctlrp)
+{
+       struct usb_platdata *plat;
+       struct udevice *dev;
+       int ret;
+
+       /* Find the old device and remove it */
+       ret = uclass_find_device_by_seq(UCLASS_USB, 0, true, &dev);
+       if (ret)
+               return ret;
+       ret = device_remove(dev);
+       if (ret)
+               return ret;
+
+       plat = dev_get_platdata(dev);
+       plat->init_type = USB_INIT_DEVICE;
+       ret = device_probe(dev);
+       if (ret)
+               return ret;
+       *ctlrp = dev_get_priv(dev);
+
+       return 0;
+}
+
 /* returns 0 if no match, 1 if match */
 int usb_match_device(const struct usb_device_descriptor *desc,
                     const struct usb_device_id *id)