diff options
| author | Animesh Kishore <animeshk@codeaurora.org> | 2017-07-10 14:20:55 +0530 |
|---|---|---|
| committer | Animesh Kishore <animeshk@codeaurora.org> | 2017-08-02 01:52:47 +0530 |
| commit | 9b91b842c98a14ae058e33d6ffd7153114c6d5f0 (patch) | |
| tree | bc0ee384fe2416fc0a1865bddb27978933a7646b | |
| parent | c1b3ec77abceccd41c527c4ddf662fc5cc1c7ede (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.c | 37 |
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; } |
