diff options
| author | Ken Zhang <kenz@codeaurora.org> | 2012-08-13 14:49:52 -0400 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:12:30 -0700 |
| commit | 4ef948eeb1a82bf732e31ba4dd76af60fcbaa67f (patch) | |
| tree | 7853d8242a09bb6d909c5a8de1b6f893d8563904 | |
| parent | 671e5c4c9e2fe350a7ac06746fb951ecc088deef (diff) | |
msm: display: csc configuration support via overlay
Implement overlay pp csc configuration for mdss
Reset the play cnt when MSMFB_OVERLAY_SET is called
Change-Id: Ice2e3700a275c5375ee4939bd3484b7ee5def898
Signed-off-by: Ken Zhang <kenz@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp.h | 4 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_overlay.c | 10 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pipe.c | 34 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pp.c | 2 |
4 files changed, 40 insertions, 10 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h index 8a7adc2e3783..663d8c1ecab0 100644 --- a/drivers/video/fbdev/msm/mdss_mdp.h +++ b/drivers/video/fbdev/msm/mdss_mdp.h @@ -242,6 +242,7 @@ struct mdss_mdp_pipe { struct mdss_mdp_data buffers[2]; struct list_head list; + struct mdp_overlay_pp_params pp_cfg; }; struct mdss_mdp_writeback_arg { @@ -295,6 +296,9 @@ int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe); int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg); int mdss_mdp_csc_setup(u32 block, u32 blk_idx, u32 tbl_idx, u32 csc_type); +int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, u32 tbl_idx, + struct mdp_csc_cfg *data); + int mdss_mdp_pp_setup(struct mdss_mdp_ctl *ctl); struct mdss_mdp_pipe *mdss_mdp_pipe_alloc_pnum(u32 pnum); diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c index 4596988544a9..d7e7a3f14542 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c +++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c @@ -316,7 +316,17 @@ static int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd, pipe->req_data = *req; + if (pipe->flags & MDP_OVERLAY_PP_CFG_EN) { + if (pipe->num <= MDSS_MDP_SSPP_VIG2) + memcpy(&pipe->pp_cfg, &req->overlay_pp_cfg, + sizeof(struct mdp_overlay_pp_params)); + else + pr_debug("%s: RGB Pipes don't support CSC/QSEED\n", + __func__); + } + pipe->params_changed++; + pipe->play_cnt = 0; req->id = pipe->ndx; diff --git a/drivers/video/fbdev/msm/mdss_mdp_pipe.c b/drivers/video/fbdev/msm/mdss_mdp_pipe.c index d0c9f9e657f4..79016344038a 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pipe.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pipe.c @@ -560,16 +560,32 @@ static int mdss_mdp_vig_setup(struct mdss_mdp_pipe *pipe) pr_debug("pnum=%x\n", pipe->num); - if (pipe->src_fmt->is_yuv) - opmode |= (0 << 19) | /* DST_DATA=RGB */ - (1 << 18) | /* SRC_DATA=YCBCR */ - (1 << 17); /* CSC_1_EN */ - - /* only need to program once */ - if (pipe->play_cnt == 0) { - mdss_mdp_csc_setup(MDSS_MDP_BLOCK_SSPP, pipe->num, 1, - MDSS_MDP_CSC_YUV2RGB); + /* CSC Post Processing enabled? */ + if (pipe->flags & MDP_OVERLAY_PP_CFG_EN) { + if (pipe->pp_cfg.config_ops & MDP_OVERLAY_PP_CSC_CFG) { + if (pipe->pp_cfg.csc_cfg.flags & MDP_CSC_FLAG_ENABLE) + opmode |= 1 << 17; /* CSC_1_EN */ + if (pipe->pp_cfg.csc_cfg.flags & MDP_CSC_FLAG_YUV_IN) + opmode |= 1 << 18; /* SRC_DATA=YCBCR */ + if (pipe->pp_cfg.csc_cfg.flags & MDP_CSC_FLAG_YUV_OUT) + opmode |= 1 << 19; /* DST_DATA=YCBCR */ + /* only need to program once */ + if (pipe->play_cnt == 0) + mdss_mdp_csc_setup_data(MDSS_MDP_BLOCK_SSPP, + pipe->num, 1, &pipe->pp_cfg.csc_cfg); + } + } else { + if (pipe->src_fmt->is_yuv) + opmode |= (0 << 19) | /* DST_DATA=RGB */ + (1 << 18) | /* SRC_DATA=YCBCR */ + (1 << 17); /* CSC_1_EN */ + /* only need to program once */ + if (pipe->play_cnt == 0) { + mdss_mdp_csc_setup(MDSS_MDP_BLOCK_SSPP, pipe->num, 1, + MDSS_MDP_CSC_YUV2RGB); + } } + mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_VIG_OP_MODE, opmode); return 0; diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c index 70eb6352d7dc..7179ddf0f563 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pp.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c @@ -93,7 +93,7 @@ struct mdss_pp_res_type { static DEFINE_MUTEX(mdss_pp_mutex); static struct mdss_pp_res_type *mdss_pp_res; -static int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, u32 tbl_idx, +int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, u32 tbl_idx, struct mdp_csc_cfg *data) { int i, ret = 0; |
