Fix the real issue with AMS bootloader USB mode. A call to usb_enable was missing in usb.c when using the USB stack and USB_DETECT_BY_CORE was not enabled. Try to do it in a clean-ish way.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31245 a1c6a512-1295-4272-9138-f99709370657
diff --git a/bootloader/sansa_as3525.c b/bootloader/sansa_as3525.c
index 7b0a8b8..c384007 100644
--- a/bootloader/sansa_as3525.c
+++ b/bootloader/sansa_as3525.c
@@ -63,10 +63,8 @@
                 (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
     lcd_update();
 
-    usb_enable(true);
     while(usb_detect() == USB_INSERTED)
         sleep(HZ);
-    usb_enable(false);
 
     reset_screen();
     lcd_update();
diff --git a/firmware/usb.c b/firmware/usb.c
index bb19850..c7326c5 100644
--- a/firmware/usb.c
+++ b/firmware/usb.c
@@ -135,6 +135,11 @@
 
 
 #ifdef HAVE_USBSTACK
+/* Enable / disable USB when the stack is enabled - otherwise a noop */
+static inline void usb_stack_enable(bool enable)
+{
+    usb_enable(enable);
+}
 
 #ifdef HAVE_HOTSWAP
 static inline void usb_handle_hotswap(long id)
@@ -222,7 +227,6 @@
     }
     else /* usb_state == USB_INSERTED (only!) */
     {
-        usb_enable(false);
 #ifdef HAVE_PRIORITY_SCHEDULING
         thread_set_priority(thread_self(), PRIORITY_SYSTEM);
 #endif
@@ -254,6 +258,11 @@
 
 #else  /* !HAVE_USBSTACK */
 
+static inline void usb_stack_enable(bool enable)
+{
+    (void)enable;
+}
+
 #ifdef HAVE_HOTSWAP
 static inline void usb_handle_hotswap(long id)
 {
@@ -403,6 +412,7 @@
                 break;
 
             usb_state = USB_POWERED;
+            usb_stack_enable(true);
 #endif /* USB_DETECT_BY_CORE */
 
             if(usb_power_button())
@@ -467,20 +477,19 @@
                 break;
 
             usb_state = USB_POWERED;
-            usb_enable(true);
+            usb_stack_enable(true);
             break;
             /* USB_POWERED: */
 
         case USB_UNPOWERED:
-            if(usb_state == USB_POWERED)
-                usb_enable(false);
-            /* Fall-through - other legal states can be USB_INSERTED or
-               USB_SCREENDUMP */
 #endif /* USB_DETECT_BY_CORE */
         case USB_EXTRACTED:
             if(usb_state == USB_EXTRACTED)
                 break;
 
+            if(usb_state == USB_POWERED || usb_state == USB_INSERTED)
+                usb_stack_enable(false);
+
             /* Only disable the USB slave mode if we really have enabled
                it. Some expected acks may not have been received. */
             if(usb_state == USB_INSERTED)