commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=f08a37635112d74574b87e60a53f30f12197052f branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk
add debug messages handle busy status Signed-off-by: Steven Miao <[email protected]> Signed-off-by: Bob Liu <[email protected]> --- drivers/char/bfin_lp.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/drivers/char/bfin_lp.c b/drivers/char/bfin_lp.c index b0b48b7..55f1286 100644 --- a/drivers/char/bfin_lp.c +++ b/drivers/char/bfin_lp.c @@ -272,10 +272,10 @@ static void transfer_fn(struct work_struct *work) break; while (dev->regs->stat & LP_STAT_LPBS); dev->regs->tx = data; - while (dev->regs->stat & LP_STAT_LPBS); } if (kfifo_len(&dev->lpfifo) == 0) { dev->status = LP_STAT_DONE; + kfifo_reset(&dev->lpfifo); if (dev->regs->stat & LP_STAT_LPBS) { enable_irq(dev->irq); return; @@ -283,7 +283,7 @@ static void transfer_fn(struct work_struct *work) complete(&dev->complete); } } else if (dev->status == LP_STAT_DONE) { - kfifo_reset(&dev->lpfifo); + complete(&dev->complete); } else { lp_rx_fifo(dev); } @@ -373,6 +373,7 @@ static int bfin_lp_open(struct inode *inode, struct file *filp) dev->regs->ctl = 0; SSYNC(); + pr_debug("bfin lp open %d\n", index); return 0; free_dma: @@ -385,8 +386,11 @@ free_per: static int bfin_lp_release(struct inode *inode, struct file *filp) { struct bfin_lp_dev *dev = filp->private_data; + unsigned int index = iminor(inode); - wait_for_completion(&dev->complete); + pr_debug("bfin lp relese %d\n", index); + if (dev->regs->ctl & LP_CTL_TRAN) + wait_for_completion_interruptible(&dev->complete); dev->regs->ctl = 0; @@ -428,8 +432,6 @@ static ssize_t bfin_lp_read(struct file *filp, char *buf, size_t count, loff_t * n -= fifo_cnt; } - complete(&dev->complete); - return count; }
_______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits
