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

Commit 133e62e2 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: wait for kickoff before executing mode switch changes"

parents 24b711db 7f87b6d3
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -1377,6 +1377,38 @@ static inline struct mdss_mdp_misr_map *mdss_misr_get_map(u32 block_id,
			}
		} else {
			if (block_id <= DISPLAY_MISR_HDMI) {
				/*
				 * In Dual LM single display configuration,
				 * the interface number (i.e. block_id)
				 * might not be the one given from ISR.
				 * We should always check with the actual
				 * intf_num from ctl.
				 */
				struct msm_fb_data_type *mfd = NULL;

				/*
				 * ISR pass in NULL ctl, so we need to get it
				 * from the mdata.
				 */
				if (!ctl && mdata->mixer_intf)
					ctl = mdata->mixer_intf->ctl;
				if (ctl)
					mfd = ctl->mfd;
				if (mfd && is_dual_lm_single_display(mfd)) {
					switch (ctl->intf_num) {
					case MDSS_MDP_INTF1:
						block_id = DISPLAY_MISR_DSI0;
						break;
					case MDSS_MDP_INTF2:
						block_id = DISPLAY_MISR_DSI1;
						break;
					default:
						pr_err("Unmatch INTF for Dual LM single display configuration, INTF:%d\n",
								ctl->intf_num);
						return NULL;
					}
				}

				intf_base = (char *)mdss_mdp_get_intf_base_addr(
						mdata, block_id);

@@ -1390,11 +1422,15 @@ static inline struct mdss_mdp_misr_map *mdss_misr_get_map(u32 block_id,

					/*
					 * extra offset required for
					 * cmd misr in 8996
					 * cmd misr in 8996 and mdss3.x
					 */
					if (IS_MDSS_MAJOR_MINOR_SAME(
						  mdata->mdp_rev,
						  MDSS_MDP_HW_REV_107)) {
						  MDSS_MDP_HW_REV_107) ||
						(mdata->mdp_rev ==
							MDSS_MDP_HW_REV_300) ||
						(mdata->mdp_rev ==
							MDSS_MDP_HW_REV_301)) {
						ctrl_reg += 0x8;
						value_reg += 0x8;
					}
+3 −0
Original line number Diff line number Diff line
@@ -4752,6 +4752,9 @@ static int mdss_fb_mode_switch(struct msm_fb_data_type *mfd, u32 mode)
	if (!mfd || !mfd->panel_info)
		return -EINVAL;

	/* make sure that we are idle while switching */
	mdss_fb_wait_for_kickoff(mfd);

	pinfo = mfd->panel_info;
	if (pinfo->mipi.dms_mode == DYNAMIC_MODE_SWITCH_SUSPEND_RESUME) {
		ret = mdss_fb_blanking_mode_switch(mfd, mode);
+35 −0
Original line number Diff line number Diff line
@@ -1455,6 +1455,35 @@ static int mdss_mdp_idle_pc_restore(void)
	return rc;
}

/**
 * mdss_mdp_retention_init() - initialize retention setting
 * @mdata: pointer to the global mdss data structure.
 */
static int mdss_mdp_retention_init(struct mdss_data_type *mdata)
{
	struct clk *mdss_axi_clk = mdss_mdp_get_clk(MDSS_CLK_AXI);
	int rc;

	if (!mdss_axi_clk) {
		pr_err("failed to get AXI clock\n");
		return -EINVAL;
	}

	rc = clk_set_flags(mdss_axi_clk, CLKFLAG_NORETAIN_MEM);
	if (rc) {
		pr_err("failed to set AXI no memory retention %d\n", rc);
		return rc;
	}

	rc = clk_set_flags(mdss_axi_clk, CLKFLAG_NORETAIN_PERIPH);
	if (rc) {
		pr_err("failed to set AXI no periphery retention %d\n", rc);
		return rc;
	}

	return rc;
}

/**
 * mdss_bus_bandwidth_ctrl() -- place bus bandwidth request
 * @enable:	value of enable or disable
@@ -2695,6 +2724,12 @@ static int mdss_mdp_probe(struct platform_device *pdev)
		goto probe_done;
	}

	rc = mdss_mdp_retention_init(mdata);
	if (rc) {
		pr_err("unable to initialize mdss mdp retention\n");
		goto probe_done;
	}

	pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT_MS);
	if (mdata->idle_pc_enabled)
		pm_runtime_use_autosuspend(&pdev->dev);
+8 −5
Original line number Diff line number Diff line
@@ -571,11 +571,12 @@ static u32 __calc_qseed3_mdp_clk_rate(struct mdss_mdp_pipe *pipe,
	u32 fps, u32 v_total)
{
	u32 active_line_cycle, backfill_cycle, total_cycle;
	u32 ver_dwnscale;
	u64 ver_dwnscale;
	u32 active_line;
	u32 backfill_line;

	ver_dwnscale = (src_h << PHASE_STEP_SHIFT) / dst.h;
	ver_dwnscale = src_h << PHASE_STEP_SHIFT;
	do_div(ver_dwnscale, dst.h);

	if (ver_dwnscale > (MDSS_MDP_QSEED3_VER_DOWNSCALE_LIM
			<< PHASE_STEP_SHIFT)) {
@@ -599,7 +600,7 @@ static u32 __calc_qseed3_mdp_clk_rate(struct mdss_mdp_pipe *pipe,
	total_cycle = active_line_cycle + backfill_cycle;

	pr_debug("line: active=%d backfill=%d vds=%d\n",
		active_line, backfill_line, ver_dwnscale);
		active_line, backfill_line, (u32)ver_dwnscale);
	pr_debug("cycle: total=%d active=%d backfill=%d\n",
		total_cycle, active_line_cycle, backfill_cycle);

@@ -4340,9 +4341,11 @@ void mdss_mdp_check_ctl_reset_status(struct mdss_mdp_ctl *ctl)
		return;

	pr_debug("hw ctl reset is set for ctl:%d\n", ctl->num);
	status = mdss_mdp_poll_ctl_reset_status(ctl, 5);
	/* poll for at least ~1 frame */
	status = mdss_mdp_poll_ctl_reset_status(ctl, 320);
	if (status) {
		pr_err("hw recovery is not complete for ctl:%d\n", ctl->num);
		pr_err("hw recovery is not complete for ctl:%d status:0x%x\n",
			ctl->num, status);
		MDSS_XLOG_TOUT_HANDLER("mdp", "vbif", "vbif_nrt", "dbg_bus",
			"vbif_dbg_bus", "panic");
	}