diff options
author | David Brownell <david-b@pacbell.net> | 2008-04-07 02:32:55 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-04-25 00:16:49 -0400 |
commit | 3cf2723432dd27402a4a4941ad2d04eae5dd639c (patch) | |
tree | c63fb9258fcb0f2665ba818881cd84dc9b299daa /drivers/usb | |
parent | a89a2cd396b20c46a37fa8db4b652fb00f29d0a4 (diff) |
USB: at91_udc can prefetch data
The at91sam9 chip are ARMv5 so they support preload instructions.
Use preloading to load the FIFO a bit faster.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/gadget/at91_udc.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index fd15ced899d8..5d352c900d2c 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -389,6 +389,7 @@ static int write_fifo(struct at91_ep *ep, struct at91_request *req) | |||
389 | u32 csr = __raw_readl(creg); | 389 | u32 csr = __raw_readl(creg); |
390 | u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0)); | 390 | u8 __iomem *dreg = ep->creg + (AT91_UDP_FDR(0) - AT91_UDP_CSR(0)); |
391 | unsigned total, count, is_last; | 391 | unsigned total, count, is_last; |
392 | u8 *buf; | ||
392 | 393 | ||
393 | /* | 394 | /* |
394 | * TODO: allow for writing two packets to the fifo ... that'll | 395 | * TODO: allow for writing two packets to the fifo ... that'll |
@@ -413,6 +414,8 @@ static int write_fifo(struct at91_ep *ep, struct at91_request *req) | |||
413 | return 0; | 414 | return 0; |
414 | } | 415 | } |
415 | 416 | ||
417 | buf = req->req.buf + req->req.actual; | ||
418 | prefetch(buf); | ||
416 | total = req->req.length - req->req.actual; | 419 | total = req->req.length - req->req.actual; |
417 | if (ep->ep.maxpacket < total) { | 420 | if (ep->ep.maxpacket < total) { |
418 | count = ep->ep.maxpacket; | 421 | count = ep->ep.maxpacket; |
@@ -435,7 +438,7 @@ static int write_fifo(struct at91_ep *ep, struct at91_request *req) | |||
435 | * recover when the actual bytecount matters (e.g. for USB Test | 438 | * recover when the actual bytecount matters (e.g. for USB Test |
436 | * and Measurement Class devices). | 439 | * and Measurement Class devices). |
437 | */ | 440 | */ |
438 | __raw_writesb(dreg, req->req.buf + req->req.actual, count); | 441 | __raw_writesb(dreg, buf, count); |
439 | csr &= ~SET_FX; | 442 | csr &= ~SET_FX; |
440 | csr |= CLR_FX | AT91_UDP_TXPKTRDY; | 443 | csr |= CLR_FX | AT91_UDP_TXPKTRDY; |
441 | __raw_writel(csr, creg); | 444 | __raw_writel(csr, creg); |