summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_ctl.c24
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c3
3 files changed, 27 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index ef008f3edc4c..9fdd16a006f7 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -168,6 +168,7 @@ struct mdss_mdp_ctl {
struct mdss_mdp_perf_params cur_perf;
struct mdss_mdp_perf_params new_perf;
u32 perf_transaction_status;
+ bool perf_release_ctl_bw;
struct mdss_data_type *mdata;
struct msm_fb_data_type *mfd;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_ctl.c b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
index 938578ec39c4..207c20164b50 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_ctl.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_ctl.c
@@ -919,6 +919,17 @@ u32 mdss_mdp_ctl_perf_get_transaction_status(struct mdss_mdp_ctl *ctl)
unsigned long flags;
u32 transaction_status;
+ if (!ctl)
+ return PERF_STATUS_BUSY;
+
+ /*
+ * If Rotator mode and bandwidth has been released; return STATUS_DONE
+ * so the bandwidth is re-calculated.
+ */
+ if (ctl->mixer_left && ctl->mixer_left->rotator_mode &&
+ !ctl->perf_release_ctl_bw)
+ return PERF_STATUS_DONE;
+
/*
* If Video Mode or not valid data to determine the status, return busy
* status, so the bandwidth cannot be freed by the caller
@@ -1035,6 +1046,14 @@ static int mdss_mdp_select_clk_lvl(struct mdss_mdp_ctl *ctl,
return clk_rate;
}
+static void mdss_mdp_perf_release_ctl_bw(struct mdss_mdp_ctl *ctl,
+ struct mdss_mdp_perf_params *perf)
+{
+ /* Set to zero controller bandwidth. */
+ memset(perf, 0, sizeof(*perf));
+ ctl->perf_release_ctl_bw = false;
+}
+
static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl,
int params_changed)
{
@@ -1059,7 +1078,9 @@ static void mdss_mdp_ctl_perf_update(struct mdss_mdp_ctl *ctl,
is_bw_released = !mdss_mdp_ctl_perf_get_transaction_status(ctl);
if (ctl->power_on) {
- if (is_bw_released || params_changed)
+ if (ctl->perf_release_ctl_bw)
+ mdss_mdp_perf_release_ctl_bw(ctl, new);
+ else if (is_bw_released || params_changed)
mdss_mdp_perf_calc_ctl(ctl, new);
/*
* if params have just changed delay the update until
@@ -1624,6 +1645,7 @@ struct mdss_mdp_ctl *mdss_mdp_ctl_init(struct mdss_panel_data *pdata,
ctl->mfd = mfd;
ctl->panel_data = pdata;
ctl->is_video_mode = false;
+ ctl->perf_release_ctl_bw = false;
switch (pdata->panel_info.type) {
case EDP_PANEL:
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
index c65b9f71e60b..fe98266e1f81 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_writeback.c
@@ -466,6 +466,9 @@ static int mdss_mdp_wb_wait4comp(struct mdss_mdp_ctl *ctl, void *arg)
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false); /* clock off */
+ /* Set flag to release Controller Bandwidth */
+ ctl->perf_release_ctl_bw = true;
+
ctx->comp_cnt--;
return rc;