Merge tag 'usb-for-v3.17' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next
Felipe writes: usb: patches for v3.17 merge window Surprisingly enough, while a big set of patches, the majority is composed of cleanups (using devm_*, fixing sparse errors, moving code around, adding const, etc). The highlights are addition of new support for PLX USB338x devices, and support for USB 2.0-only configurations of the DWC3 IP core. Signed-of-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
@@ -39,7 +39,6 @@ struct cppi41_dma_channel {
|
||||
u32 transferred;
|
||||
u32 packet_sz;
|
||||
struct list_head tx_check;
|
||||
struct work_struct dma_completion;
|
||||
};
|
||||
|
||||
#define MUSB_DMA_NUM_CHANNELS 15
|
||||
@@ -74,15 +73,18 @@ static void save_rx_toggle(struct cppi41_dma_channel *cppi41_channel)
|
||||
|
||||
static void update_rx_toggle(struct cppi41_dma_channel *cppi41_channel)
|
||||
{
|
||||
struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;
|
||||
struct musb *musb = hw_ep->musb;
|
||||
u16 csr;
|
||||
u8 toggle;
|
||||
|
||||
if (cppi41_channel->is_tx)
|
||||
return;
|
||||
if (!is_host_active(cppi41_channel->controller->musb))
|
||||
if (!is_host_active(musb))
|
||||
return;
|
||||
|
||||
csr = musb_readw(cppi41_channel->hw_ep->regs, MUSB_RXCSR);
|
||||
musb_ep_select(musb->mregs, hw_ep->epnum);
|
||||
csr = musb_readw(hw_ep->regs, MUSB_RXCSR);
|
||||
toggle = csr & MUSB_RXCSR_H_DATATOGGLE ? 1 : 0;
|
||||
|
||||
/*
|
||||
@@ -107,24 +109,13 @@ static bool musb_is_tx_fifo_empty(struct musb_hw_ep *hw_ep)
|
||||
void __iomem *epio = musb->endpoints[epnum].regs;
|
||||
u16 csr;
|
||||
|
||||
musb_ep_select(musb->mregs, hw_ep->epnum);
|
||||
csr = musb_readw(epio, MUSB_TXCSR);
|
||||
if (csr & MUSB_TXCSR_TXPKTRDY)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_isoc(struct musb_hw_ep *hw_ep, bool in)
|
||||
{
|
||||
if (in && hw_ep->in_qh) {
|
||||
if (hw_ep->in_qh->type == USB_ENDPOINT_XFER_ISOC)
|
||||
return true;
|
||||
} else if (hw_ep->out_qh) {
|
||||
if (hw_ep->out_qh->type == USB_ENDPOINT_XFER_ISOC)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static void cppi41_dma_callback(void *private_data);
|
||||
|
||||
static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel)
|
||||
@@ -139,6 +130,7 @@ static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel)
|
||||
cppi41_channel->channel.actual_len =
|
||||
cppi41_channel->transferred;
|
||||
cppi41_channel->channel.status = MUSB_DMA_STATUS_FREE;
|
||||
cppi41_channel->channel.rx_packet_done = true;
|
||||
musb_dma_completion(musb, hw_ep->epnum, cppi41_channel->is_tx);
|
||||
} else {
|
||||
/* next iteration, reload */
|
||||
@@ -172,6 +164,7 @@ static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel)
|
||||
dma_async_issue_pending(dc);
|
||||
|
||||
if (!cppi41_channel->is_tx) {
|
||||
musb_ep_select(musb->mregs, hw_ep->epnum);
|
||||
csr = musb_readw(epio, MUSB_RXCSR);
|
||||
csr |= MUSB_RXCSR_H_REQPKT;
|
||||
musb_writew(epio, MUSB_RXCSR, csr);
|
||||
@@ -179,32 +172,6 @@ static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel)
|
||||
}
|
||||
}
|
||||
|
||||
static void cppi_trans_done_work(struct work_struct *work)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct cppi41_dma_channel *cppi41_channel =
|
||||
container_of(work, struct cppi41_dma_channel, dma_completion);
|
||||
struct cppi41_dma_controller *controller = cppi41_channel->controller;
|
||||
struct musb *musb = controller->musb;
|
||||
struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep;
|
||||
bool empty;
|
||||
|
||||
if (!cppi41_channel->is_tx && is_isoc(hw_ep, 1)) {
|
||||
spin_lock_irqsave(&musb->lock, flags);
|
||||
cppi41_trans_done(cppi41_channel);
|
||||
spin_unlock_irqrestore(&musb->lock, flags);
|
||||
} else {
|
||||
empty = musb_is_tx_fifo_empty(hw_ep);
|
||||
if (empty) {
|
||||
spin_lock_irqsave(&musb->lock, flags);
|
||||
cppi41_trans_done(cppi41_channel);
|
||||
spin_unlock_irqrestore(&musb->lock, flags);
|
||||
} else {
|
||||
schedule_work(&cppi41_channel->dma_completion);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static enum hrtimer_restart cppi41_recheck_tx_req(struct hrtimer *timer)
|
||||
{
|
||||
struct cppi41_dma_controller *controller;
|
||||
@@ -233,7 +200,7 @@ static enum hrtimer_restart cppi41_recheck_tx_req(struct hrtimer *timer)
|
||||
if (!list_empty(&controller->early_tx_list)) {
|
||||
ret = HRTIMER_RESTART;
|
||||
hrtimer_forward_now(&controller->early_tx,
|
||||
ktime_set(0, 150 * NSEC_PER_USEC));
|
||||
ktime_set(0, 50 * NSEC_PER_USEC));
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&musb->lock, flags);
|
||||
@@ -268,14 +235,6 @@ static void cppi41_dma_callback(void *private_data)
|
||||
transferred < cppi41_channel->packet_sz)
|
||||
cppi41_channel->prog_len = 0;
|
||||
|
||||
if (!cppi41_channel->is_tx) {
|
||||
if (is_isoc(hw_ep, 1))
|
||||
schedule_work(&cppi41_channel->dma_completion);
|
||||
else
|
||||
cppi41_trans_done(cppi41_channel);
|
||||
goto out;
|
||||
}
|
||||
|
||||
empty = musb_is_tx_fifo_empty(hw_ep);
|
||||
if (empty) {
|
||||
cppi41_trans_done(cppi41_channel);
|
||||
@@ -312,15 +271,13 @@ static void cppi41_dma_callback(void *private_data)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (is_isoc(hw_ep, 0)) {
|
||||
schedule_work(&cppi41_channel->dma_completion);
|
||||
goto out;
|
||||
}
|
||||
list_add_tail(&cppi41_channel->tx_check,
|
||||
&controller->early_tx_list);
|
||||
if (!hrtimer_is_queued(&controller->early_tx)) {
|
||||
unsigned long usecs = cppi41_channel->total_len / 10;
|
||||
|
||||
hrtimer_start_range_ns(&controller->early_tx,
|
||||
ktime_set(0, 140 * NSEC_PER_USEC),
|
||||
ktime_set(0, usecs * NSEC_PER_USEC),
|
||||
40 * NSEC_PER_USEC,
|
||||
HRTIMER_MODE_REL);
|
||||
}
|
||||
@@ -450,6 +407,7 @@ static bool cppi41_configure_channel(struct dma_channel *channel,
|
||||
dma_desc->callback = cppi41_dma_callback;
|
||||
dma_desc->callback_param = channel;
|
||||
cppi41_channel->cookie = dma_desc->tx_submit(dma_desc);
|
||||
cppi41_channel->channel.rx_packet_done = false;
|
||||
|
||||
save_rx_toggle(cppi41_channel);
|
||||
dma_async_issue_pending(dc);
|
||||
@@ -672,8 +630,6 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller)
|
||||
cppi41_channel->port_num = port;
|
||||
cppi41_channel->is_tx = is_tx;
|
||||
INIT_LIST_HEAD(&cppi41_channel->tx_check);
|
||||
INIT_WORK(&cppi41_channel->dma_completion,
|
||||
cppi_trans_done_work);
|
||||
|
||||
musb_dma = &cppi41_channel->channel;
|
||||
musb_dma->private_data = cppi41_channel;
|
||||
|
Reference in New Issue
Block a user