diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-08-13 23:13:13 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-08-13 23:13:12 -0700 |
| commit | 77e4349ae1ae132090a7281a19e1c0de65a1bd65 (patch) | |
| tree | 2ccbed0a2ef4320ea66e0baef177d27219412358 | |
| parent | 0ec8200353232eced34a62a118835920360674fd (diff) | |
| parent | ffa14738c07bd2e2aa7d26e3dec9fd498b397bce (diff) | |
Merge "msm: mdss: fix dma fifo read watermark to 15/16 full"
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi_host.c | 3 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c | 16 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_layer.c | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_smmu.c | 9 |
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; } |
