summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorVeera Sundaram Sankaran <veeras@codeaurora.org>2015-09-24 12:38:21 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:12:04 -0700
commitc4254bcb1985ccbd2719534ab63d7e0169ae3063 (patch)
tree69c1b0c355036e70902bd485cfa4e8c55b70863e /drivers/video/fbdev
parent6c8839e8b1835142f88fde3c2d18b323bbc4262e (diff)
msm: mdss: protect clk enable member with mdp lock
During irq_disable, mdp_lock is held and intr status is checked and cleared if any. If a new irq is triggered from another CPU at the same point, it would ideally be waiting on mdp_lock held by the other CPU. And when the mdp_lock is released after clearing the irq, mdp_isr is executed and at this point, clks might have been disabled. To avoid it, protect the clk_ena variable with mdp_lock and also check for the clk_ena status and skip irq handling when it is disabled. Change-Id: Ic71d2b6f877ca3510a0d0fa593a8a0c17e93d8f3 Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c4
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_util.c2
2 files changed, 6 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c
index 31240d7cf572..2e7403b24b15 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.c
+++ b/drivers/video/fbdev/msm/mdss_mdp.c
@@ -941,6 +941,7 @@ void mdss_mdp_clk_ctrl(int enable)
{
struct mdss_data_type *mdata = mdss_mdp_get_mdata();
static int mdp_clk_cnt;
+ unsigned long flags;
int changed = 0;
int rc = 0;
@@ -982,7 +983,10 @@ void mdss_mdp_clk_ctrl(int enable)
false, mdata->curr_bw_uc_idx);
}
+ spin_lock_irqsave(&mdp_lock, flags);
mdata->clk_ena = enable;
+ spin_unlock_irqrestore(&mdp_lock, flags);
+
mdss_mdp_clk_update(MDSS_CLK_AHB, enable);
mdss_mdp_clk_update(MDSS_CLK_AXI, enable);
mdss_mdp_clk_update(MDSS_CLK_MDP_CORE, enable);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_util.c b/drivers/video/fbdev/msm/mdss_mdp_util.c
index da94533cfa75..fe0c2e5d3a75 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_util.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_util.c
@@ -151,6 +151,8 @@ irqreturn_t mdss_mdp_isr(int irq, void *ptr)
struct mdss_data_type *mdata = ptr;
u32 isr, mask, hist_isr, hist_mask;
+ if (!mdata->clk_ena)
+ return IRQ_HANDLED;
isr = readl_relaxed(mdata->mdp_base + MDSS_MDP_REG_INTR_STATUS);