summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorPawan Kumar <pavaku@codeaurora.org>2014-01-15 14:50:14 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:25:40 -0700
commitb4da2aece99640838e4135fff44e00d253be6eef (patch)
treea489b1501390bf8e8601b57219a48fcb40fb45bb /drivers
parentdab2b4d7faa886b600cd15b8f6468d40d5a393ec (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')
-rw-r--r--drivers/video/fbdev/msm/mdss.h2
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.c11
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c2
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;
}