Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ddc7643 authored by Krishna Chaitanya Parimi's avatar Krishna Chaitanya Parimi Committed by Gerrit - the friendly Code Review server
Browse files

msm: mdss: Protect ad_bl_level using ad_lock mutex



Variable ad_bl_level is used only by AD functions now,
and can be protected with ad_lock alone. Earlier it
was used outside of AD functions as well and protected
by bl_lock. Using bl_lock causing synchonization delays
with display thread hence we now use ad_lock.

Change-Id: I2ec98236c3fedee1eb4d8f8a851256ab66ab3026
Signed-off-by: default avatarKrishna Chaitanya Parimi <cparimi@codeaurora.org>
parent 80e46a9e
Loading
Loading
Loading
Loading
+13 −29
Original line number Diff line number Diff line
@@ -1117,8 +1117,8 @@ static void mdss_fb_scale_bl(struct msm_fb_data_type *mfd, u32 *bl_lvl)
void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl)
{
	struct mdss_panel_data *pdata;
	u32 temp = bkl_lvl, ad_bl;
	int ret = -EINVAL;
	u32 temp = bkl_lvl;
	bool bl_notify_needed = false;

	if ((((mdss_fb_is_power_off(mfd) && mfd->dcm_state != DCM_ENTER)
		|| !mfd->bl_updated) && !IS_CALIB_MODE_BL(mfd)) ||
@@ -1132,18 +1132,11 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl)
	pdata = dev_get_platdata(&mfd->pdev->dev);

	if ((pdata) && (pdata->set_backlight)) {
		if (mfd->mdp.ad_calc_bl) {
			if (mfd->ad_bl_level == 0)
				mfd->ad_bl_level = temp;
			ad_bl = mfd->ad_bl_level;
			ret = (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp, &ad_bl);
			if ((!ret) && (mfd->ad_bl_level != ad_bl) &&
				mfd->mdp.ad_invalidate_input) {
				mfd->ad_bl_level = ad_bl;
				(*mfd->mdp.ad_invalidate_input)(mfd);
		if (mfd->mdp.ad_calc_bl)
			(*mfd->mdp.ad_calc_bl)(mfd, temp, &temp,
							&bl_notify_needed);
		if (bl_notify_needed)
			mdss_fb_bl_update_notify(mfd);
			}
		}
		if (!IS_CALIB_MODE_BL(mfd))
			mdss_fb_scale_bl(mfd, &temp);
		/*
@@ -1168,9 +1161,8 @@ void mdss_fb_set_backlight(struct msm_fb_data_type *mfd, u32 bkl_lvl)
void mdss_fb_update_backlight(struct msm_fb_data_type *mfd)
{
	struct mdss_panel_data *pdata;
	int ret = 0;
	u32 temp;
	u32 ad_bl;
	bool bl_notify = false;

	if (!mfd->unset_bl_level)
		return;
@@ -1180,19 +1172,11 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd)
		if ((pdata) && (pdata->set_backlight)) {
			mfd->bl_level = mfd->unset_bl_level;
			temp = mfd->bl_level;
			if (mfd->mdp.ad_calc_bl) {
				if (mfd->ad_bl_level == 0)
					mfd->ad_bl_level = temp;
				ad_bl = mfd->ad_bl_level;
				ret = (*mfd->mdp.ad_calc_bl)(mfd, temp, &temp,
					&ad_bl);
				if ((!ret) && (mfd->ad_bl_level != ad_bl) &&
						mfd->mdp.ad_invalidate_input) {
					mfd->ad_bl_level = ad_bl;
					(*mfd->mdp.ad_invalidate_input)(mfd);
			if (mfd->mdp.ad_calc_bl)
				(*mfd->mdp.ad_calc_bl)(mfd, temp, &temp,
								&bl_notify);
			if (bl_notify)
				mdss_fb_bl_update_notify(mfd);
				}
			}
			pdata->set_backlight(pdata, temp);
			mfd->bl_level_scaled = mfd->unset_bl_level;
			mfd->bl_updated = 1;
+1 −2
Original line number Diff line number Diff line
@@ -202,9 +202,8 @@ struct msm_mdp_interface {
	int (*lut_update)(struct msm_fb_data_type *mfd, struct fb_cmap *cmap);
	int (*do_histogram)(struct msm_fb_data_type *mfd,
				struct mdp_histogram *hist);
	int (*ad_invalidate_input)(struct msm_fb_data_type *mfd);
	int (*ad_calc_bl)(struct msm_fb_data_type *mfd, int bl_in,
		int *bl_out, int *ad_bl_out);
		int *bl_out, bool *bl_out_notify);
	int (*panel_register_done)(struct mdss_panel_data *pdata);
	u32 (*fb_stride)(u32 fb_index, u32 xres, int bpp);
	int (*splash_init_fnc)(struct msm_fb_data_type *mfd);
+16 −14
Original line number Diff line number Diff line
@@ -438,7 +438,7 @@ static int pp_ad_attenuate_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out);
static int pp_ad_linearize_bl(struct mdss_ad_info *ad, u32 bl, u32 *bl_out,
		int inv);
static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
		int *ad_bl_out);
		bool *bl_out_notify);
static int pp_num_to_side(struct mdss_mdp_ctl *ctl, u32 num);
static inline bool pp_sts_is_enabled(u32 sts, int side);
static inline void pp_sts_set_split_bits(u32 *sts, u32 bits);
@@ -2063,11 +2063,8 @@ int mdss_mdp_pp_resume(struct mdss_mdp_ctl *ctl, u32 dspp_num)
			bl_mfd = ctl->mfd;
		}

		mutex_lock(&bl_mfd->bl_lock);
		bl = bl_mfd->ad_bl_level;
		mutex_unlock(&bl_mfd->bl_lock);

		mutex_lock(&ad->lock);
		bl = bl_mfd->ad_bl_level;
		if (PP_AD_STATE_CFG & ad->state)
			pp_ad_cfg_write(&mdata->ad_off[dspp_num], ad);
		if (PP_AD_STATE_INIT & ad->state)
@@ -2193,17 +2190,16 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd)
		return -EPERM;
	}

	mfd->mdp.ad_invalidate_input = pp_ad_invalidate_input;
	mfd->mdp.ad_calc_bl = pp_ad_calc_bl;

	return 0;
}

int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
	int *ad_bl_out)
static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
	bool *bl_out_notify)
{
	int ret = -1;
	int temp = bl_in;
	u32 ad_bl_out = 0;
	struct mdss_ad_info *ad;

	ret = mdss_mdp_get_ad(mfd, &ad);
@@ -2247,7 +2243,7 @@ int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
		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);
	if (ret) {
@@ -2256,6 +2252,14 @@ int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
		return ret;
	}
	*bl_out = temp;

	if (ad_bl_out != mfd->ad_bl_level) {
		mfd->ad_bl_level = ad_bl_out;
		*bl_out_notify = true;
	}

	if (*bl_out_notify)
		pp_ad_invalidate_input(mfd);
	mutex_unlock(&ad->lock);
	return 0;
}
@@ -4923,10 +4927,6 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd)

	mdata = mfd_to_mdata(mfd);

	mutex_lock(&bl_mfd->bl_lock);
	bl = bl_mfd->ad_bl_level;
	mutex_unlock(&bl_mfd->bl_lock);

	mutex_lock(&ad->lock);
	if (ad->sts != last_sts || ad->state != last_state) {
		last_sts = ad->sts;
@@ -4944,6 +4944,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);
		bl = bl_mfd->ad_bl_level;

		if ((ad->cfg.mode == MDSS_AD_MODE_AUTO_STR) &&
							(ad->last_bl != bl)) {
			ad->last_bl = bl;