Commit 36e893d2 authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

usb gadget: USB_GADGET_VBUS_DRAW Kconfig option

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: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Cc: Justin Clacherty <justin@redfish-group.com>
Tested-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 02582b92
...@@ -45,7 +45,7 @@ if USB_GADGET ...@@ -45,7 +45,7 @@ if USB_GADGET
config USB_GADGET_DEBUG config USB_GADGET_DEBUG
boolean "Debugging messages (DEVELOPMENT)" boolean "Debugging messages (DEVELOPMENT)"
depends on USB_GADGET && DEBUG_KERNEL depends on DEBUG_KERNEL
help help
Many controller and gadget drivers will print some debugging Many controller and gadget drivers will print some debugging
messages if you use this option to ask for those messages. messages if you use this option to ask for those messages.
...@@ -59,7 +59,7 @@ config USB_GADGET_DEBUG ...@@ -59,7 +59,7 @@ config USB_GADGET_DEBUG
config USB_GADGET_DEBUG_FILES config USB_GADGET_DEBUG_FILES
boolean "Debugging information files (DEVELOPMENT)" boolean "Debugging information files (DEVELOPMENT)"
depends on USB_GADGET && PROC_FS depends on PROC_FS
help help
Some of the drivers in the "gadget" framework can expose Some of the drivers in the "gadget" framework can expose
debugging information in files such as /proc/driver/udc debugging information in files such as /proc/driver/udc
...@@ -70,7 +70,7 @@ config USB_GADGET_DEBUG_FILES ...@@ -70,7 +70,7 @@ config USB_GADGET_DEBUG_FILES
config USB_GADGET_DEBUG_FS config USB_GADGET_DEBUG_FS
boolean "Debugging information files in debugfs (DEVELOPMENT)" boolean "Debugging information files in debugfs (DEVELOPMENT)"
depends on USB_GADGET && DEBUG_FS depends on DEBUG_FS
help help
Some of the drivers in the "gadget" framework can expose Some of the drivers in the "gadget" framework can expose
debugging information in files under /sys/kernel/debug/. debugging information in files under /sys/kernel/debug/.
...@@ -79,6 +79,23 @@ config USB_GADGET_DEBUG_FS ...@@ -79,6 +79,23 @@ config USB_GADGET_DEBUG_FS
Enable these files by choosing "Y" here. If in doubt, or Enable these files by choosing "Y" here. If in doubt, or
to conserve kernel memory, say "N". 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 config USB_GADGET_SELECTED
boolean boolean
......
...@@ -155,7 +155,6 @@ static struct usb_configuration cdc_config_driver = { ...@@ -155,7 +155,6 @@ static struct usb_configuration cdc_config_driver = {
.bConfigurationValue = 1, .bConfigurationValue = 1,
/* .iConfiguration = DYNAMIC */ /* .iConfiguration = DYNAMIC */
.bmAttributes = USB_CONFIG_ATT_SELFPOWER, .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
.bMaxPower = 1, /* 2 mA, minimal */
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -245,7 +245,7 @@ static int config_buf(struct usb_configuration *config, ...@@ -245,7 +245,7 @@ static int config_buf(struct usb_configuration *config,
c->bConfigurationValue = config->bConfigurationValue; c->bConfigurationValue = config->bConfigurationValue;
c->iConfiguration = config->iConfiguration; c->iConfiguration = config->iConfiguration;
c->bmAttributes = USB_CONFIG_ATT_ONE | config->bmAttributes; 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 */ /* There may be e.g. OTG descriptors */
if (config->descriptors) { if (config->descriptors) {
...@@ -432,7 +432,7 @@ static int set_config(struct usb_composite_dev *cdev, ...@@ -432,7 +432,7 @@ static int set_config(struct usb_composite_dev *cdev,
} }
/* when we return, be sure our power usage is valid */ /* 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: done:
usb_gadget_vbus_draw(gadget, power); usb_gadget_vbus_draw(gadget, power);
return result; return result;
......
...@@ -242,7 +242,6 @@ static struct usb_configuration rndis_config_driver = { ...@@ -242,7 +242,6 @@ static struct usb_configuration rndis_config_driver = {
.bConfigurationValue = 2, .bConfigurationValue = 2,
/* .iConfiguration = DYNAMIC */ /* .iConfiguration = DYNAMIC */
.bmAttributes = USB_CONFIG_ATT_SELFPOWER, .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
.bMaxPower = 1, /* 2 mA, minimal */
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -271,7 +270,6 @@ static struct usb_configuration eth_config_driver = { ...@@ -271,7 +270,6 @@ static struct usb_configuration eth_config_driver = {
.bConfigurationValue = 1, .bConfigurationValue = 1,
/* .iConfiguration = DYNAMIC */ /* .iConfiguration = DYNAMIC */
.bmAttributes = USB_CONFIG_ATT_SELFPOWER, .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
.bMaxPower = 1, /* 2 mA, minimal */
}; };
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -352,7 +352,6 @@ static struct usb_configuration loopback_driver = { ...@@ -352,7 +352,6 @@ static struct usb_configuration loopback_driver = {
.bind = loopback_bind_config, .bind = loopback_bind_config,
.bConfigurationValue = 2, .bConfigurationValue = 2,
.bmAttributes = USB_CONFIG_ATT_SELFPOWER, .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
.bMaxPower = 1, /* 2 mA, minimal */
/* .iConfiguration = DYNAMIC */ /* .iConfiguration = DYNAMIC */
}; };
......
...@@ -552,7 +552,6 @@ static struct usb_configuration sourcesink_driver = { ...@@ -552,7 +552,6 @@ static struct usb_configuration sourcesink_driver = {
.setup = sourcesink_setup, .setup = sourcesink_setup,
.bConfigurationValue = 3, .bConfigurationValue = 3,
.bmAttributes = USB_CONFIG_ATT_SELFPOWER, .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
.bMaxPower = 1, /* 2 mA, minimal */
/* .iConfiguration = DYNAMIC */ /* .iConfiguration = DYNAMIC */
}; };
......
...@@ -851,7 +851,7 @@ config_desc = { ...@@ -851,7 +851,7 @@ config_desc = {
.bConfigurationValue = CONFIG_VALUE, .bConfigurationValue = CONFIG_VALUE,
.iConfiguration = STRING_CONFIG, .iConfiguration = STRING_CONFIG,
.bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, .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 static struct usb_otg_descriptor
......
...@@ -222,7 +222,7 @@ static struct usb_config_descriptor config_desc = { ...@@ -222,7 +222,7 @@ static struct usb_config_descriptor config_desc = {
* power properties of the device. Is it selfpowered? * power properties of the device. Is it selfpowered?
*/ */
.bmAttributes = USB_CONFIG_ATT_ONE, .bmAttributes = USB_CONFIG_ATT_ONE,
.bMaxPower = 1, .bMaxPower = CONFIG_USB_GADGET_VBUS_DRAW / 2,
}; };
/* B.3.1 Standard AC Interface Descriptor */ /* B.3.1 Standard AC Interface Descriptor */
......
...@@ -252,7 +252,7 @@ static struct usb_config_descriptor config_desc = { ...@@ -252,7 +252,7 @@ static struct usb_config_descriptor config_desc = {
.bConfigurationValue = DEV_CONFIG_VALUE, .bConfigurationValue = DEV_CONFIG_VALUE,
.iConfiguration = 0, .iConfiguration = 0,
.bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER, .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 = { static struct usb_interface_descriptor intf_desc = {
...@@ -1476,7 +1476,6 @@ printer_bind(struct usb_gadget *gadget) ...@@ -1476,7 +1476,6 @@ printer_bind(struct usb_gadget *gadget)
if (gadget->is_otg) { if (gadget->is_otg) {
otg_desc.bmAttributes |= USB_OTG_HNP, otg_desc.bmAttributes |= USB_OTG_HNP,
config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP; config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP;
config_desc.bMaxPower = 4;
} }
spin_lock_init(&dev->lock); spin_lock_init(&dev->lock);
......
...@@ -159,7 +159,6 @@ static struct usb_configuration serial_config_driver = { ...@@ -159,7 +159,6 @@ static struct usb_configuration serial_config_driver = {
/* .bConfigurationValue = f(use_acm) */ /* .bConfigurationValue = f(use_acm) */
/* .iConfiguration = DYNAMIC */ /* .iConfiguration = DYNAMIC */
.bmAttributes = USB_CONFIG_ATT_SELFPOWER, .bmAttributes = USB_CONFIG_ATT_SELFPOWER,
.bMaxPower = 1, /* 2 mA, minimal */
}; };
static int __init gs_bind(struct usb_composite_dev *cdev) static int __init gs_bind(struct usb_composite_dev *cdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment