diff options
| author | Carl Vanderlip <carlv@codeaurora.org> | 2013-11-11 16:28:02 -0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:23:27 -0700 |
| commit | 00f65611ea70a67313c81760b65ce907e9682970 (patch) | |
| tree | f58f96f0b7cbdb7ff52a5893d3b62c37a29792ab /drivers/video/fbdev | |
| parent | c98e604a99bf616665bd9cca09266e8112ae859d (diff) | |
msm: mdss: Support Assertive Display merged mode
Add support for merged mode in Assertive Display to be used when MDSS is
configured in dual pipe mode. Add specification of slave hw for clarity.
Change-Id: Ia3f15c36ab79120867f9cf186414783e15e53191
Signed-off-by: Carl Vanderlip <carlv@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_hwio.h | 5 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_mdp_pp.c | 58 |
2 files changed, 59 insertions, 4 deletions
diff --git a/drivers/video/fbdev/msm/mdss_mdp_hwio.h b/drivers/video/fbdev/msm/mdss_mdp_hwio.h index aad7954d002b..cd4c5ddbc73b 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_hwio.h +++ b/drivers/video/fbdev/msm/mdss_mdp_hwio.h @@ -408,6 +408,11 @@ enum mdss_mdp_writeback_index { #define MDSS_MDP_REG_AD_STR_OUT 0x14C #define MDSS_MDP_REG_AD_BL_OUT 0x154 #define MDSS_MDP_REG_AD_CALC_DONE 0x158 +#define MDSS_MDP_REG_AD_FRAME_END 0x15C +#define MDSS_MDP_REG_AD_PROCS_END 0x160 +#define MDSS_MDP_REG_AD_FRAME_START 0x164 +#define MDSS_MDP_REG_AD_PROCS_START 0x168 +#define MDSS_MDP_REG_AD_TILE_CTRL 0x16C enum mdss_mdp_dspp_index { MDSS_MDP_DSPP0, diff --git a/drivers/video/fbdev/msm/mdss_mdp_pp.c b/drivers/video/fbdev/msm/mdss_mdp_pp.c index ee083f04a6c0..7350ed797ea2 100644 --- a/drivers/video/fbdev/msm/mdss_mdp_pp.c +++ b/drivers/video/fbdev/msm/mdss_mdp_pp.c @@ -373,7 +373,7 @@ static void pp_ad_vsync_handler(struct mdss_mdp_ctl *ctl, ktime_t t); static void pp_ad_cfg_write(struct mdss_mdp_ad *ad_hw, struct mdss_ad_info *ad); static void pp_ad_init_write(struct mdss_mdp_ad *ad_hw, - struct mdss_ad_info *ad); + struct mdss_ad_info *ad, struct mdss_mdp_ctl *ctl); static void pp_ad_input_write(struct mdss_mdp_ad *ad_hw, struct mdss_ad_info *ad); static void pp_ad_bypass_config(struct mdss_ad_info *ad, u32 *opmode); @@ -1502,7 +1502,7 @@ static int pp_dspp_setup(u32 disp_num, struct mdss_mdp_mixer *mixer) if (ad_flags & PP_AD_STS_DIRTY_DATA) pp_ad_input_write(ad_hw, ad); if (ad_flags & PP_AD_STS_DIRTY_INIT) - pp_ad_init_write(ad_hw, ad); + pp_ad_init_write(ad_hw, ad, ctl); if (ad_flags & PP_AD_STS_DIRTY_CFG) pp_ad_cfg_write(ad_hw, ad); pp_ad_bypass_config(ad, &ad_bypass); @@ -1621,7 +1621,7 @@ int mdss_mdp_pp_resume(struct mdss_mdp_ctl *ctl, u32 dspp_num) if (PP_AD_STATE_CFG & ad->state) pp_ad_cfg_write(&mdata->ad_off[dspp_num], ad); if (PP_AD_STATE_INIT & ad->state) - pp_ad_init_write(&mdata->ad_off[dspp_num], ad); + pp_ad_init_write(&mdata->ad_off[dspp_num], ad, ctl); if ((PP_AD_STATE_DATA & ad->state) && (ad->sts & PP_STS_ENABLE)) { bl = ad->bl_mfd->bl_level; @@ -3778,12 +3778,27 @@ static void pp_ad_input_write(struct mdss_mdp_ad *ad_hw, } } -static void pp_ad_init_write(struct mdss_mdp_ad *ad_hw, struct mdss_ad_info *ad) +#define MDSS_AD_MERGED_WIDTH 4 +static void pp_ad_init_write(struct mdss_mdp_ad *ad_hw, struct mdss_ad_info *ad, + struct mdss_mdp_ctl *ctl) { + struct mdss_data_type *mdata = ctl->mdata; u32 temp; + u32 frame_start, frame_end, procs_start, procs_end, tile_ctrl; + u32 num; char __iomem *base; + bool is_calc, is_dual_pipe; + u32 mixer_id[MDSS_MDP_INTF_MAX_LAYERMIXER]; + u32 mixer_num; + mixer_num = mdss_mdp_get_ctl_mixers(ctl->mfd->index, mixer_id); + if (mixer_num > 1) + is_dual_pipe = true; + else + is_dual_pipe = false; base = ad_hw->base; + is_calc = ad->calc_hw_num == ad_hw->num; + writel_relaxed(ad->init.i_control[0] & 0x1F, base + MDSS_MDP_REG_AD_CON_CTRL_0); writel_relaxed(ad->init.i_control[1] << 8, @@ -3818,6 +3833,41 @@ static void pp_ad_init_write(struct mdss_mdp_ad *ad_hw, struct mdss_ad_info *ad) pp_ad_cfg_lut(base + MDSS_MDP_REG_AD_LUT_FI, ad->init.asym_lut); pp_ad_cfg_lut(base + MDSS_MDP_REG_AD_LUT_CC, ad->init.color_corr_lut); + + if (mdata->mdp_rev >= MDSS_MDP_HW_REV_103) { + if (is_dual_pipe) { + num = ad_hw->num; + tile_ctrl = 0x5; + if (is_calc) { + frame_start = 0; + procs_start = 0; + frame_end = mdata->mixer_intf[num].width + + MDSS_AD_MERGED_WIDTH; + procs_end = mdata->mixer_intf[num].width; + } else { + tile_ctrl |= 0x10; + procs_start = ad->init.frame_w - + (mdata->mixer_intf[num].width); + procs_end = ad->init.frame_w; + frame_start = procs_start - + MDSS_AD_MERGED_WIDTH; + frame_end = procs_end; + } + procs_end -= 1; + frame_end -= 1; + } else { + frame_start = 0x0; + frame_end = 0xFFFF; + procs_start = 0x0; + procs_end = 0xFFFF; + tile_ctrl = 0x1; + } + writel_relaxed(frame_start, base + MDSS_MDP_REG_AD_FRAME_START); + writel_relaxed(frame_end, base + MDSS_MDP_REG_AD_FRAME_END); + writel_relaxed(procs_start, base + MDSS_MDP_REG_AD_PROCS_START); + writel_relaxed(procs_end, base + MDSS_MDP_REG_AD_PROCS_END); + writel_relaxed(tile_ctrl, base + MDSS_MDP_REG_AD_TILE_CTRL); + } } #define MDSS_PP_AD_DEF_CALIB 0x6E |
