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

Commit bb6c45ae 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: Add missing locks in histogram collection for collect enable"

parents 11cb582c de52f151
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -3522,12 +3522,13 @@ static int pp_hist_collect(struct mdp_histogram_data *hist,
		return -EPERM;

	mutex_lock(&hist_info->hist_mutex);
	spin_lock_irqsave(&hist_info->hist_lock, flag);
	if ((hist_info->col_en == 0) ||
			(hist_info->col_state == HIST_UNKNOWN)) {
		ret = -EINVAL;
		spin_unlock_irqrestore(&hist_info->hist_lock, flag);
		goto hist_collect_exit;
	}
	spin_lock_irqsave(&hist_info->hist_lock, flag);
	/* wait for hist done if cache has no data */
	if (hist_info->col_state != HIST_READY) {
		spin_unlock_irqrestore(&hist_info->hist_lock, flag);
@@ -3543,9 +3544,9 @@ static int pp_hist_collect(struct mdp_histogram_data *hist,
				&(hist_info->comp), timeout);

		mutex_lock(&hist_info->hist_mutex);
		spin_lock_irqsave(&hist_info->hist_lock, flag);
		if (wait_ret == 0) {
			ret = -ETIMEDOUT;
			spin_lock_irqsave(&hist_info->hist_lock, flag);
			pr_debug("bin collection timedout, state %d",
					hist_info->col_state);
			/*
@@ -3560,26 +3561,22 @@ static int pp_hist_collect(struct mdp_histogram_data *hist,
			 */
			hist_info->hist_cnt_time++;
			hist_info->col_state = HIST_READY;
			spin_unlock_irqrestore(&hist_info->hist_lock, flag);
		} else if (wait_ret < 0) {
			ret = -EINTR;
			pr_debug("%s: bin collection interrupted",
					__func__);
			spin_unlock_irqrestore(&hist_info->hist_lock, flag);
			goto hist_collect_exit;
		}
		if (hist_info->col_state != HIST_READY) {
			ret = -ENODATA;
			spin_lock_irqsave(&hist_info->hist_lock, flag);
			hist_info->col_state = HIST_READY;
			spin_unlock_irqrestore(&hist_info->hist_lock, flag);
			pr_debug("%s: state is not ready: %d",
					__func__, hist_info->col_state);
		}
	} else {
		spin_unlock_irqrestore(&hist_info->hist_lock, flag);
	}
	spin_lock_irqsave(&hist_info->hist_lock, flag);
	if (hist_info->col_state == HIST_READY) {
		hist_info->col_state = HIST_IDLE;
		spin_unlock_irqrestore(&hist_info->hist_lock, flag);
		v_base = ctl_base + 0x1C;
		mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON, false);
@@ -3588,12 +3585,11 @@ static int pp_hist_collect(struct mdp_histogram_data *hist,
		if (is_hist_v2)
			writel_relaxed(0, ctl_base);
		mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_OFF, false);
		spin_lock_irqsave(&hist_info->hist_lock, flag);
		if (expect_sum && sum != expect_sum)
			ret = -ENODATA;
		hist_info->col_state = HIST_IDLE;
	}
	} else {
		spin_unlock_irqrestore(&hist_info->hist_lock, flag);
	}
hist_collect_exit:
	mutex_unlock(&hist_info->hist_mutex);
	return ret;