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

Commit 829d2ebf authored by Bao D. Nguyen's avatar Bao D. Nguyen
Browse files

scsi: ufs-qcom: update vendor specific unipro attribute per clk freq



Vendor specific unipro DME_VS_CORE_CLK_CLRL attribute setting depends
on the core_clk_unipro frequency. Instead of assuming the certain clock
frequency for this clock, we should use the clock frequency information
received from device tree.

Change-Id: Id551e6765f1cf51fac0aca809708617361118e2d
Signed-off-by: default avatarBao D. Nguyen <nguyenb@codeaurora.org>
parent 65939c37
Loading
Loading
Loading
Loading
+32 −26
Original line number Diff line number Diff line
@@ -589,6 +589,36 @@ static int ufs_qcom_cfg_timers(struct ufs_hba *hba, u32 gear,
				      update_link_startup_timer, false);
}

static int ufs_qcom_set_dme_vs_core_clk_ctrl_max_freq_mode(struct ufs_hba *hba)
{
	struct ufs_clk_info *clki;
	struct list_head *head = &hba->clk_list_head;
	u32 max_freq = 0;
	int err = 0;

	list_for_each_entry(clki, head, list) {
		if (!IS_ERR_OR_NULL(clki->clk) &&
			(!strcmp(clki->name, "core_clk_unipro"))) {
			max_freq = clki->max_freq;
			break;
		}
	}

	switch (max_freq) {
	case 300000000:
		err = ufs_qcom_set_dme_vs_core_clk_ctrl_clear_div(hba, 300, 12);
		break;
	case 150000000:
		err = ufs_qcom_set_dme_vs_core_clk_ctrl_clear_div(hba, 150, 6);
		break;
	default:
		err = -EINVAL;
		break;
	}

	return err;
}

static int ufs_qcom_link_startup_pre_change(struct ufs_hba *hba)
{
	struct ufs_qcom_host *host = ufshcd_get_variant(hba);
@@ -609,10 +639,7 @@ static int ufs_qcom_link_startup_pre_change(struct ufs_hba *hba)
		goto out;

	if (ufs_qcom_cap_qunipro(host)) {
		/*
		 * set unipro core clock cycles to 150 & clear clock divider
		 */
		err = ufs_qcom_set_dme_vs_core_clk_ctrl_clear_div(hba, 150, 6);
		err = ufs_qcom_set_dme_vs_core_clk_ctrl_max_freq_mode(hba);
		if (err)
			goto out;
	}
@@ -2325,9 +2352,6 @@ static int ufs_qcom_clk_scale_up_pre_change(struct ufs_hba *hba)
	struct ufs_qcom_host *host = ufshcd_get_variant(hba);
	struct ufs_pa_layer_attr *attr = &host->dev_req_params;
	int err = 0;
	struct ufs_clk_info *clki;
	struct list_head *head = &hba->clk_list_head;
	u32 max_freq = 0;

	if (!ufs_qcom_cap_qunipro(host))
		goto out;
@@ -2336,25 +2360,7 @@ static int ufs_qcom_clk_scale_up_pre_change(struct ufs_hba *hba)
		__ufs_qcom_cfg_timers(hba, attr->gear_rx, attr->pwr_rx,
				      attr->hs_rate, false, true);

	list_for_each_entry(clki, head, list) {
		if (!IS_ERR_OR_NULL(clki->clk) &&
			(!strcmp(clki->name, "core_clk_unipro"))) {
			max_freq = clki->max_freq;
			break;
		}
	}

	switch (max_freq) {
	case 300000000:
		err = ufs_qcom_set_dme_vs_core_clk_ctrl_clear_div(hba, 300, 12);
		break;
	case 150000000:
		err = ufs_qcom_set_dme_vs_core_clk_ctrl_clear_div(hba, 150, 6);
		break;
	default:
		err = -EINVAL;
		break;
	}
	err = ufs_qcom_set_dme_vs_core_clk_ctrl_max_freq_mode(hba);
out:
	return err;
}