]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
dm: usb: Refactor port resets
authorSimon Glass <sjg@chromium.org>
Wed, 25 Mar 2015 18:22:04 +0000 (12:22 -0600)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 8 Sep 2015 19:47:53 +0000 (21:47 +0200)
Move the port reset code into its own function. Rename usb_hub_reset() to
indicate that is is now a legacy function.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marex@denx.de>
common/usb.c
common/usb_hub.c
include/usb.h

index df4e172ff806779a9c071199e6e016a51df9562d..8a3bb114ec5da55aeee4dc6557ce70456a4acc91 100644 (file)
@@ -877,6 +877,26 @@ __weak int usb_alloc_device(struct usb_device *udev)
 {
        return 0;
 }
+
+int usb_legacy_port_reset(struct usb_device *hub, int portnr)
+{
+       if (hub) {
+               unsigned short portstatus;
+               int err;
+
+               /* reset the port for the second time */
+               err = legacy_hub_port_reset(hub, portnr - 1, &portstatus);
+               if (err < 0) {
+                       printf("\n     Couldn't reset port %i\n", portnr);
+                       return err;
+               }
+       } else {
+               usb_reset_root_port();
+       }
+
+       return 0;
+}
+
 /*
  * By the time we get here, the device has gotten a new device ID
  * and is in the default state. We need to identify the thing and
@@ -913,9 +933,6 @@ int usb_new_device(struct usb_device *dev)
         * http://sourceforge.net/mailarchive/forum.php?
         * thread_id=5729457&forum_id=5398
         */
-       __maybe_unused struct usb_device_descriptor *desc;
-       struct usb_device *parent = dev->parent;
-       unsigned short portstatus;
 
        /*
         * send 64-byte GET-DEVICE-DESCRIPTOR request.  Since the descriptor is
@@ -923,7 +940,6 @@ int usb_new_device(struct usb_device *dev)
         * the maxpacket size is 8 or 16 the device may be waiting to transmit
         * some more, or keeps on retransmitting the 8 byte header. */
 
-       desc = (struct usb_device_descriptor *)tmpbuf;
        dev->descriptor.bMaxPacketSize0 = 64;       /* Start off at 64 bytes  */
        /* Default to 64 byte max packet size */
        dev->maxpacketsize = PACKET_SIZE_64;
@@ -937,6 +953,9 @@ int usb_new_device(struct usb_device *dev)
         * of that is done for XHCI unlike EHCI.
         */
 #ifndef CONFIG_USB_XHCI
+       struct usb_device_descriptor *desc;
+
+       desc = (struct usb_device_descriptor *)tmpbuf;
        err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
        /*
         * Validate we've received only at least 8 bytes, not that we've
@@ -966,16 +985,9 @@ int usb_new_device(struct usb_device *dev)
        dev->descriptor.bDeviceClass = desc->bDeviceClass;
 #endif
 
-       if (parent) {
-               /* reset the port for the second time */
-               err = hub_port_reset(dev->parent, dev->portnr - 1, &portstatus);
-               if (err < 0) {
-                       printf("\n     Couldn't reset port %i\n", dev->portnr);
-                       return -EIO;
-               }
-       } else {
-               usb_reset_root_port();
-       }
+       err = usb_legacy_port_reset(dev->parent, dev->portnr);
+       if (err)
+               return err;
 
        dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
        dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
index 020cdc6605ea8f5cc19bf4bf4e38d97692061a26..2277e6f806a16add7fd63a8651eb9d4520124ea3 100644 (file)
@@ -149,7 +149,7 @@ static inline char *portspeed(int portstatus)
        return speed_str;
 }
 
-int hub_port_reset(struct usb_device *dev, int port,
+int legacy_hub_port_reset(struct usb_device *dev, int port,
                        unsigned short *portstat)
 {
        int tries;
@@ -249,7 +249,7 @@ int usb_hub_port_connect_change(struct usb_device *dev, int port)
        mdelay(200);
 
        /* Reset the port */
-       ret = hub_port_reset(dev, port, &portstatus);
+       ret = legacy_hub_port_reset(dev, port, &portstatus);
        if (ret < 0) {
                printf("cannot reset port %i!?\n", port + 1);
                return ret;
index 8cedaa23f8ca2cf46f32155b4ebf3dbcd6a7388e..9625148b5142584799c3991c60dd977e794b2d5a 100644 (file)
@@ -700,9 +700,25 @@ bool usb_device_has_child_on_port(struct usb_device *parent, int port);
 
 int usb_hub_probe(struct usb_device *dev, int ifnum);
 void usb_hub_reset(void);
-int hub_port_reset(struct usb_device *dev, int port,
+
+/**
+ * legacy_hub_port_reset() - reset a port given its usb_device pointer
+ *
+ * Reset a hub port and see if a device is present on that port, providing
+ * sufficient time for it to show itself. The port status is returned.
+ *
+ * With driver model this moves to hub_port_reset() and is passed a struct
+ * udevice.
+ *
+ * @dev:       USB device to reset
+ * @port:      Port number to reset (note ports are numbered from 0 here)
+ * @portstat:  Returns port status
+ */
+int legacy_hub_port_reset(struct usb_device *dev, int port,
                          unsigned short *portstat);
 
+int hub_port_reset(struct udevice *dev, int port, unsigned short *portstat);
+
 /**
  * usb_alloc_new_device() - Allocate a new device
  *