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

Commit d35ac49e 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: Enable dynamic clock gating for MDSS AHB clock"

parents 1e27910b 801f0b02
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@
#define MAX_MIXER_HEIGHT	2400
#define MAX_IMG_WIDTH		0x3FFF
#define MAX_IMG_HEIGHT		0x3FFF
#define AHB_CLK_OFFSET		0x3B4
#define MAX_DST_W		MAX_MIXER_WIDTH
#define MAX_DST_H		MAX_MIXER_HEIGHT
#define MAX_PLANES		4
@@ -152,6 +153,7 @@ struct mdss_mdp_ctl {

	u32 opmode;
	u32 flush_bits;
	u32 flush_reg_data;

	bool is_video_mode;
	u32 play_cnt;
+15 −1
Original line number Diff line number Diff line
@@ -1782,6 +1782,8 @@ int mdss_mdp_display_wakeup_time(struct mdss_mdp_ctl *ctl,
int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl)
{
	int ret;
	u32 reg_data, flush_data;
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();

	ret = mutex_lock_interruptible(&ctl->lock);
	if (ret)
@@ -1800,8 +1802,19 @@ int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl)
		ctl->perf_changed = 0;
	}

	mutex_unlock(&ctl->lock);
	if (mdata->mdp_rev == MDSS_MDP_HW_REV_103) {
		reg_data = mdss_mdp_ctl_read(ctl, MDSS_MDP_REG_CTL_FLUSH);
		flush_data = readl_relaxed(mdata->mdp_base + AHB_CLK_OFFSET);
		if ((reg_data != ctl->flush_reg_data) &&
						 (flush_data & BIT(28))) {
			flush_data &= ~(BIT(28));
			writel_relaxed(reg_data,
					 mdata->mdp_base + AHB_CLK_OFFSET);
			ctl->flush_reg_data = 0;
		}
	}

	mutex_unlock(&ctl->lock);
	return ret;
}

@@ -1903,6 +1916,7 @@ int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg)
		sctl->flush_bits = 0;
	}
	wmb();
	ctl->flush_reg_data = ctl->flush_bits;
	ctl->flush_bits = 0;

	if (ctl->display_fnc)
+17 −1
Original line number Diff line number Diff line
@@ -694,8 +694,10 @@ static int mdss_mdp_image_setup(struct mdss_mdp_pipe *pipe,
{
	u32 img_size, src_size, src_xy, dst_size, dst_xy, ystride0, ystride1;
	u32 width, height;
	u32 decimation;
	u32 decimation, reg_data;
	u32 tmp_src_xy, tmp_src_size;
	int ret = 0;
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();
	struct mdss_mdp_img_rect sci, dst, src;

	pr_debug("pnum=%d wh=%dx%d src={%d,%d,%d,%d} dst={%d,%d,%d,%d}\n",
@@ -766,6 +768,20 @@ static int mdss_mdp_image_setup(struct mdss_mdp_pipe *pipe,
	}
	img_size = (height << 16) | width;

	if (mdata->mdp_rev == MDSS_MDP_HW_REV_103 && pipe->bwc_mode) {
		/* check source dimensions change */
		tmp_src_size = mdss_mdp_pipe_read(pipe,
						 MDSS_MDP_REG_SSPP_SRC_SIZE);
		tmp_src_xy = mdss_mdp_pipe_read(pipe,
						 MDSS_MDP_REG_SSPP_SRC_XY);
		if (src_xy != tmp_src_xy || tmp_src_size != src_size) {
			reg_data = readl_relaxed(mdata->mdp_base +
							 AHB_CLK_OFFSET);
			reg_data |= BIT(28);
			writel_relaxed(reg_data,
					 mdata->mdp_base + AHB_CLK_OFFSET);
		}
	}
	mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC_IMG_SIZE, img_size);
	mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC_SIZE, src_size);
	mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_SRC_XY, src_xy);