mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
scsi: ufs: host: mediatek: Correct clock scaling with PM QoS flow
Correct clock scaling with PM QoS during suspend and resume. Ensure PM QoS is released during suspend if scaling up and re-applied after resume. This prevents performance issues and maintains proper power management. Signed-off-by: Peter Wang <peter.wang@mediatek.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Acked-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Link: https://patch.msgid.link/20250924094527.2992256-2-peter.wang@mediatek.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
3a86608788
commit
7162536410
@@ -1076,7 +1076,7 @@ void ufshcd_pm_qos_exit(struct ufs_hba *hba)
|
||||
* @hba: per adapter instance
|
||||
* @on: If True, vote for perf PM QoS mode otherwise power save mode
|
||||
*/
|
||||
static void ufshcd_pm_qos_update(struct ufs_hba *hba, bool on)
|
||||
void ufshcd_pm_qos_update(struct ufs_hba *hba, bool on)
|
||||
{
|
||||
guard(mutex)(&hba->pm_qos_mutex);
|
||||
|
||||
@@ -1085,6 +1085,7 @@ static void ufshcd_pm_qos_update(struct ufs_hba *hba, bool on)
|
||||
|
||||
cpu_latency_qos_update_request(&hba->pm_qos_req, on ? 0 : PM_QOS_DEFAULT_VALUE);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufshcd_pm_qos_update);
|
||||
|
||||
/**
|
||||
* ufshcd_set_clk_freq - set UFS controller clock frequencies
|
||||
|
||||
@@ -1744,6 +1744,7 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
|
||||
{
|
||||
int err;
|
||||
struct arm_smccc_res res;
|
||||
struct ufs_mtk_host *host = ufshcd_get_variant(hba);
|
||||
|
||||
if (status == PRE_CHANGE) {
|
||||
if (ufshcd_is_auto_hibern8_supported(hba))
|
||||
@@ -1773,6 +1774,10 @@ static int ufs_mtk_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op,
|
||||
|
||||
ufs_mtk_sram_pwr_ctrl(false, res);
|
||||
|
||||
/* Release pm_qos if in scale-up mode during suspend */
|
||||
if (ufshcd_is_clkscaling_supported(hba) && (host->clk_scale_up))
|
||||
ufshcd_pm_qos_update(hba, false);
|
||||
|
||||
return 0;
|
||||
fail:
|
||||
/*
|
||||
@@ -1788,6 +1793,7 @@ static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
{
|
||||
int err;
|
||||
struct arm_smccc_res res;
|
||||
struct ufs_mtk_host *host = ufshcd_get_variant(hba);
|
||||
|
||||
if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL)
|
||||
ufs_mtk_dev_vreg_set_lpm(hba, false);
|
||||
@@ -1798,6 +1804,10 @@ static int ufs_mtk_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
if (err)
|
||||
goto fail;
|
||||
|
||||
/* Request pm_qos if in scale-up mode after resume */
|
||||
if (ufshcd_is_clkscaling_supported(hba) && (host->clk_scale_up))
|
||||
ufshcd_pm_qos_update(hba, true);
|
||||
|
||||
if (ufshcd_is_link_hibern8(hba)) {
|
||||
err = ufs_mtk_link_set_hpm(hba);
|
||||
if (err)
|
||||
|
||||
@@ -1487,5 +1487,6 @@ int ufshcd_write_ee_control(struct ufs_hba *hba);
|
||||
int ufshcd_update_ee_control(struct ufs_hba *hba, u16 *mask,
|
||||
const u16 *other_mask, u16 set, u16 clr);
|
||||
void ufshcd_force_error_recovery(struct ufs_hba *hba);
|
||||
void ufshcd_pm_qos_update(struct ufs_hba *hba, bool on);
|
||||
|
||||
#endif /* End of Header */
|
||||
|
||||
Reference in New Issue
Block a user