]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
ARM: OMAP: Fixes to omap_mcbsp_request function
authorJarkko Nikula <jarkko.nikula@nokia.com>
Mon, 22 Sep 2008 13:47:51 +0000 (16:47 +0300)
committerTony Lindgren <tony@atomide.com>
Wed, 24 Sep 2008 09:10:47 +0000 (12:10 +0300)
Bootloader may let McBSP logic running so make sure that block is idle
before requesting IRQs. Also make sure that TX and RX waitqueues are
initialized before request_irq.

Signed-off-by: Jarkko Nikula <jarkko.nikula@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/plat-omap/mcbsp.c

index 7d324373f9030d362421b318cbe2da24598a5444..798c91e20db9f7919319b717f8d308a06182a2bd 100644 (file)
@@ -234,8 +234,16 @@ int omap_mcbsp_request(unsigned int id)
        mcbsp->free = 0;
        spin_unlock(&mcbsp->lock);
 
+       /*
+        * Make sure that transmitter, receiver and sample-rate generator are
+        * not running before activating IRQs.
+        */
+       OMAP_MCBSP_WRITE(mcbsp->io_base, SPCR1, 0);
+       OMAP_MCBSP_WRITE(mcbsp->io_base, SPCR2, 0);
+
        if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
                /* We need to get IRQs here */
+               init_completion(&mcbsp->tx_irq_completion);
                err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler,
                                        0, "McBSP", (void *)mcbsp);
                if (err != 0) {
@@ -245,8 +253,7 @@ int omap_mcbsp_request(unsigned int id)
                        return err;
                }
 
-               init_completion(&mcbsp->tx_irq_completion);
-
+               init_completion(&mcbsp->rx_irq_completion);
                err = request_irq(mcbsp->rx_irq, omap_mcbsp_rx_irq_handler,
                                        0, "McBSP", (void *)mcbsp);
                if (err != 0) {
@@ -256,8 +263,6 @@ int omap_mcbsp_request(unsigned int id)
                        free_irq(mcbsp->tx_irq, (void *)mcbsp);
                        return err;
                }
-
-               init_completion(&mcbsp->rx_irq_completion);
        }
 
        return 0;