config USB_GADGET_DEBUG
        boolean "Debugging messages (DEVELOPMENT)"
-       depends on USB_GADGET && DEBUG_KERNEL
+       depends on DEBUG_KERNEL
        help
           Many controller and gadget drivers will print some debugging
           messages if you use this option to ask for those messages.
 
 config USB_GADGET_DEBUG_FILES
        boolean "Debugging information files (DEVELOPMENT)"
-       depends on USB_GADGET && PROC_FS
+       depends on PROC_FS
        help
           Some of the drivers in the "gadget" framework can expose
           debugging information in files such as /proc/driver/udc
 
 config USB_GADGET_DEBUG_FS
        boolean "Debugging information files in debugfs (DEVELOPMENT)"
-       depends on USB_GADGET && DEBUG_FS
+       depends on DEBUG_FS
        help
           Some of the drivers in the "gadget" framework can expose
           debugging information in files under /sys/kernel/debug/.
           Enable these files by choosing "Y" here.  If in doubt, or
           to conserve kernel memory, say "N".
 
+config USB_GADGET_VBUS_DRAW
+       int "Maximum VBUS Power usage (2-500 mA)"
+       range 2 500
+       default 2
+       help
+          Some devices need to draw power from USB when they are
+          configured, perhaps to operate circuitry or to recharge
+          batteries.  This is in addition to any local power supply,
+          such as an AC adapter or batteries.
+
+          Enter the maximum power your device draws through USB, in
+          milliAmperes.  The permitted range of values is 2 - 500 mA;
+          0 mA would be legal, but can make some hosts misbehave.
+
+          This value will be used except for system-specific gadget
+          drivers that have more specific information.
+
 config USB_GADGET_SELECTED
        boolean
 
 
        .bConfigurationValue    = 1,
        /* .iConfiguration = DYNAMIC */
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower              = 1,    /* 2 mA, minimal */
 };
 
 /*-------------------------------------------------------------------------*/
 
        c->bConfigurationValue = config->bConfigurationValue;
        c->iConfiguration = config->iConfiguration;
        c->bmAttributes = USB_CONFIG_ATT_ONE | config->bmAttributes;
-       c->bMaxPower = config->bMaxPower;
+       c->bMaxPower = config->bMaxPower ? : (CONFIG_USB_GADGET_VBUS_DRAW / 2);
 
        /* There may be e.g. OTG descriptors */
        if (config->descriptors) {
        }
 
        /* when we return, be sure our power usage is valid */
-       power = 2 * c->bMaxPower;
+       power = c->bMaxPower ? (2 * c->bMaxPower) : CONFIG_USB_GADGET_VBUS_DRAW;
 done:
        usb_gadget_vbus_draw(gadget, power);
        return result;
 
        .bConfigurationValue    = 2,
        /* .iConfiguration = DYNAMIC */
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower              = 1,    /* 2 mA, minimal */
 };
 
 /*-------------------------------------------------------------------------*/
        .bConfigurationValue    = 1,
        /* .iConfiguration = DYNAMIC */
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower              = 1,    /* 2 mA, minimal */
 };
 
 /*-------------------------------------------------------------------------*/
 
        .bind           = loopback_bind_config,
        .bConfigurationValue = 2,
        .bmAttributes   = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower      = 1,    /* 2 mA, minimal */
        /* .iConfiguration = DYNAMIC */
 };
 
 
        .setup          = sourcesink_setup,
        .bConfigurationValue = 3,
        .bmAttributes   = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower      = 1,    /* 2 mA, minimal */
        /* .iConfiguration = DYNAMIC */
 };
 
 
        .bConfigurationValue =  CONFIG_VALUE,
        .iConfiguration =       STRING_CONFIG,
        .bmAttributes =         USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower =            1,      // self-powered
+       .bMaxPower =            CONFIG_USB_GADGET_VBUS_DRAW / 2,
 };
 
 static struct usb_otg_descriptor
 
         * power properties of the device. Is it selfpowered?
         */
        .bmAttributes =         USB_CONFIG_ATT_ONE,
-       .bMaxPower =            1,
+       .bMaxPower =            CONFIG_USB_GADGET_VBUS_DRAW / 2,
 };
 
 /* B.3.1  Standard AC Interface Descriptor */
 
        .bConfigurationValue =  DEV_CONFIG_VALUE,
        .iConfiguration =       0,
        .bmAttributes =         USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower =            1       /* Self-Powered */
+       .bMaxPower =            CONFIG_USB_GADGET_VBUS_DRAW / 2,
 };
 
 static struct usb_interface_descriptor intf_desc = {
        if (gadget->is_otg) {
                otg_desc.bmAttributes |= USB_OTG_HNP,
                config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
-               config_desc.bMaxPower = 4;
        }
 
        spin_lock_init(&dev->lock);
 
        /* .bConfigurationValue = f(use_acm) */
        /* .iConfiguration = DYNAMIC */
        .bmAttributes   = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower      = 1,    /* 2 mA, minimal */
 };
 
 static int __init gs_bind(struct usb_composite_dev *cdev)