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:
Ping Li 2016-07-08 14:42:11 -07:00
parent a3cb6c089a
commit 570f2550be

View file

@ -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;