usb: renesas_usbhs: fifo: request DMAEngine once
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 11 Dec 2013 03:09:02 +0000 (19:09 -0800)
committerFelipe Balbi <balbi@ti.com>
Thu, 12 Dec 2013 19:43:34 +0000 (13:43 -0600)
DMAEngine uses IRQ if dma_request_channel() was called,
and it is using devm_request_irq() today,
OTOH, dma_request_channel() will be called when each
USB connection happened on this driver.
This means same IRQ will be requested many times
whenever each USB connected,
and this IRQ isn't freed when USB disconnected.
Request DMAEngine once.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/renesas_usbhs/fifo.c

index 45b94019aec8f9aad1dc87385a7022262184803b..d49f9c3260350b979a9770da563d36b4d9d1696c 100644 (file)
@@ -1124,19 +1124,8 @@ void usbhs_fifo_init(struct usbhs_priv *priv)
        mod->irq_brdysts        = 0;
 
        cfifo->pipe     = NULL;
-       cfifo->tx_chan  = NULL;
-       cfifo->rx_chan  = NULL;
-
        d0fifo->pipe    = NULL;
-       d0fifo->tx_chan = NULL;
-       d0fifo->rx_chan = NULL;
-
        d1fifo->pipe    = NULL;
-       d1fifo->tx_chan = NULL;
-       d1fifo->rx_chan = NULL;
-
-       usbhsf_dma_init(priv, usbhsf_get_d0fifo(priv));
-       usbhsf_dma_init(priv, usbhsf_get_d1fifo(priv));
 }
 
 void usbhs_fifo_quit(struct usbhs_priv *priv)
@@ -1147,9 +1136,6 @@ void usbhs_fifo_quit(struct usbhs_priv *priv)
        mod->irq_ready          = NULL;
        mod->irq_bempsts        = 0;
        mod->irq_brdysts        = 0;
-
-       usbhsf_dma_quit(priv, usbhsf_get_d0fifo(priv));
-       usbhsf_dma_quit(priv, usbhsf_get_d1fifo(priv));
 }
 
 int usbhs_fifo_probe(struct usbhs_priv *priv)
@@ -1171,6 +1157,7 @@ int usbhs_fifo_probe(struct usbhs_priv *priv)
        fifo->ctr       = D0FIFOCTR;
        fifo->tx_slave.shdma_slave.slave_id     = usbhs_get_dparam(priv, d0_tx_id);
        fifo->rx_slave.shdma_slave.slave_id     = usbhs_get_dparam(priv, d0_rx_id);
+       usbhsf_dma_init(priv, fifo);
 
        /* D1FIFO */
        fifo = usbhsf_get_d1fifo(priv);
@@ -1180,10 +1167,13 @@ int usbhs_fifo_probe(struct usbhs_priv *priv)
        fifo->ctr       = D1FIFOCTR;
        fifo->tx_slave.shdma_slave.slave_id     = usbhs_get_dparam(priv, d1_tx_id);
        fifo->rx_slave.shdma_slave.slave_id     = usbhs_get_dparam(priv, d1_rx_id);
+       usbhsf_dma_init(priv, fifo);
 
        return 0;
 }
 
 void usbhs_fifo_remove(struct usbhs_priv *priv)
 {
+       usbhsf_dma_quit(priv, usbhsf_get_d0fifo(priv));
+       usbhsf_dma_quit(priv, usbhsf_get_d1fifo(priv));
 }