summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev/msm
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-07-27 19:27:05 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-07-27 19:27:04 -0700
commit484b6badfda4f32016c72e5c4badeb9aca8621ba (patch)
tree532d86d0e59df4cd555e48a8719415335795d020 /drivers/video/fbdev/msm
parentaf23db40984e1e3d30941102cd02bab8ac3dd89e (diff)
parent188d4b02b9f94c3dfa73026672516cb44e8f0271 (diff)
Merge "msm: mdss: Update LM parameters during dest scaler transition"
Diffstat (limited to 'drivers/video/fbdev/msm')
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_layer.c49
1 files changed, 37 insertions, 12 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_layer.c b/drivers/video/fbdev/msm/mdss_mdp_layer.c
index 17cbdd44755a..0ae420724d61 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_layer.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_layer.c
@@ -114,7 +114,7 @@ static int __dest_scaler_data_setup(struct mdp_destination_scaler_data *ds_data,
}
static int mdss_mdp_destination_scaler_pre_validate(struct mdss_mdp_ctl *ctl,
- struct mdp_destination_scaler_data *ds_data)
+ struct mdp_destination_scaler_data *ds_data, int ds_count)
{
struct mdss_data_type *mdata;
struct mdss_panel_info *pinfo;
@@ -127,7 +127,7 @@ static int mdss_mdp_destination_scaler_pre_validate(struct mdss_mdp_ctl *ctl,
* when we switch between scaling factor or disabling scaling.
*/
if (test_bit(MDSS_CAPS_DEST_SCALER, mdata->mdss_caps_map)) {
- if (ctl->mixer_left) {
+ if (ctl->mixer_left && ctl->mixer_left->ds) {
/*
* Any scale update from usermode, we will update the
* mixer width and height with the given LM width and
@@ -149,10 +149,25 @@ static int mdss_mdp_destination_scaler_pre_validate(struct mdss_mdp_ctl *ctl,
ctl->mixer_left->height = ds_data->lm_height;
pr_debug("Update mixer-left width/height: %dx%d\n",
ds_data->lm_width, ds_data->lm_width);
-
}
- if (ctl->mixer_right) {
+ if (ctl->mixer_right && ctl->mixer_right->ds) {
+ /*
+ * Advanced to next ds_data structure from commit if
+ * there is more than 1 for split display usecase.
+ */
+ if (ds_count > 1)
+ ds_data++;
+
+ pinfo = &ctl->panel_data->panel_info;
+ if ((ds_data->lm_width > get_panel_xres(pinfo)) ||
+ (ds_data->lm_height > get_panel_yres(pinfo)) ||
+ (ds_data->lm_width == 0) ||
+ (ds_data->lm_height == 0)) {
+ pr_err("Invalid LM width / height setting\n");
+ return -EINVAL;
+ }
+
/*
* Split display both left and right should have the
* same width and height
@@ -162,6 +177,15 @@ static int mdss_mdp_destination_scaler_pre_validate(struct mdss_mdp_ctl *ctl,
pr_info("Update mixer-right width/height: %dx%d\n",
ds_data->lm_width, ds_data->lm_height);
+ if (ctl->mixer_left &&
+ ((ctl->mixer_right->width !=
+ ctl->mixer_left->width) ||
+ (ctl->mixer_right->height !=
+ ctl->mixer_left->height))) {
+ pr_err("Mismatch width/heigth in LM for split display\n");
+ return -EINVAL;
+ }
+
/*
* For split display, CTL width should be equal to
* whole panel size
@@ -2098,17 +2122,17 @@ static int __validate_layers(struct msm_fb_data_type *mfd,
if (test_bit(MDSS_CAPS_DEST_SCALER, mdata->mdss_caps_map) &&
commit->dest_scaler &&
commit->dest_scaler_cnt) {
+ struct mdp_destination_scaler_data *ds_data =
+ commit->dest_scaler;
+
/*
- * Find out which DS block to use based on LM assignment
+ * Find out which DS block to use based on DS commit info
*/
- if ((left_cnt > 0) && (right_cnt > 0) &&
- (commit->dest_scaler_cnt == 2))
+ if (commit->dest_scaler_cnt == 2)
ds_mode = DS_DUAL_MODE;
- else if ((left_cnt > 0) && (right_cnt == 0) &&
- (commit->dest_scaler_cnt == 1))
+ else if (ds_data->dest_scaler_ndx == 0)
ds_mode = DS_LEFT;
- else if ((left_cnt == 0) && (right_cnt > 0) &&
- (commit->dest_scaler_cnt == 1))
+ else if (ds_data->dest_scaler_ndx == 1)
ds_mode = DS_RIGHT;
else {
pr_err("Commit destination scaler count not matching with LM assignment, DS-cnt:%d\n",
@@ -2396,7 +2420,8 @@ int mdss_mdp_layer_atomic_validate(struct msm_fb_data_type *mfd,
if (commit->dest_scaler && commit->dest_scaler_cnt) {
rc = mdss_mdp_destination_scaler_pre_validate(mdp5_data->ctl,
- commit->dest_scaler);
+ commit->dest_scaler,
+ commit->dest_scaler_cnt);
if (IS_ERR_VALUE(rc)) {
pr_err("Destination scaler pre-validate failed\n");
return -EINVAL;