mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-29 07:34:06 +08:00
usb: gadget: s3c-hsotg: fix disconnect handling
This patch moves s3c_hsotg_disconnect function call from USBSusp interrupt handler to SET_ADDRESS request handler. It's because disconnected state can't be detected directly, because this hardware doesn't support Disconnected interrupt for device mode. For both Suspend and Disconnect events there is one interrupt USBSusp, but calling s3c_hsotg_disconnect from this interrupt handler causes config reset in composite layer, which is not undesirable for Suspended state. For this reason s3c_hsotg_disconnect is called from SET_ADDRESS request handler, which occurs always after disconnection, so we do disconnect immediately before we are connected again. It's probably only way we can do handle disconnection correctly. Signed-off-by: Robert Baldyga <r.baldyga@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
93f599f279
commit
d18f7116a5
@ -1180,6 +1180,7 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg *hsotg,
|
||||
}
|
||||
|
||||
static void s3c_hsotg_enqueue_setup(struct s3c_hsotg *hsotg);
|
||||
static void s3c_hsotg_disconnect(struct s3c_hsotg *hsotg);
|
||||
|
||||
/**
|
||||
* s3c_hsotg_process_control - process a control request
|
||||
@ -1221,6 +1222,7 @@ static void s3c_hsotg_process_control(struct s3c_hsotg *hsotg,
|
||||
if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
|
||||
switch (ctrl->bRequest) {
|
||||
case USB_REQ_SET_ADDRESS:
|
||||
s3c_hsotg_disconnect(hsotg);
|
||||
dcfg = readl(hsotg->regs + DCFG);
|
||||
dcfg &= ~DCFG_DevAddr_MASK;
|
||||
dcfg |= ctrl->wValue << DCFG_DevAddr_SHIFT;
|
||||
@ -2537,7 +2539,6 @@ irq_retry:
|
||||
writel(GINTSTS_USBSusp, hsotg->regs + GINTSTS);
|
||||
|
||||
call_gadget(hsotg, suspend);
|
||||
s3c_hsotg_disconnect(hsotg);
|
||||
}
|
||||
|
||||
if (gintsts & GINTSTS_WkUpInt) {
|
||||
|
Loading…
Reference in New Issue
Block a user