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

Commit 06f84b19 authored by Ping Li's avatar Ping Li Committed by Gerrit - the friendly Code Review server
Browse files

msm: mdss: Add support to retain AD RAMs



Modify the MDP_CBCR bits to retain the AD RAMs through idle power
collapse(IPC).

Bits setting when device enters IPC:
  - MEM_CORE_ON: 1
  - MEM_PERIPH_ON: 0
  - MEM_PERIPH_OFF: 1
Bits setting when device exits the IPC:
  - MEM_CORE_ON: 1
  - MEM_PERIPH_ON: 1
  - MEM_PERIPH_OFF: 0

Change-Id: I10749312d905eb4629e94e396b1604667738e84f
Signed-off-by: default avatarPing Li <pingli@codeaurora.org>
parent 25a2528e
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -847,6 +847,36 @@ int mdss_iommu_ctrl(int enable)
		return mdata->iommu_ref_cnt;
}

static void mdss_mdp_memory_retention_enter(void)
{
	struct clk *mdss_mdp_clk = NULL;
	struct clk *mdp_vote_clk = mdss_mdp_get_clk(MDSS_CLK_MDP_CORE);

	if (mdp_vote_clk) {
		mdss_mdp_clk = clk_get_parent(mdp_vote_clk);
		if (mdss_mdp_clk) {
			clk_set_flags(mdss_mdp_clk, CLKFLAG_RETAIN_MEM);
			clk_set_flags(mdss_mdp_clk, CLKFLAG_PERIPH_OFF_SET);
			clk_set_flags(mdss_mdp_clk, CLKFLAG_NORETAIN_PERIPH);
		}
	}
}

static void mdss_mdp_memory_retention_exit(void)
{
	struct clk *mdss_mdp_clk = NULL;
	struct clk *mdp_vote_clk = mdss_mdp_get_clk(MDSS_CLK_MDP_CORE);

	if (mdp_vote_clk) {
		mdss_mdp_clk = clk_get_parent(mdp_vote_clk);
		if (mdss_mdp_clk) {
			clk_set_flags(mdss_mdp_clk, CLKFLAG_RETAIN_MEM);
			clk_set_flags(mdss_mdp_clk, CLKFLAG_RETAIN_PERIPH);
			clk_set_flags(mdss_mdp_clk, CLKFLAG_PERIPH_OFF_CLEAR);
		}
	}
}

/**
 * mdss_mdp_idle_pc_restore() - Restore MDSS settings when exiting idle pc
 *
@@ -874,6 +904,14 @@ static int mdss_mdp_idle_pc_restore(void)
	}
	mdss_hw_init(mdata);
	mdss_iommu_ctrl(0);

	/**
	 * sleep 10 microseconds to make sure AD auto-reinitialization
	 * is done
	 */
	udelay(10);
	mdss_mdp_memory_retention_exit();

	mdss_mdp_ctl_restore(true);
	mdata->idle_pc = false;

@@ -4050,6 +4088,7 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on)
				mdata->idle_pc = true;
				pr_debug("idle pc. active overlays=%d\n",
					active_cnt);
				mdss_mdp_memory_retention_enter();
			} else {
				mdss_mdp_cx_ctrl(mdata, false);
				mdss_mdp_batfet_ctrl(mdata, false);