mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 00:17:44 +00:00
usb: gadget: mv_udc: rewrite fifo flush
1: Add parameter check. 2: For controller endpoint, we need to flush in and out directions. 3: delete redundant code, make it more readable. Signed-off-by: Neil Zhang <zhangwm@marvell.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
615268b05f
commit
0c70840b22
1 changed files with 18 additions and 27 deletions
|
@ -681,37 +681,28 @@ static void mv_ep_fifo_flush(struct usb_ep *_ep)
|
|||
{
|
||||
struct mv_udc *udc;
|
||||
u32 bit_pos, direction;
|
||||
struct mv_ep *ep = container_of(_ep, struct mv_ep, ep);
|
||||
struct mv_ep *ep;
|
||||
unsigned int loops;
|
||||
|
||||
if (!_ep)
|
||||
return;
|
||||
|
||||
ep = container_of(_ep, struct mv_ep, ep);
|
||||
if (!ep->desc)
|
||||
return;
|
||||
|
||||
udc = ep->udc;
|
||||
direction = ep_dir(ep);
|
||||
bit_pos = 1 << ((direction == EP_DIR_OUT ? 0 : 16) + ep->ep_num);
|
||||
/*
|
||||
* Flushing will halt the pipe
|
||||
* Write 1 to the Flush register
|
||||
*/
|
||||
writel(bit_pos, &udc->op_regs->epflush);
|
||||
|
||||
/* Wait until flushing completed */
|
||||
loops = LOOPS(FLUSH_TIMEOUT);
|
||||
while (readl(&udc->op_regs->epflush) & bit_pos) {
|
||||
/*
|
||||
* ENDPTFLUSH bit should be cleared to indicate this
|
||||
* operation is complete
|
||||
*/
|
||||
if (loops == 0) {
|
||||
dev_err(&udc->dev->dev,
|
||||
"TIMEOUT for ENDPTFLUSH=0x%x, bit_pos=0x%x\n",
|
||||
(unsigned)readl(&udc->op_regs->epflush),
|
||||
(unsigned)bit_pos);
|
||||
return;
|
||||
}
|
||||
loops--;
|
||||
udelay(LOOPS_USEC);
|
||||
}
|
||||
if (ep->ep_num == 0)
|
||||
bit_pos = (1 << 16) | 1;
|
||||
else if (direction == EP_DIR_OUT)
|
||||
bit_pos = 1 << ep->ep_num;
|
||||
else
|
||||
bit_pos = 1 << (16 + ep->ep_num);
|
||||
|
||||
loops = LOOPS(EPSTATUS_TIMEOUT);
|
||||
while (readl(&udc->op_regs->epstatus) & bit_pos) {
|
||||
do {
|
||||
unsigned int inter_loops;
|
||||
|
||||
if (loops == 0) {
|
||||
|
@ -726,7 +717,7 @@ static void mv_ep_fifo_flush(struct usb_ep *_ep)
|
|||
|
||||
/* Wait until flushing completed */
|
||||
inter_loops = LOOPS(FLUSH_TIMEOUT);
|
||||
while (readl(&udc->op_regs->epflush) & bit_pos) {
|
||||
while (readl(&udc->op_regs->epflush)) {
|
||||
/*
|
||||
* ENDPTFLUSH bit should be cleared to indicate this
|
||||
* operation is complete
|
||||
|
@ -743,7 +734,7 @@ static void mv_ep_fifo_flush(struct usb_ep *_ep)
|
|||
udelay(LOOPS_USEC);
|
||||
}
|
||||
loops--;
|
||||
}
|
||||
} while (readl(&udc->op_regs->epstatus) & bit_pos);
|
||||
}
|
||||
|
||||
/* queues (submits) an I/O request to an endpoint */
|
||||
|
|
Loading…
Reference in a new issue