summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMayank Rana <mrana@codeaurora.org>2016-09-02 10:53:51 -0700
committerMayank Rana <mrana@codeaurora.org>2016-09-07 10:17:23 -0700
commite94b93aa7f4f34176a3a597c4a1829698aa87a83 (patch)
tree09545e1724138747392fed222cd6eff35cec53af
parent26745af0124e3ff541e01cd32fca2bddb97784bf (diff)
usb: composite: Draw 900mA on USB resume if speed is super-speed
Per USB 3.1 specification, USB device can draw upto 900mA when enumerated in super-speed mode and bus is resumed. Fix bug that is requesting 500mA when bus is resumed when bus is operating in super-speed mode. CRs-Fixed: 1063393 Change-Id: I585f4c560f0920d3cb56cce009297b5665abb42e Signed-off-by: Mayank Rana <mrana@codeaurora.org>
-rw-r--r--drivers/usb/gadget/composite.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index 3d17fd93c787..a99405261306 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -27,6 +27,14 @@
#define SSUSB_GADGET_VBUS_DRAW_UNITS 8
#define HSUSB_GADGET_VBUS_DRAW_UNITS 2
+/*
+ * Based on enumerated USB speed, draw power with set_config and resume
+ * HSUSB: 500mA, SSUSB: 900mA
+ */
+#define USB_VBUS_DRAW(speed)\
+ (speed == USB_SPEED_SUPER ?\
+ SSUSB_GADGET_VBUS_DRAW : CONFIG_USB_GADGET_VBUS_DRAW)
+
static bool enable_l1_for_hs;
module_param(enable_l1_for_hs, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(enable_l1_for_hs, "Enable support for L1 LPM for HS devices");
@@ -749,7 +757,6 @@ static int set_config(struct usb_composite_dev *cdev,
struct usb_gadget *gadget = cdev->gadget;
struct usb_configuration *c = NULL;
int result = -EINVAL;
- unsigned power = gadget_is_otg(gadget) ? 8 : 100;
int tmp;
/*
@@ -863,14 +870,8 @@ static int set_config(struct usb_composite_dev *cdev,
}
}
- /* Allow 900mA to draw with Super-Speed */
- if (gadget->speed == USB_SPEED_SUPER)
- power = SSUSB_GADGET_VBUS_DRAW;
- else
- power = CONFIG_USB_GADGET_VBUS_DRAW;
-
done:
- usb_gadget_vbus_draw(gadget, power);
+ usb_gadget_vbus_draw(gadget, USB_VBUS_DRAW(gadget->speed));
if (result >= 0 && cdev->delayed_status)
result = USB_GADGET_DELAYED_STATUS;
return result;
@@ -2319,7 +2320,6 @@ void composite_resume(struct usb_gadget *gadget)
{
struct usb_composite_dev *cdev = get_gadget_data(gadget);
struct usb_function *f;
- u16 maxpower;
int ret;
unsigned long flags;
@@ -2352,10 +2352,7 @@ void composite_resume(struct usb_gadget *gadget)
f->resume(f);
}
- maxpower = cdev->config->MaxPower;
-
- usb_gadget_vbus_draw(gadget, maxpower ?
- maxpower : CONFIG_USB_GADGET_VBUS_DRAW);
+ usb_gadget_vbus_draw(gadget, USB_VBUS_DRAW(gadget->speed));
}
spin_unlock_irqrestore(&cdev->lock, flags);