diff options
| author | Pawan Kumar <pavaku@codeaurora.org> | 2014-01-15 14:50:14 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:25:40 -0700 |
| commit | b4da2aece99640838e4135fff44e00d253be6eef (patch) | |
| tree | a489b1501390bf8e8601b57219a48fcb40fb45bb /drivers/video/fbdev | |
| parent | dab2b4d7faa886b600cd15b8f6468d40d5a393ec (diff) | |
msm: mdss: add iommu attach in bus bandwidth control request
Add mdss_iommu_attach in mdss_bus_bandwidth_ctrl to
attach iommu on bus bandwidth enable request.
mdss_iommu_attach/mdss_iommu_dettach can happen in
separate thread, which may lead to a race condition
where attach/detach may happen at same time. Add lock
to properly synchronize the iommu attach/detach to
fix race condition.
Change-Id: I45c8ef1fa1fa1c2da9c6c3702bd007856e469b9d
Signed-off-by: Pawan Kumar <pavaku@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.c | 11 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 2 |
3 files changed, 14 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h index fc394f70c967..9bda5f0e568d 100644 --- a/drivers/video/fbdev/msm/mdss.h +++ b/drivers/video/fbdev/msm/mdss.h @@ -189,6 +189,8 @@ struct mdss_data_type { bool mixer_switched; struct mdss_panel_cfg pan_cfg; struct mdss_prefill_data prefill_data; + + int handoff_pending; }; extern struct mdss_data_type *mdss_res; diff --git a/drivers/video/fbdev/msm/mdss_mdp.c b/drivers/video/fbdev/msm/mdss_mdp.c index 70f06802dc50..7043281575ff 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.c +++ b/drivers/video/fbdev/msm/mdss_mdp.c @@ -83,6 +83,7 @@ struct msm_mdp_interface mdp5 = { static DEFINE_SPINLOCK(mdp_lock); static DEFINE_MUTEX(mdp_clk_lock); static DEFINE_MUTEX(bus_bw_lock); +static DEFINE_MUTEX(mdp_iommu_lock); static struct mdss_panel_intf pan_types[] = { {"dsi", MDSS_PANEL_INTF_DSI}, @@ -695,6 +696,8 @@ void mdss_bus_bandwidth_ctrl(int enable) pm_runtime_get_sync(&mdata->pdev->dev); msm_bus_scale_client_update_request( mdata->bus_hdl, mdata->curr_bw_uc_idx); + if (!mdata->handoff_pending) + mdss_iommu_attach(mdata); } } @@ -827,8 +830,10 @@ int mdss_iommu_attach(struct mdss_data_type *mdata) struct mdss_iommu_map_type *iomap; int i; + mutex_lock(&mdp_iommu_lock); if (mdata->iommu_attached) { pr_debug("mdp iommu already attached\n"); + mutex_unlock(&mdp_iommu_lock); return 0; } @@ -845,6 +850,7 @@ int mdss_iommu_attach(struct mdss_data_type *mdata) } mdata->iommu_attached = true; + mutex_unlock(&mdp_iommu_lock); return 0; } @@ -855,8 +861,10 @@ int mdss_iommu_dettach(struct mdss_data_type *mdata) struct mdss_iommu_map_type *iomap; int i; + mutex_lock(&mdp_iommu_lock); if (!mdata->iommu_attached) { pr_debug("mdp iommu already dettached\n"); + mutex_unlock(&mdp_iommu_lock); return 0; } @@ -873,6 +881,7 @@ int mdss_iommu_dettach(struct mdss_data_type *mdata) } mdata->iommu_attached = false; + mutex_unlock(&mdp_iommu_lock); return 0; } @@ -1093,6 +1102,7 @@ void mdss_mdp_footswitch_ctrl_splash(int on) if (mdata != NULL) { if (on) { pr_debug("Enable MDP FS for splash.\n"); + mdata->handoff_pending = true; ret = regulator_enable(mdata->fs); if (ret) pr_err("Footswitch failed to enable\n"); @@ -1100,6 +1110,7 @@ void mdss_mdp_footswitch_ctrl_splash(int on) } else { pr_debug("Disable MDP FS for splash.\n"); regulator_disable(mdata->fs); + mdata->handoff_pending = false; } } else { pr_warn("mdss mdata not initialized\n"); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index ebe0b41eacad..e0f109800549 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -2617,8 +2617,8 @@ int mdss_panel_register_done(struct mdss_panel_data *pdata) * increasing ref_cnt to help balance clocks once done. */ if (pdata->panel_info.cont_splash_enabled) { - mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); mdss_mdp_footswitch_ctrl_splash(1); + mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false); } return 0; } |
