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

Commit 2943afb1 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: mdss: Protect ad_bl_level using ad_lock mutex"

parents 8287f058 99b67ada
Loading
Loading
Loading
Loading
+8 −28
Original line number Diff line number Diff line
@@ -1058,8 +1058,7 @@ 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;

	/* todo: temporary workaround to support doze mode */
@@ -1081,18 +1080,9 @@ 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);
				bl_notify_needed = true;
			}
		}
		if (mfd->mdp.ad_calc_bl)
			(*mfd->mdp.ad_calc_bl)(mfd, temp, &temp,
							&bl_notify_needed);
		if (!IS_CALIB_MODE_BL(mfd))
			mdss_fb_scale_bl(mfd, &temp);
		/*
@@ -1120,9 +1110,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;
@@ -1132,18 +1121,9 @@ 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);
			pdata->set_backlight(pdata, temp);
			mfd->bl_level_old = mfd->unset_bl_level;
			mfd->bl_updated = 1;
+1 −2
Original line number Diff line number Diff line
@@ -165,9 +165,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);
+20 −15
Original line number Diff line number Diff line
/*
 * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -437,7 +437,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);
@@ -2023,11 +2023,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)
@@ -2155,17 +2152,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);
@@ -2209,7 +2205,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) {
@@ -2218,6 +2214,17 @@ int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out,
		return ret;
	}
	*bl_out = temp;

	if (!mfd->ad_bl_level)
		mfd->ad_bl_level = bl_in;

	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;
}
@@ -4876,10 +4883,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;
@@ -4897,6 +4900,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;