summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnimesh Kishore <animeshk@codeaurora.org>2017-07-10 14:20:55 +0530
committerAnimesh Kishore <animeshk@codeaurora.org>2017-08-02 01:52:47 +0530
commit9b91b842c98a14ae058e33d6ffd7153114c6d5f0 (patch)
treebc0ee384fe2416fc0a1865bddb27978933a7646b
parentc1b3ec77abceccd41c527c4ddf662fc5cc1c7ede (diff)
msm: mdss: Allow CSC reconfiguration for staged pipe
CSC registers are double buffered from msm8998 onwards. Hence allow reconfiguration of CSC for staged pipe. Change-Id: I8108d0a70b54c07d71c165b6b5f596726b027425 Signed-off-by: Animesh Kishore <animeshk@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_layer.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_layer.c b/drivers/video/fbdev/msm/mdss_mdp_layer.c
index 3ccc09d58480..ff93c343d41f 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_layer.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_layer.c
@@ -975,26 +975,31 @@ static int __validate_layer_reconfig(struct mdp_input_layer *layer,
struct mdss_mdp_pipe *pipe)
{
int status = 0;
- struct mdss_mdp_format_params *src_fmt;
+ struct mdss_mdp_format_params *layer_src_fmt;
+ struct mdss_data_type *mdata = mfd_to_mdata(pipe->mfd);
+ bool is_csc_db = (mdata->mdp_rev < MDSS_MDP_HW_REV_300) ? false : true;
+
+ layer_src_fmt = mdss_mdp_get_format_params(layer->buffer.format);
+ if (!layer_src_fmt) {
+ pr_err("Invalid layer format %d\n", layer->buffer.format);
+ status = -EINVAL;
+ goto err_exit;
+ }
/*
- * csc registers are not double buffered. It is not permitted
- * to change them on staged pipe with YUV layer.
+ * HW earlier to sdm 3.x.x does not support double buffer CSC.
+ * Invalidate any reconfig of CSC block on staged pipe.
*/
- if (pipe->csc_coeff_set != layer->color_space) {
- src_fmt = mdss_mdp_get_format_params(layer->buffer.format);
- if (!src_fmt) {
- pr_err("Invalid layer format %d\n",
- layer->buffer.format);
- status = -EINVAL;
- } else {
- if (pipe->src_fmt->is_yuv && src_fmt &&
- src_fmt->is_yuv) {
- status = -EPERM;
- pr_err("csc change is not permitted on used pipe\n");
- }
- }
+ if (!is_csc_db &&
+ ((!!pipe->src_fmt->is_yuv != !!layer_src_fmt->is_yuv) ||
+ (pipe->src_fmt->is_yuv && layer_src_fmt->is_yuv &&
+ pipe->csc_coeff_set != layer->color_space))) {
+ pr_err("CSC reconfig not allowed on staged pipe\n");
+ status = -EINVAL;
+ goto err_exit;
}
+
+err_exit:
return status;
}