Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 151306
b: refs/heads/master
c: 91e9c4f
h: refs/heads/master
v: v3
  • Loading branch information
Sergei Shtylyov authored and Greg Kroah-Hartman committed Jun 16, 2009
1 parent 8873221 commit 8747557
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 16 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c9cd06b3d6ea825c62e277def929cc4315802b48
refs/heads/master: 91e9c4fec7ee777213859aa1a18bf0b885527637
34 changes: 31 additions & 3 deletions trunk/drivers/usb/musb/cppi_dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* The TUSB6020, using VLYNQ, has CPPI that looks much like DaVinci.
*/

#include <linux/platform_device.h>
#include <linux/usb.h>

#include "musb_core.h"
Expand Down Expand Up @@ -1145,17 +1146,27 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch)
return completed;
}

void cppi_completion(struct musb *musb, u32 rx, u32 tx)
irqreturn_t cppi_interrupt(int irq, void *dev_id)
{
void __iomem *tibase;
int i, index;
struct musb *musb = dev_id;
struct cppi *cppi;
void __iomem *tibase;
struct musb_hw_ep *hw_ep = NULL;
u32 rx, tx;
int i, index;

cppi = container_of(musb->dma_controller, struct cppi, controller);

tibase = musb->ctrl_base;

tx = musb_readl(tibase, DAVINCI_TXCPPI_MASKED_REG);
rx = musb_readl(tibase, DAVINCI_RXCPPI_MASKED_REG);

if (!tx && !rx)
return IRQ_NONE;

DBG(4, "CPPI IRQ Tx%x Rx%x\n", tx, rx);

/* process TX channels */
for (index = 0; tx; tx = tx >> 1, index++) {
struct cppi_channel *tx_ch;
Expand Down Expand Up @@ -1273,13 +1284,18 @@ void cppi_completion(struct musb *musb, u32 rx, u32 tx)

/* write to CPPI EOI register to re-enable interrupts */
musb_writel(tibase, DAVINCI_CPPI_EOI_REG, 0);

return IRQ_HANDLED;
}

/* Instantiate a software object representing a DMA controller. */
struct dma_controller *__init
dma_controller_create(struct musb *musb, void __iomem *mregs)
{
struct cppi *controller;
struct device *dev = musb->controller;
struct platform_device *pdev = to_platform_device(dev);
int irq = platform_get_irq(pdev, 1);

controller = kzalloc(sizeof *controller, GFP_KERNEL);
if (!controller)
Expand Down Expand Up @@ -1310,6 +1326,15 @@ dma_controller_create(struct musb *musb, void __iomem *mregs)
return NULL;
}

if (irq > 0) {
if (request_irq(irq, cppi_interrupt, 0, "cppi-dma", musb)) {
dev_err(dev, "request_irq %d failed!\n", irq);
dma_controller_destroy(&controller->controller);
return NULL;
}
controller->irq = irq;
}

return &controller->controller;
}

Expand All @@ -1322,6 +1347,9 @@ void dma_controller_destroy(struct dma_controller *c)

cppi = container_of(c, struct cppi, controller);

if (cppi->irq)
free_irq(cppi->irq, cppi->musb);

/* assert: caller stopped the controller first */
dma_pool_destroy(cppi->pool);

Expand Down
6 changes: 4 additions & 2 deletions trunk/drivers/usb/musb/cppi_dma.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ struct cppi {
void __iomem *mregs; /* Mentor regs */
void __iomem *tibase; /* TI/CPPI regs */

int irq;

struct cppi_channel tx[4];
struct cppi_channel rx[4];

Expand All @@ -127,7 +129,7 @@ struct cppi {
struct list_head tx_complete;
};

/* irq handling hook */
extern void cppi_completion(struct musb *, u32 rx, u32 tx);
/* CPPI IRQ handler */
extern irqreturn_t cppi_interrupt(int, void *);

#endif /* end of ifndef _CPPI_DMA_H_ */
14 changes: 4 additions & 10 deletions trunk/drivers/usb/musb/davinci.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci)
irqreturn_t retval = IRQ_NONE;
struct musb *musb = __hci;
void __iomem *tibase = musb->ctrl_base;
struct cppi *cppi;
u32 tmp;

spin_lock_irqsave(&musb->lock, flags);
Expand All @@ -281,16 +282,9 @@ static irqreturn_t davinci_interrupt(int irq, void *__hci)
/* CPPI interrupts share the same IRQ line, but have their own
* mask, state, "vector", and EOI registers.
*/
if (is_cppi_enabled()) {
u32 cppi_tx = musb_readl(tibase, DAVINCI_TXCPPI_MASKED_REG);
u32 cppi_rx = musb_readl(tibase, DAVINCI_RXCPPI_MASKED_REG);

if (cppi_tx || cppi_rx) {
DBG(4, "CPPI IRQ t%x r%x\n", cppi_tx, cppi_rx);
cppi_completion(musb, cppi_rx, cppi_tx);
retval = IRQ_HANDLED;
}
}
cppi = container_of(musb->dma_controller, struct cppi, controller);
if (is_cppi_enabled() && musb->dma_controller && !cppi->irq)
retval = cppi_interrupt(irq, __hci);

/* ack and handle non-CPPI interrupts */
tmp = musb_readl(tibase, DAVINCI_USB_INT_SRC_MASKED_REG);
Expand Down

0 comments on commit 8747557

Please sign in to comment.