usb gadget: USB_GADGET_VBUS_DRAW Kconfig option
David Brownell [Fri, 12 Sep 2008 16:39:06 +0000 (09:39 -0700)]
Offer a "how much VBUS power to request" configuration option
for USB gadgets that aren't using board-specific customization
of their gadget or (composite) configuration drivers.

Also remove a couple pointless "depends on USB_GADGET" bits
from the Kconfig text; booleans inside an "if USB_GADGET" will
already have that dependency.

Based on a patch from Justin Clacherty.

Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Cc: Justin Clacherty <justin@redfish-group.com>
Tested-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

drivers/usb/gadget/Kconfig
drivers/usb/gadget/cdc2.c
drivers/usb/gadget/composite.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/f_loopback.c
drivers/usb/gadget/f_sourcesink.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/gmidi.c
drivers/usb/gadget/printer.c
drivers/usb/gadget/serial.c

index c0dfd9b..1a72715 100644 (file)
@@ -45,7 +45,7 @@ if USB_GADGET
 
 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.
@@ -59,7 +59,7 @@ config USB_GADGET_DEBUG
 
 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
@@ -70,7 +70,7 @@ config USB_GADGET_DEBUG_FILES
 
 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/.
@@ -79,6 +79,23 @@ config USB_GADGET_DEBUG_FS
           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
 
index a724fc1..5495b17 100644 (file)
@@ -155,7 +155,6 @@ static struct usb_configuration cdc_config_driver = {
        .bConfigurationValue    = 1,
        /* .iConfiguration = DYNAMIC */
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower              = 1,    /* 2 mA, minimal */
 };
 
 /*-------------------------------------------------------------------------*/
index f79fdb8..f2da026 100644 (file)
@@ -245,7 +245,7 @@ static int config_buf(struct usb_configuration *config,
        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) {
@@ -432,7 +432,7 @@ static int set_config(struct usb_composite_dev *cdev,
        }
 
        /* 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;
index 944c8e8..37252d0 100644 (file)
@@ -242,7 +242,6 @@ static struct usb_configuration rndis_config_driver = {
        .bConfigurationValue    = 2,
        /* .iConfiguration = DYNAMIC */
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower              = 1,    /* 2 mA, minimal */
 };
 
 /*-------------------------------------------------------------------------*/
@@ -271,7 +270,6 @@ static struct usb_configuration eth_config_driver = {
        .bConfigurationValue    = 1,
        /* .iConfiguration = DYNAMIC */
        .bmAttributes           = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower              = 1,    /* 2 mA, minimal */
 };
 
 /*-------------------------------------------------------------------------*/
index 87dde01..8affe1d 100644 (file)
@@ -352,7 +352,6 @@ static struct usb_configuration loopback_driver = {
        .bind           = loopback_bind_config,
        .bConfigurationValue = 2,
        .bmAttributes   = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower      = 1,    /* 2 mA, minimal */
        /* .iConfiguration = DYNAMIC */
 };
 
index f18c3a1..dc84d26 100644 (file)
@@ -552,7 +552,6 @@ static struct usb_configuration sourcesink_driver = {
        .setup          = sourcesink_setup,
        .bConfigurationValue = 3,
        .bmAttributes   = USB_CONFIG_ATT_SELFPOWER,
-       .bMaxPower      = 1,    /* 2 mA, minimal */
        /* .iConfiguration = DYNAMIC */
 };
 
index e0f616f..c4e62a6 100644 (file)
@@ -851,7 +851,7 @@ config_desc = {
        .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
index 6eee760..60d3f9e 100644 (file)
@@ -222,7 +222,7 @@ static struct usb_config_descriptor config_desc = {
         * 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 */
index 00b7ed5..5a3034f 100644 (file)
@@ -252,7 +252,7 @@ static struct usb_config_descriptor config_desc = {
        .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 = {
@@ -1476,7 +1476,6 @@ autoconf_fail:
        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);
index 2dee848..37879af 100644 (file)
@@ -159,7 +159,6 @@ static struct usb_configuration serial_config_driver = {
        /* .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)