Loading arch/arm64/boot/dts/qcom/sm8150.dtsi +2 −2 Original line number Diff line number Diff line Loading @@ -2161,10 +2161,10 @@ <&clock_gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>, <&clock_gcc GCC_UFS_PHY_RX_SYMBOL_1_CLK>; freq-table-hz = <50000000 200000000>, <37500000 300000000>, <0 0>, <0 0>, <37500000 150000000>, <37500000 300000000>, <75000000 300000000>, <0 0>, <0 0>, Loading drivers/scsi/ufs/ufs-qcom.c +32 −26 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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; Loading @@ -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; } Loading Loading
arch/arm64/boot/dts/qcom/sm8150.dtsi +2 −2 Original line number Diff line number Diff line Loading @@ -2161,10 +2161,10 @@ <&clock_gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>, <&clock_gcc GCC_UFS_PHY_RX_SYMBOL_1_CLK>; freq-table-hz = <50000000 200000000>, <37500000 300000000>, <0 0>, <0 0>, <37500000 150000000>, <37500000 300000000>, <75000000 300000000>, <0 0>, <0 0>, Loading
drivers/scsi/ufs/ufs-qcom.c +32 −26 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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; Loading @@ -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; } Loading