summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-08-13 23:13:13 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-08-13 23:13:12 -0700
commit77e4349ae1ae132090a7281a19e1c0de65a1bd65 (patch)
tree2ccbed0a2ef4320ea66e0baef177d27219412358
parent0ec8200353232eced34a62a118835920360674fd (diff)
parentffa14738c07bd2e2aa7d26e3dec9fd498b397bce (diff)
Merge "msm: mdss: fix dma fifo read watermark to 15/16 full"
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_host.c3
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c16
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_layer.c4
-rw-r--r--drivers/video/fbdev/msm/mdss_smmu.c9
4 files changed, 30 insertions, 2 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c
index 3785a701e3c1..78dc17536416 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_host.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_host.c
@@ -459,6 +459,9 @@ void mdss_dsi_host_init(struct mdss_panel_data *pdata)
/* enable contention detection for receiving */
mdss_dsi_lp_cd_rx(ctrl_pdata);
+ /* set DMA FIFO read watermark to 15/16 full */
+ MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x50, 0x30);
+
wmb();
}
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index 5a65451dc127..0779f7e7afae 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -2544,6 +2544,11 @@ static int mdss_mdp_disable_autorefresh(struct mdss_mdp_ctl *ctl,
/* disable autorefresh */
mdss_mdp_pingpong_write(pp_base, MDSS_MDP_REG_PP_AUTOREFRESH_CONFIG, 0);
+
+ if (is_pingpong_split(ctl->mfd))
+ mdss_mdp_pingpong_write(mdata->slave_pingpong_base,
+ MDSS_MDP_REG_PP_AUTOREFRESH_CONFIG, 0);
+
ctx->autorefresh_state = MDP_AUTOREFRESH_OFF;
ctx->autorefresh_frame_cnt = 0;
@@ -2561,6 +2566,9 @@ static int mdss_mdp_disable_autorefresh(struct mdss_mdp_ctl *ctl,
static void __mdss_mdp_kickoff(struct mdss_mdp_ctl *ctl,
struct mdss_mdp_cmd_ctx *ctx)
{
+ struct mdss_data_type *mdata = mdss_mdp_get_mdata();
+ bool is_pp_split = is_pingpong_split(ctl->mfd);
+
MDSS_XLOG(ctx->autorefresh_state);
if ((ctx->autorefresh_state == MDP_AUTOREFRESH_ON_REQUESTED) ||
@@ -2573,8 +2581,14 @@ static void __mdss_mdp_kickoff(struct mdss_mdp_ctl *ctl,
mdss_mdp_pingpong_write(ctl->mixer_left->pingpong_base,
MDSS_MDP_REG_PP_AUTOREFRESH_CONFIG,
BIT(31) | ctx->autorefresh_frame_cnt);
+
+ if (is_pp_split)
+ mdss_mdp_pingpong_write(mdata->slave_pingpong_base,
+ MDSS_MDP_REG_PP_AUTOREFRESH_CONFIG,
+ BIT(31) | ctx->autorefresh_frame_cnt);
+
MDSS_XLOG(0x11, ctx->autorefresh_frame_cnt,
- ctx->autorefresh_state);
+ ctx->autorefresh_state, is_pp_split);
ctx->autorefresh_state = MDP_AUTOREFRESH_ON;
} else {
diff --git a/drivers/video/fbdev/msm/mdss_mdp_layer.c b/drivers/video/fbdev/msm/mdss_mdp_layer.c
index 35bd0932f321..3a39d4fdc895 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_layer.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_layer.c
@@ -1062,7 +1062,6 @@ static struct sync_fence *__create_fence(struct msm_fb_data_type *mfd,
goto end;
}
- sync_fence_install(sync_fence, *fence_fd);
end:
return sync_fence;
}
@@ -1136,6 +1135,9 @@ static int __handle_buffer_fences(struct msm_fb_data_type *mfd,
goto retire_fence_err;
}
+ sync_fence_install(release_fence, commit->release_fence);
+ sync_fence_install(retire_fence, commit->retire_fence);
+
mutex_unlock(&sync_pt_data->sync_mutex);
return ret;
diff --git a/drivers/video/fbdev/msm/mdss_smmu.c b/drivers/video/fbdev/msm/mdss_smmu.c
index 9906f10a7911..9a00eff9ade9 100644
--- a/drivers/video/fbdev/msm/mdss_smmu.c
+++ b/drivers/video/fbdev/msm/mdss_smmu.c
@@ -172,6 +172,7 @@ static int mdss_smmu_attach_v2(struct mdss_data_type *mdata)
struct mdss_smmu_client *mdss_smmu;
int i, rc = 0;
+ mutex_lock(&mdp_iommu_lock);
for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) {
if (!mdss_smmu_is_valid_domain_type(mdata, i))
continue;
@@ -203,9 +204,12 @@ static int mdss_smmu_attach_v2(struct mdss_data_type *mdata)
}
} else {
pr_err("iommu device not attached for domain[%d]\n", i);
+ mutex_unlock(&mdp_iommu_lock);
return -ENODEV;
}
}
+ mutex_unlock(&mdp_iommu_lock);
+
return 0;
err:
@@ -217,6 +221,8 @@ err:
mdss_smmu->domain_attached = false;
}
}
+ mutex_unlock(&mdp_iommu_lock);
+
return rc;
}
@@ -231,6 +237,7 @@ static int mdss_smmu_detach_v2(struct mdss_data_type *mdata)
struct mdss_smmu_client *mdss_smmu;
int i;
+ mutex_lock(&mdp_iommu_lock);
for (i = 0; i < MDSS_IOMMU_MAX_DOMAIN; i++) {
if (!mdss_smmu_is_valid_domain_type(mdata, i))
continue;
@@ -239,6 +246,8 @@ static int mdss_smmu_detach_v2(struct mdss_data_type *mdata)
if (mdss_smmu && mdss_smmu->dev && !mdss_smmu->handoff_pending)
mdss_smmu_enable_power(mdss_smmu, false);
}
+ mutex_unlock(&mdp_iommu_lock);
+
return 0;
}