diff options
author | Robby Cai <R63905@freescale.com> | 2011-04-21 15:28:09 +0800 |
---|---|---|
committer | Robby Cai <R63905@freescale.com> | 2011-04-22 19:34:28 -0500 |
commit | ea6b1e104123495d8f513014d638e7cf45c61cdc (patch) | |
tree | 6be692d2ab4df63597548a9ab3f87da07d7e86c9 /drivers | |
parent | 421424ae97066467b89a8a6f0c60aeeec1ac2afa (diff) |
ENGR00142410 MX50 PXP: Fix PxP operation may time out or hang up
There might be a chance that clk_disable() is called when
PxP task is in process. Add this check before actually disable
PxP clock to fix this issue.
Signed-off-by: Ko Daiyu <R18641@freescale.com>
Signed-off-by: Robby Cai <R63905@freescale.com>
(cherry picked from commit 9b1a26230650c5d20c21bc614482cc5f6f786e46)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/dma/pxp/pxp_dma.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/dma/pxp/pxp_dma.c b/drivers/dma/pxp/pxp_dma.c index fb43e27bb358..eabf0077c690 100644 --- a/drivers/dma/pxp/pxp_dma.c +++ b/drivers/dma/pxp/pxp_dma.c @@ -654,6 +654,8 @@ static void pxp_clk_enable(struct pxps *pxp) static void pxp_clk_disable(struct pxps *pxp) { + unsigned long flags; + mutex_lock(&pxp->clk_mutex); if (pxp->clk_stat == CLK_STAT_OFF) { @@ -661,8 +663,13 @@ static void pxp_clk_disable(struct pxps *pxp) return; } - clk_disable(pxp->clk); - pxp->clk_stat = CLK_STAT_OFF; + spin_lock_irqsave(&pxp->lock, flags); + if ((pxp->pxp_ongoing == 0) && list_empty(&head)) { + spin_unlock_irqrestore(&pxp->lock, flags); + clk_disable(pxp->clk); + pxp->clk_stat = CLK_STAT_OFF; + } else + spin_unlock_irqrestore(&pxp->lock, flags); mutex_unlock(&pxp->clk_mutex); } @@ -1088,7 +1095,9 @@ static void pxp_issue_pending(struct dma_chan *chan) return; } + spin_lock_irqsave(&pxp->lock, flags); pxp->pxp_ongoing = 1; + spin_unlock_irqrestore(&pxp->lock, flags); pxpdma_dostart_work(pxp); } |