Skip to content

Commit

Permalink
USB: s3c-hsotg: Ensure FIFOs are fully flushed after layout
Browse files Browse the repository at this point in the history
According to the design guide, if the FIFO layout is changed, then the
FIFOs must be flushed to ensure all FIFO pointers are correct.

Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Ben Dooks authored and Greg Kroah-Hartman committed Jun 4, 2010
1 parent 2e0e077 commit 1703a6d
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions drivers/usb/gadget/s3c-hsotg.c
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,7 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
unsigned int ep;
unsigned int addr;
unsigned int size;
int timeout;
u32 val;

/* the ryu 2.6.24 release ahs
Expand Down Expand Up @@ -335,6 +336,31 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)

writel(val, hsotg->regs + S3C_DPTXFSIZn(ep));
}

/* according to p428 of the design guide, we need to ensure that
* all fifos are flushed before continuing */

writel(S3C_GRSTCTL_TxFNum(0x10) | S3C_GRSTCTL_TxFFlsh |
S3C_GRSTCTL_RxFFlsh, hsotg->regs + S3C_GRSTCTL);

/* wait until the fifos are both flushed */
timeout = 100;
while (1) {
val = readl(hsotg->regs + S3C_GRSTCTL);

if ((val & (S3C_GRSTCTL_TxFFlsh | S3C_GRSTCTL_RxFFlsh)) == 0)
break;

if (--timeout == 0) {
dev_err(hsotg->dev,
"%s: timeout flushing fifos (GRSTCTL=%08x)\n",
__func__, val);
}

udelay(1);
}

dev_dbg(hsotg->dev, "FIFOs reset, timeout at %d\n", timeout);
}

/**
Expand Down

0 comments on commit 1703a6d

Please sign in to comment.