return value;
 }
 
-void composite_disconnect(struct usb_gadget *gadget)
+static void __composite_disconnect(struct usb_gadget *gadget)
 {
        struct usb_composite_dev        *cdev = get_gadget_data(gadget);
        unsigned long                   flags;
        spin_unlock_irqrestore(&cdev->lock, flags);
 }
 
+void composite_disconnect(struct usb_gadget *gadget)
+{
+       usb_gadget_vbus_draw(gadget, 0);
+       __composite_disconnect(gadget);
+}
+
+void composite_reset(struct usb_gadget *gadget)
+{
+       /*
+        * Section 1.4.13 Standard Downstream Port of the USB battery charging
+        * specification v1.2 states that a device connected on a SDP shall only
+        * draw at max 100mA while in a connected, but unconfigured state.
+        */
+       usb_gadget_vbus_draw(gadget, 100);
+       __composite_disconnect(gadget);
+}
+
 /*-------------------------------------------------------------------------*/
 
 static ssize_t suspended_show(struct device *dev, struct device_attribute *attr,
        .unbind         = composite_unbind,
 
        .setup          = composite_setup,
-       .reset          = composite_disconnect,
+       .reset          = composite_reset,
        .disconnect     = composite_disconnect,
 
        .suspend        = composite_suspend,
 
 extern int usb_string_ids_n(struct usb_composite_dev *c, unsigned n);
 
 extern void composite_disconnect(struct usb_gadget *gadget);
+extern void composite_reset(struct usb_gadget *gadget);
+
 extern int composite_setup(struct usb_gadget *gadget,
                const struct usb_ctrlrequest *ctrl);
 extern void composite_suspend(struct usb_gadget *gadget);