147 lines
4.5 KiB
Diff
147 lines
4.5 KiB
Diff
From f9ca8154cf395ec00129f12016697ef610a826ff Mon Sep 17 00:00:00 2001
|
|
From: Sergei Shtylyov <sshtylyov-hkdhdckH98+B+jHODAdFcQ@public.gmane.org>
|
|
Date: Fri, 27 Mar 2009 12:55:16 -0700
|
|
Subject: [PATCH] musb_host: factor out musb_ep_{get|set}_qh()
|
|
|
|
Factor out the often used code to get/set the active 'qh'
|
|
pointer for the hardware endpoint. Change the way the case
|
|
of a shared FIFO is handled by setting *both* 'in_qh' and
|
|
'out_qh' fields of 'struct musb_hw_ep'. That seems more
|
|
consistent and makes getting to the current 'qh' easy when
|
|
the code knows the direction beforehand.
|
|
|
|
While at it, turn some assignments into intializers and
|
|
fix declaration style in the vicinity.
|
|
|
|
Signed-off-by: Sergei Shtylyov <sshtylyov-hkdhdckH98+B+jHODAdFcQ@public.gmane.org>
|
|
Signed-off-by: David Brownell <dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
|
|
---
|
|
drivers/usb/musb/musb_host.c | 56 ++++++++++++++++-------------------------
|
|
1 files changed, 22 insertions(+), 34 deletions(-)
|
|
|
|
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
|
|
index dc32ce4..bc89079 100644
|
|
--- a/drivers/usb/musb/musb_host.c
|
|
+++ b/drivers/usb/musb/musb_host.c
|
|
@@ -178,6 +178,19 @@ static inline void cppi_host_txdma_start(struct musb_hw_ep *ep)
|
|
musb_writew(ep->regs, MUSB_TXCSR, txcsr);
|
|
}
|
|
|
|
+static void musb_ep_set_qh(struct musb_hw_ep *ep, int is_in, struct musb_qh *qh)
|
|
+{
|
|
+ if (is_in != 0 || ep->is_shared_fifo)
|
|
+ ep->in_qh = qh;
|
|
+ if (is_in == 0 || ep->is_shared_fifo)
|
|
+ ep->out_qh = qh;
|
|
+}
|
|
+
|
|
+static struct musb_qh *musb_ep_get_qh(struct musb_hw_ep *ep, int is_in)
|
|
+{
|
|
+ return is_in ? ep->in_qh : ep->out_qh;
|
|
+}
|
|
+
|
|
/*
|
|
* Start the URB at the front of an endpoint's queue
|
|
* end must be claimed from the caller.
|
|
@@ -207,7 +220,6 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
|
|
case USB_ENDPOINT_XFER_CONTROL:
|
|
/* control transfers always start with SETUP */
|
|
is_in = 0;
|
|
- hw_ep->out_qh = qh;
|
|
musb->ep0_stage = MUSB_EP0_START;
|
|
buf = urb->setup_packet;
|
|
len = 8;
|
|
@@ -236,10 +248,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
|
|
epnum, buf + offset, len);
|
|
|
|
/* Configure endpoint */
|
|
- if (is_in || hw_ep->is_shared_fifo)
|
|
- hw_ep->in_qh = qh;
|
|
- else
|
|
- hw_ep->out_qh = qh;
|
|
+ musb_ep_set_qh(hw_ep, is_in, qh);
|
|
musb_ep_program(musb, epnum, urb, !is_in, buf, offset, len);
|
|
|
|
/* transmit may have more work: start it when it is time */
|
|
@@ -374,11 +383,8 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status)
|
|
else
|
|
ep->tx_reinit = 1;
|
|
|
|
- /* clobber old pointers to this qh */
|
|
- if (is_in || ep->is_shared_fifo)
|
|
- ep->in_qh = NULL;
|
|
- else
|
|
- ep->out_qh = NULL;
|
|
+ /* Clobber old pointers to this qh */
|
|
+ musb_ep_set_qh(ep, is_in, NULL);
|
|
qh->hep->hcpriv = NULL;
|
|
|
|
switch (qh->type) {
|
|
@@ -421,12 +427,7 @@ static void
|
|
musb_advance_schedule(struct musb *musb, struct urb *urb,
|
|
struct musb_hw_ep *hw_ep, int is_in)
|
|
{
|
|
- struct musb_qh *qh;
|
|
-
|
|
- if (is_in || hw_ep->is_shared_fifo)
|
|
- qh = hw_ep->in_qh;
|
|
- else
|
|
- qh = hw_ep->out_qh;
|
|
+ struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in);
|
|
|
|
if (urb->status == -EINPROGRESS)
|
|
qh = musb_giveback(qh, urb, 0);
|
|
@@ -689,15 +690,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
|
|
void __iomem *mbase = musb->mregs;
|
|
struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
|
|
void __iomem *epio = hw_ep->regs;
|
|
- struct musb_qh *qh;
|
|
- u16 packet_sz;
|
|
-
|
|
- if (!is_out || hw_ep->is_shared_fifo)
|
|
- qh = hw_ep->in_qh;
|
|
- else
|
|
- qh = hw_ep->out_qh;
|
|
-
|
|
- packet_sz = qh->maxpacket;
|
|
+ struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out);
|
|
+ u16 packet_sz = qh->maxpacket;
|
|
|
|
DBG(3, "%s hw%d urb %p spd%d dev%d ep%d%s "
|
|
"h_addr%02x h_port%02x bytes %d\n",
|
|
@@ -1114,17 +1108,14 @@ void musb_host_tx(struct musb *musb, u8 epnum)
|
|
u16 tx_csr;
|
|
size_t length = 0;
|
|
size_t offset = 0;
|
|
- struct urb *urb;
|
|
struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
|
|
void __iomem *epio = hw_ep->regs;
|
|
- struct musb_qh *qh = hw_ep->is_shared_fifo ? hw_ep->in_qh
|
|
- : hw_ep->out_qh;
|
|
+ struct musb_qh *qh = hw_ep->out_qh;
|
|
+ struct urb *urb = next_urb(qh);
|
|
u32 status = 0;
|
|
void __iomem *mbase = musb->mregs;
|
|
struct dma_channel *dma;
|
|
|
|
- urb = next_urb(qh);
|
|
-
|
|
musb_ep_select(mbase, epnum);
|
|
tx_csr = musb_readw(epio, MUSB_TXCSR);
|
|
|
|
@@ -1741,10 +1732,7 @@ static int musb_schedule(
|
|
epnum++, hw_ep++) {
|
|
int diff;
|
|
|
|
- if (is_in || hw_ep->is_shared_fifo) {
|
|
- if (hw_ep->in_qh != NULL)
|
|
- continue;
|
|
- } else if (hw_ep->out_qh != NULL)
|
|
+ if (musb_ep_get_qh(hw_ep, is_in) != NULL)
|
|
continue;
|
|
|
|
if (hw_ep == musb->bulk_ep)
|
|
--
|
|
1.6.0.4
|
|
|