commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=ceaed9cb95f32d9dfaaa576d622c175b4de66552
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/2010R1

If sport TX dma interrupt is handled before sport is enabled in tx write operation,
its handler loops forever to wait for sport tx done status which is not enabled.
This patch disable the dma interrupt till sport is enabled.

Signed-off-by: Sonic Zhang <[email protected]>
---
 drivers/char/bfin_sport.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/char/bfin_sport.c b/drivers/char/bfin_sport.c
index 62cbc98..8c62e62 100644
--- a/drivers/char/bfin_sport.c
+++ b/drivers/char/bfin_sport.c
@@ -641,7 +641,11 @@ static ssize_t sport_write(struct file *filp, const char __user *buf,
 		}
 		set_dma_config(dev->dma_tx_chan, dma_config);
 
+		/* DMA interrupt should not be handled before sport is enabled. */
+		disable_irq(dev->tx_irq);
 		enable_dma(dev->dma_tx_chan);
+		dev->regs->tcr1 |= TSPEN;
+		enable_irq(dev->tx_irq);
 	} else {
 		/* Configure parameters to start PIO transfer */
 		dev->tx_buf = buf;
@@ -649,8 +653,8 @@ static ssize_t sport_write(struct file *filp, const char __user *buf,
 		dev->tx_sent = 0;
 
 		sport_tx_write(dev);
+		dev->regs->tcr1 |= TSPEN;
 	}
-	dev->regs->tcr1 |= TSPEN;
 	SSYNC();
 
 	pr_debug("wait for transfer finished\n");
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to