msm: mdss: Fix AD backlight configuration
When AD backlight attenuation feature is not enabled, the backlight send to panel doesn't need to go through the backlight linearization and inverse linearization. Also set ad_bl_level to the current panel backlight level when AD is enabled the first time and reset the ad_bl_level to 0 when AD is disabled. Change-Id: If96eccd817ecee6eae5fcc56fda29197b8b9f50d Signed-off-by: Ping Li <pingli@codeaurora.org>
This commit is contained in:
parent
a3cb6c089a
commit
570f2550be
1 changed files with 24 additions and 16 deletions
|
@ -3099,8 +3099,8 @@ static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
|
|||
mutex_lock(&ad->lock);
|
||||
if (!mfd->ad_bl_level)
|
||||
mfd->ad_bl_level = bl_in;
|
||||
if (!(ad->state & PP_AD_STATE_RUN)) {
|
||||
pr_debug("AD is not running.\n");
|
||||
if (!(ad->sts & PP_STS_ENABLE)) {
|
||||
pr_debug("AD is not enabled.\n");
|
||||
mutex_unlock(&ad->lock);
|
||||
return -EPERM;
|
||||
}
|
||||
|
@ -3123,22 +3123,27 @@ static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = pp_ad_attenuate_bl(ad, temp, &temp);
|
||||
if (ret) {
|
||||
pr_err("Failed to attenuate BL: %d\n", ret);
|
||||
mutex_unlock(&ad->lock);
|
||||
return ret;
|
||||
}
|
||||
ad_bl_out = temp;
|
||||
if (ad->init.alpha > 0) {
|
||||
ret = pp_ad_attenuate_bl(ad, temp, &temp);
|
||||
if (ret) {
|
||||
pr_err("Failed to attenuate BL: %d\n", ret);
|
||||
mutex_unlock(&ad->lock);
|
||||
return ret;
|
||||
}
|
||||
ad_bl_out = temp;
|
||||
|
||||
ret = pp_ad_linearize_bl(ad, temp, &temp, MDP_PP_AD_BL_LINEAR_INV);
|
||||
if (ret) {
|
||||
pr_err("Failed to inverse linearize BL: %d\n", ret);
|
||||
mutex_unlock(&ad->lock);
|
||||
return ret;
|
||||
ret = pp_ad_linearize_bl(ad, temp, &temp,
|
||||
MDP_PP_AD_BL_LINEAR_INV);
|
||||
if (ret) {
|
||||
pr_err("Failed to inverse linearize BL: %d\n", ret);
|
||||
mutex_unlock(&ad->lock);
|
||||
return ret;
|
||||
}
|
||||
*bl_out = temp;
|
||||
} else {
|
||||
ad_bl_out = temp;
|
||||
}
|
||||
|
||||
*bl_out = temp;
|
||||
if (pp_ad_bl_threshold_check(ad->init.al_thresh, ad->init.alpha_base,
|
||||
ad->last_bl, ad_bl_out)) {
|
||||
mfd->ad_bl_level = ad_bl_out;
|
||||
|
@ -6193,6 +6198,8 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd)
|
|||
ad->sts &= ~PP_AD_STS_DIRTY_DATA;
|
||||
ad->state |= PP_AD_STATE_DATA;
|
||||
pr_debug("dirty data, last_bl = %d\n", ad->last_bl);
|
||||
if (!bl_mfd->ad_bl_level)
|
||||
bl_mfd->ad_bl_level = bl_mfd->bl_level;
|
||||
bl = bl_mfd->ad_bl_level;
|
||||
|
||||
if (ad->last_bl != bl) {
|
||||
|
@ -6280,6 +6287,7 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd)
|
|||
memset(&ad->cfg, 0, sizeof(struct mdss_ad_cfg));
|
||||
bl_mfd->ext_bl_ctrl = 0;
|
||||
bl_mfd->ext_ad_ctrl = -1;
|
||||
bl_mfd->ad_bl_level = 0;
|
||||
}
|
||||
ad->state &= ~PP_AD_STATE_RUN;
|
||||
}
|
||||
|
@ -6384,7 +6392,7 @@ static void pp_ad_cfg_lut(char __iomem *addr, u32 *data)
|
|||
}
|
||||
|
||||
/* must call this function from within ad->lock */
|
||||
static int pp_ad_attenuate_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out)
|
||||
static int pp_ad_attenuate_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out)
|
||||
{
|
||||
u32 shift = 0, ratio_temp = 0;
|
||||
u32 n, lut_interval, bl_att;
|
||||
|
|
Loading…
Add table
Reference in a new issue