return submit_urb(&hcd, urb);
 }
 
-int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
+void usb_reset_root_port(void)
 {
+       void *mbase = host->mregs;
        u8 power;
+
+       power = musb_readb(mbase, MUSB_POWER);
+       power &= 0xf0;
+       musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);
+       mdelay(50);
+       power = musb_readb(mbase, MUSB_POWER);
+       musb_writeb(mbase, MUSB_POWER, ~MUSB_POWER_RESET & power);
+       host->isr(0, host);
+       host_speed = (musb_readb(mbase, MUSB_POWER) & MUSB_POWER_HSMODE) ?
+                       USB_SPEED_HIGH :
+                       (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_FSDEV) ?
+                       USB_SPEED_FULL : USB_SPEED_LOW;
+       mdelay((host_speed == USB_SPEED_LOW) ? 200 : 50);
+}
+
+int usb_lowlevel_init(int index, enum usb_init_type init, void **controller)
+{
        void *mbase;
        /* USB spec says it may take up to 1 second for a device to connect */
        unsigned long timeout = get_timer(0) + 1000;
        if (get_timer(0) >= timeout)
                return -ENODEV;
 
-       power = musb_readb(mbase, MUSB_POWER);
-       musb_writeb(mbase, MUSB_POWER, MUSB_POWER_RESET | power);
-       udelay(30000);
-       power = musb_readb(mbase, MUSB_POWER);
-       musb_writeb(mbase, MUSB_POWER, ~MUSB_POWER_RESET & power);
-       host->isr(0, host);
-       host_speed = (musb_readb(mbase, MUSB_POWER) & MUSB_POWER_HSMODE) ?
-                       USB_SPEED_HIGH :
-                       (musb_readb(mbase, MUSB_DEVCTL) & MUSB_DEVCTL_FSDEV) ?
-                       USB_SPEED_FULL : USB_SPEED_LOW;
+       usb_reset_root_port();
        host->is_active = 1;
        hcd.hcd_priv = host;
 
 
 
 int usb_lowlevel_init(int index, enum usb_init_type init, void **controller);
 int usb_lowlevel_stop(int index);
+#ifdef CONFIG_MUSB_HOST
+void usb_reset_root_port(void);
+#else
+#define usb_reset_root_port()
+#endif
 
 int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
                        void *buffer, int transfer_len);