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

Commit ca91fa16 authored by Venkat Gopalakrishnan's avatar Venkat Gopalakrishnan
Browse files

scsi: ufs: gate ref_clk during aggressive clk gating



Gate ref clock along with other ufs clocks during aggressive
clock gating. The latencies involved in voting/devoting ref clk
is acceptable. This will allow faster XO shutdown instead of
gating off the clock during 3s idle runtime suspend.

Change-Id: I6e160f62f3600adf28997d5bb2868d1924208d42
Signed-off-by: default avatarVenkat Gopalakrishnan <venkatg@codeaurora.org>
parent 46692be6
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -1498,8 +1498,12 @@ static int ufs_qcom_setup_clocks(struct ufs_hba *hba, bool on,

		/* M-PHY RMMI interface clocks can be turned off */
		ufs_qcom_phy_disable_iface_clk(host->generic_phy);
		if (!ufs_qcom_is_link_active(hba)) {
			if (!is_gating_context)
		/*
		 * If auto hibern8 is supported then the link will already
		 * be in hibern8 state and the ref clock can be gated.
		 */
		if (ufshcd_is_auto_hibern8_supported(hba) ||
		    !ufs_qcom_is_link_active(hba)) {
			/* turn off UFS local PHY ref_clk */
			ufs_qcom_phy_disable_ref_clk(host->generic_phy);
			/* disable device ref_clk */
@@ -1956,13 +1960,6 @@ static int ufs_qcom_init(struct ufs_hba *hba)
	host->hba = hba;
	ufshcd_set_variant(hba, host);

	/*
	 * voting/devoting device ref_clk source is time consuming hence
	 * skip devoting it during aggressive clock gating. This clock
	 * will still be gated off during runtime suspend.
	 */
	hba->no_ref_clk_gating = true;

	err = ufs_qcom_ice_get_dev(host);
	if (err == -EPROBE_DEFER) {
		/*
+6 −1
Original line number Diff line number Diff line
@@ -1346,7 +1346,12 @@ static void ufshcd_gate_work(struct work_struct *work)
		ufshcd_set_link_hibern8(hba);
	}

	if (!ufshcd_is_link_active(hba) && !hba->no_ref_clk_gating)
	/*
	 * If auto hibern8 is supported then the link will already
	 * be in hibern8 state and the ref clock can be gated.
	 */
	if ((ufshcd_is_auto_hibern8_supported(hba) ||
	     !ufshcd_is_link_active(hba)) && !hba->no_ref_clk_gating)
		ufshcd_disable_clocks(hba, true);
	else
		/* If link is active, device ref_clk can't be switched off */