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
