diff options
author | Robby Cai <R63905@freescale.com> | 2010-11-16 13:56:32 +0800 |
---|---|---|
committer | Robby Cai <R63905@freescale.com> | 2010-11-24 10:15:17 +0800 |
commit | 838705ba857ca22c7c512331b6431651ed5a303d (patch) | |
tree | aa9f432ce956f20487a74b27d184f1802c3f7152 | |
parent | 8f186ca4768693b40210cbbbc8b0ec3db38b49b5 (diff) |
ENGR00133729 ePxP: move clk_[en|dis]able outside spinlock section
clk_enable and clk_disable could be sleep, so it can not be
surrounded with spin_lock/spin_unlock. This patch fixed it.
Signed-off-by: Robby Cai <R63905@freescale.com>
-rw-r--r-- | drivers/dma/pxp/pxp_dma.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/dma/pxp/pxp_dma.c b/drivers/dma/pxp/pxp_dma.c index 00ea92b4367f..98fdc615b348 100644 --- a/drivers/dma/pxp/pxp_dma.c +++ b/drivers/dma/pxp/pxp_dma.c @@ -53,6 +53,7 @@ struct pxps { int irq; /* PXP IRQ to the CPU */ spinlock_t lock; + struct mutex clk_mutex; int clk_stat; #define CLK_STAT_OFF 0 #define CLK_STAT_ON 1 @@ -637,34 +638,32 @@ static int pxp_config(struct pxps *pxp, struct pxp_channel *pxp_chan) static void pxp_clk_enable(struct pxps *pxp) { - unsigned long flags; - spin_lock_irqsave(&pxp->lock, flags); + mutex_lock(&pxp->clk_mutex); if (pxp->clk_stat == CLK_STAT_ON) { - spin_unlock_irqrestore(&pxp->lock, flags); + mutex_unlock(&pxp->clk_mutex); return; } clk_enable(pxp->clk); pxp->clk_stat = CLK_STAT_ON; - spin_unlock_irqrestore(&pxp->lock, flags); + mutex_unlock(&pxp->clk_mutex); } static void pxp_clk_disable(struct pxps *pxp) { - unsigned long flags; - spin_lock_irqsave(&pxp->lock, flags); + mutex_lock(&pxp->clk_mutex); if (pxp->clk_stat == CLK_STAT_OFF) { - spin_unlock_irqrestore(&pxp->lock, flags); + mutex_unlock(&pxp->clk_mutex); return; } clk_disable(pxp->clk); pxp->clk_stat = CLK_STAT_OFF; - spin_unlock_irqrestore(&pxp->lock, flags); + mutex_unlock(&pxp->clk_mutex); } static inline void clkoff_callback(struct work_struct *w) @@ -1374,6 +1373,7 @@ static int pxp_probe(struct platform_device *pdev) pxp->lut_state = 0; spin_lock_init(&pxp->lock); + mutex_init(&pxp->clk_mutex); if (!request_mem_region(res->start, resource_size(res), "pxp-mem")) { err = -EBUSY; |