Merge tag 'lsk-v3.10-15.05-android' into develop-3.10
[firefly-linux-kernel-4.4.55.git] / drivers / usb / gadget / composite.c
index 6a87860a32b959882b23170e1ad9ef32b3a627f0..987a1e08ec7306cef1f86b5565780afc8b789d30 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/usb/composite.h>
 #include <asm/unaligned.h>
 
+static int gadget_connected = 0;
 /*
  * The code in this file is utility code, used to build a gadget driver
  * from one or more "function" drivers, one or more "configuration"
@@ -636,6 +637,9 @@ static int set_config(struct usb_composite_dev *cdev,
 
        cdev->config = c;
 
+       /* reset delay status to zero every time usb reconnect */
+       cdev->delayed_status = 0;
+
        /* Initialize all interfaces by setting them to altsetting zero. */
        for (tmp = 0; tmp < MAX_CONFIG_INTERFACES; tmp++) {
                struct usb_function     *f = c->interface[tmp];
@@ -695,6 +699,8 @@ static int set_config(struct usb_composite_dev *cdev,
 
        /* when we return, be sure our power usage is valid */
        power = c->MaxPower ? c->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
+       /* usb gadget connect flag */
+       gadget_connected = 1;
 done:
        usb_gadget_vbus_draw(gadget, power);
        if (result >= 0 && cdev->delayed_status)
@@ -1494,9 +1500,15 @@ void composite_disconnect(struct usb_gadget *gadget)
                reset_config(cdev);
        if (cdev->driver->disconnect)
                cdev->driver->disconnect(cdev);
+       /* usb gadget connect flag */
+       gadget_connected = 0;
        spin_unlock_irqrestore(&cdev->lock, flags);
 }
 
+int get_gadget_connect_flag( void )
+{
+       return gadget_connected;
+}
 /*-------------------------------------------------------------------------*/
 
 static ssize_t composite_show_suspended(struct device *dev,
@@ -1839,6 +1851,8 @@ void usb_composite_setup_continue(struct usb_composite_dev *cdev)
                        req->status = 0;
                        composite_setup_complete(cdev->gadget->ep0, req);
                }
+       }else{
+               WARN(cdev, "%s: Unexpected delayed status 0x%x\n", __func__, cdev->delayed_status);
        }
 
        spin_unlock_irqrestore(&cdev->lock, flags);