diff options
| author | Veera Sundaram Sankaran <veeras@codeaurora.org> | 2015-09-24 12:38:21 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:12:04 -0700 |
| commit | c4254bcb1985ccbd2719534ab63d7e0169ae3063 (patch) | |
| tree | 69c1b0c355036e70902bd485cfa4e8c55b70863e /drivers/video/fbdev | |
| parent | 6c8839e8b1835142f88fde3c2d18b323bbc4262e (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.c | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_util.c | 2 |
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); |
