diff options
author | ahcheng <ahcheng@nvidia.com> | 2012-02-22 17:26:09 +0800 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-03-30 09:18:35 -0700 |
commit | 18493b066ff8484fc3a928ddb95e1e51777d600f (patch) | |
tree | cc54afa8e23302f091e228909e5390b7924cd14e /drivers | |
parent | 56bf341335726cbfec392f7524ec0c393840335e (diff) |
usb: gadget: fsl_udc_core: Properly return the self-powered bit
This patch fixes the GetStatus always reports self powered.
As per USB compliance update, a device that is actively drawing
more than 100mA from USB must report itself as bus-powered in
the GetStatus(DEVICE) call.
Bug 928340
Change-Id: Iefd1577a2ff2f301add98b14a402ed8eacc3aa28
Signed-off-by: ahcheng <ahcheng@nvidia.com>
Reviewed-on: http://git-master/r/91404
Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/gadget/fsl_udc_core.c | 13 | ||||
-rw-r--r-- | drivers/usb/gadget/fsl_usb2_udc.h | 1 |
2 files changed, 12 insertions, 2 deletions
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 8737f8032cec..a406e32645d8 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -1352,6 +1352,14 @@ static int can_pullup(struct fsl_udc *udc) return udc->driver && udc->softconnect && udc->vbus_active; } +static int fsl_set_selfpowered(struct usb_gadget * gadget, int is_on) +{ + struct fsl_udc *udc; + udc = container_of(gadget, struct fsl_udc, gadget); + udc->selfpowered = (is_on != 0); + return 0; +} + /* Notify controller that VBUS is powered, Called by whatever detects VBUS sessions */ static int fsl_vbus_session(struct usb_gadget *gadget, int is_active) @@ -1477,7 +1485,7 @@ static struct usb_gadget_ops fsl_gadget_ops = { #ifndef CONFIG_USB_ANDROID .wakeup = fsl_wakeup, #endif -/* .set_selfpowered = fsl_set_selfpowered, */ /* Always selfpowered */ + .set_selfpowered = fsl_set_selfpowered, .vbus_session = fsl_vbus_session, .vbus_draw = fsl_vbus_draw, .pullup = fsl_pullup, @@ -1571,7 +1579,8 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value, if ((request_type & USB_RECIP_MASK) == USB_RECIP_DEVICE) { /* Get device status */ - tmp = 1 << USB_DEVICE_SELF_POWERED; + if (udc->selfpowered) + tmp = 1 << USB_DEVICE_SELF_POWERED; tmp |= udc->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP; } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_INTERFACE) { /* Get interface status */ diff --git a/drivers/usb/gadget/fsl_usb2_udc.h b/drivers/usb/gadget/fsl_usb2_udc.h index 0386be60ff79..62b26ed8c056 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.h +++ b/drivers/usb/gadget/fsl_usb2_udc.h @@ -620,6 +620,7 @@ struct fsl_udc { unsigned stopped:1; unsigned remote_wakeup:1; unsigned big_endian_desc:1; + unsigned selfpowered:1; struct ep_queue_head *ep_qh; /* Endpoints Queue-Head */ struct fsl_req *status_req; /* ep0 status request */ |