Merge "msm: mdss: Fix AD backlight configuration"

This commit is contained in:
Linux Build Service Account 2016-07-13 15:45:19 -07:00 committed by Gerrit - the friendly Code Review server
commit 5551ac503f

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); mutex_lock(&ad->lock);
if (!mfd->ad_bl_level) if (!mfd->ad_bl_level)
mfd->ad_bl_level = bl_in; mfd->ad_bl_level = bl_in;
if (!(ad->state & PP_AD_STATE_RUN)) { if (!(ad->sts & PP_STS_ENABLE)) {
pr_debug("AD is not running.\n"); pr_debug("AD is not enabled.\n");
mutex_unlock(&ad->lock); mutex_unlock(&ad->lock);
return -EPERM; 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; return ret;
} }
ret = pp_ad_attenuate_bl(ad, temp, &temp); if (ad->init.alpha > 0) {
if (ret) { ret = pp_ad_attenuate_bl(ad, temp, &temp);
pr_err("Failed to attenuate BL: %d\n", ret); if (ret) {
mutex_unlock(&ad->lock); pr_err("Failed to attenuate BL: %d\n", ret);
return ret; mutex_unlock(&ad->lock);
} return ret;
ad_bl_out = temp; }
ad_bl_out = temp;
ret = pp_ad_linearize_bl(ad, temp, &temp, MDP_PP_AD_BL_LINEAR_INV); ret = pp_ad_linearize_bl(ad, temp, &temp,
if (ret) { MDP_PP_AD_BL_LINEAR_INV);
pr_err("Failed to inverse linearize BL: %d\n", ret); if (ret) {
mutex_unlock(&ad->lock); pr_err("Failed to inverse linearize BL: %d\n", ret);
return 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, if (pp_ad_bl_threshold_check(ad->init.al_thresh, ad->init.alpha_base,
ad->last_bl, ad_bl_out)) { ad->last_bl, ad_bl_out)) {
mfd->ad_bl_level = 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->sts &= ~PP_AD_STS_DIRTY_DATA;
ad->state |= PP_AD_STATE_DATA; ad->state |= PP_AD_STATE_DATA;
pr_debug("dirty data, last_bl = %d\n", ad->last_bl); 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; bl = bl_mfd->ad_bl_level;
if (ad->last_bl != bl) { 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)); memset(&ad->cfg, 0, sizeof(struct mdss_ad_cfg));
bl_mfd->ext_bl_ctrl = 0; bl_mfd->ext_bl_ctrl = 0;
bl_mfd->ext_ad_ctrl = -1; bl_mfd->ext_ad_ctrl = -1;
bl_mfd->ad_bl_level = 0;
} }
ad->state &= ~PP_AD_STATE_RUN; 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 */ /* 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 shift = 0, ratio_temp = 0;
u32 n, lut_interval, bl_att; u32 n, lut_interval, bl_att;
@ -7401,8 +7409,8 @@ static int pp_mfd_ad_release_all(struct msm_fb_data_type *mfd)
ad->mfd = NULL; ad->mfd = NULL;
ad->bl_mfd = NULL; ad->bl_mfd = NULL;
ad->state = 0; ad->state = 0;
cancel_work_sync(&ad->calc_work);
mutex_unlock(&ad->lock); mutex_unlock(&ad->lock);
cancel_work_sync(&ad->calc_work);
ctl = mfd_to_ctl(mfd); ctl = mfd_to_ctl(mfd);
if (ctl && ctl->ops.remove_vsync_handler) if (ctl && ctl->ops.remove_vsync_handler)