diff options
| author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2013-11-12 16:37:46 +0100 | 
|---|---|---|
| committer | Felipe Balbi <balbi@ti.com> | 2013-11-25 10:54:06 -0600 | 
| commit | d373a8534d5e1e7a350e40d3c11961a7cd8d530b (patch) | |
| tree | bcfb4d9f9c9e5a228216a3bb1f5ec0525eecab81 /drivers/usb | |
| parent | 37cfbc42887fbd4ff0f4c520c9f3fdea9e6f2a82 (diff) | |
| download | linux-d373a8534d5e1e7a350e40d3c11961a7cd8d530b.tar.bz2 | |
usb: musb: musb_cppi41: factor most of cppi41_dma_callback() into cppi41_trans_done()
This patch moves most of the logic in cppi41_dma_callback() into
cppi41_trans_done() where it can be called from another function.
Instead of computing "transferred" (the number of bytes transferred in
the last transaction) in cppi41_trans_done() the member
"cppi41_channel->prog_len" is now set to 0 if the transfer as a whole
can be considered as done. If it is != 0 then the next iteration is
assumed.
This is a preparation for a workaround.
Cc: stable@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/musb/musb_cppi41.c | 59 | 
1 files changed, 36 insertions, 23 deletions
| diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c index ff9d6de2b746..83a8a1d125ac 100644 --- a/drivers/usb/musb/musb_cppi41.c +++ b/drivers/usb/musb/musb_cppi41.c @@ -96,31 +96,15 @@ static void update_rx_toggle(struct cppi41_dma_channel *cppi41_channel)  	cppi41_channel->usb_toggle = toggle;  } -static void cppi41_dma_callback(void *private_data) +static void cppi41_dma_callback(void *private_data); + +static void cppi41_trans_done(struct dma_channel *channel)  { -	struct dma_channel *channel = private_data;  	struct cppi41_dma_channel *cppi41_channel = channel->private_data;  	struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;  	struct musb *musb = hw_ep->musb; -	unsigned long flags; -	struct dma_tx_state txstate; -	u32 transferred; -	spin_lock_irqsave(&musb->lock, flags); - -	dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie, -			&txstate); -	transferred = cppi41_channel->prog_len - txstate.residue; -	cppi41_channel->transferred += transferred; - -	dev_dbg(musb->controller, "DMA transfer done on hw_ep=%d bytes=%d/%d\n", -		hw_ep->epnum, cppi41_channel->transferred, -		cppi41_channel->total_len); - -	update_rx_toggle(cppi41_channel); - -	if (cppi41_channel->transferred == cppi41_channel->total_len || -			transferred < cppi41_channel->packet_sz) { +	if (!cppi41_channel->prog_len) {  		/* done, complete */  		cppi41_channel->channel.actual_len = @@ -150,10 +134,8 @@ static void cppi41_dma_callback(void *private_data)  				remain_bytes,  				direction,  				DMA_PREP_INTERRUPT | DMA_CTRL_ACK); -		if (WARN_ON(!dma_desc)) { -			spin_unlock_irqrestore(&musb->lock, flags); +		if (WARN_ON(!dma_desc))  			return; -		}  		dma_desc->callback = cppi41_dma_callback;  		dma_desc->callback_param = channel; @@ -166,6 +148,37 @@ static void cppi41_dma_callback(void *private_data)  			musb_writew(epio, MUSB_RXCSR, csr);  		}  	} +} + +static void cppi41_dma_callback(void *private_data) +{ +	struct dma_channel *channel = private_data; +	struct cppi41_dma_channel *cppi41_channel = channel->private_data; +	struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; +	struct musb *musb = hw_ep->musb; +	unsigned long flags; +	struct dma_tx_state txstate; +	u32 transferred; + +	spin_lock_irqsave(&musb->lock, flags); + +	dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie, +			&txstate); +	transferred = cppi41_channel->prog_len - txstate.residue; +	cppi41_channel->transferred += transferred; + +	dev_dbg(musb->controller, "DMA transfer done on hw_ep=%d bytes=%d/%d\n", +		hw_ep->epnum, cppi41_channel->transferred, +		cppi41_channel->total_len); + +	update_rx_toggle(cppi41_channel); + +	if (cppi41_channel->transferred == cppi41_channel->total_len || +			transferred < cppi41_channel->packet_sz) +		cppi41_channel->prog_len = 0; + +	cppi41_trans_done(channel); +  	spin_unlock_irqrestore(&musb->lock, flags);  } |