* [PATCH v1 1/4] scsi: ufs: Cleanup ufshcd_suspend_clkscaling function
2020-12-15 9:39 [PATCH v1 0/4] Cleanup and refactor clock scaling Stanley Chu
@ 2020-12-15 9:39 ` Stanley Chu
2020-12-15 9:39 ` [PATCH v1 2/4] scsi: ufs: Cleanup ufshcd_add_lus function Stanley Chu
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Stanley Chu @ 2020-12-15 9:39 UTC (permalink / raw)
To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, jejb
Cc: beanhuo, asutoshd, cang, matthias.bgg, bvanassche,
linux-mediatek, linux-arm-kernel, linux-kernel, kuohong.wang,
peter.wang, chun-hung.wu, andy.teng, chaotian.jing, cc.chou,
jiajie.hao, alice.chao, Stanley Chu
Cancelling suspend_work and resume_work is only required while
suspending clk-scaling. Thus moving these two invokes into
ufshcd_suspend_clkscaling() function.
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
---
drivers/scsi/ufs/ufshcd.c | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 052479a56a6f..a91b73a1fc48 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1451,6 +1451,9 @@ static void ufshcd_suspend_clkscaling(struct ufs_hba *hba)
if (!ufshcd_is_clkscaling_supported(hba))
return;
+ cancel_work_sync(&hba->clk_scaling.suspend_work);
+ cancel_work_sync(&hba->clk_scaling.resume_work);
+
spin_lock_irqsave(hba->host->host_lock, flags);
if (!hba->clk_scaling.is_suspended) {
suspend = true;
@@ -1514,9 +1517,6 @@ static ssize_t ufshcd_clkscale_enable_store(struct device *dev,
pm_runtime_get_sync(hba->dev);
ufshcd_hold(hba, false);
- cancel_work_sync(&hba->clk_scaling.suspend_work);
- cancel_work_sync(&hba->clk_scaling.resume_work);
-
if (value) {
ufshcd_resume_clkscaling(hba);
} else {
@@ -5663,11 +5663,8 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
ufshcd_vops_resume(hba, UFS_RUNTIME_PM);
} else {
ufshcd_hold(hba, false);
- if (hba->clk_scaling.is_enabled) {
- cancel_work_sync(&hba->clk_scaling.suspend_work);
- cancel_work_sync(&hba->clk_scaling.resume_work);
+ if (hba->clk_scaling.is_enabled)
ufshcd_suspend_clkscaling(hba);
- }
}
down_write(&hba->clk_scaling_lock);
hba->clk_scaling.is_allowed = false;
@@ -8512,11 +8509,9 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
ufshcd_hold(hba, false);
hba->clk_gating.is_suspended = true;
- if (hba->clk_scaling.is_enabled) {
- cancel_work_sync(&hba->clk_scaling.suspend_work);
- cancel_work_sync(&hba->clk_scaling.resume_work);
+ if (hba->clk_scaling.is_enabled)
ufshcd_suspend_clkscaling(hba);
- }
+
down_write(&hba->clk_scaling_lock);
hba->clk_scaling.is_allowed = false;
up_write(&hba->clk_scaling_lock);
--
2.18.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v1 2/4] scsi: ufs: Cleanup ufshcd_add_lus function
2020-12-15 9:39 [PATCH v1 0/4] Cleanup and refactor clock scaling Stanley Chu
2020-12-15 9:39 ` [PATCH v1 1/4] scsi: ufs: Cleanup ufshcd_suspend_clkscaling function Stanley Chu
@ 2020-12-15 9:39 ` Stanley Chu
2020-12-15 9:39 ` [PATCH v1 3/4] scsi: ufs: Cleanup and refactor clk-scaling feature Stanley Chu
2020-12-15 9:39 ` [PATCH v1 4/4] scsi: ufs: Fix build warning by incorrect function description Stanley Chu
3 siblings, 0 replies; 5+ messages in thread
From: Stanley Chu @ 2020-12-15 9:39 UTC (permalink / raw)
To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, jejb
Cc: beanhuo, asutoshd, cang, matthias.bgg, bvanassche,
linux-mediatek, linux-arm-kernel, linux-kernel, kuohong.wang,
peter.wang, chun-hung.wu, andy.teng, chaotian.jing, cc.chou,
jiajie.hao, alice.chao, Stanley Chu
hba->devfreq is zero-initialized thus it is not required
to check its existence in ufshcd_add_lus() function which
is invoked during initialization only.
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
---
drivers/scsi/ufs/ufshcd.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index a91b73a1fc48..9cc16598136d 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -7636,15 +7636,13 @@ static int ufshcd_add_lus(struct ufs_hba *hba)
&hba->pwr_info,
sizeof(struct ufs_pa_layer_attr));
hba->clk_scaling.saved_pwr_info.is_valid = true;
- if (!hba->devfreq) {
- hba->clk_scaling.is_allowed = true;
- ret = ufshcd_devfreq_init(hba);
- if (ret)
- goto out;
+ hba->clk_scaling.is_allowed = true;
+ ret = ufshcd_devfreq_init(hba);
+ if (ret)
+ goto out;
- hba->clk_scaling.is_enabled = true;
- ufshcd_clkscaling_init_sysfs(hba);
- }
+ hba->clk_scaling.is_enabled = true;
+ ufshcd_clkscaling_init_sysfs(hba);
}
ufs_bsg_probe(hba);
--
2.18.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v1 3/4] scsi: ufs: Cleanup and refactor clk-scaling feature
2020-12-15 9:39 [PATCH v1 0/4] Cleanup and refactor clock scaling Stanley Chu
2020-12-15 9:39 ` [PATCH v1 1/4] scsi: ufs: Cleanup ufshcd_suspend_clkscaling function Stanley Chu
2020-12-15 9:39 ` [PATCH v1 2/4] scsi: ufs: Cleanup ufshcd_add_lus function Stanley Chu
@ 2020-12-15 9:39 ` Stanley Chu
2020-12-15 9:39 ` [PATCH v1 4/4] scsi: ufs: Fix build warning by incorrect function description Stanley Chu
3 siblings, 0 replies; 5+ messages in thread
From: Stanley Chu @ 2020-12-15 9:39 UTC (permalink / raw)
To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, jejb
Cc: beanhuo, asutoshd, cang, matthias.bgg, bvanassche,
linux-mediatek, linux-arm-kernel, linux-kernel, kuohong.wang,
peter.wang, chun-hung.wu, andy.teng, chaotian.jing, cc.chou,
jiajie.hao, alice.chao, Stanley Chu
Manipulate clock scaling related stuff only if the host capability
supports clock scaling feature to avoid redundant code execution.
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
---
drivers/scsi/ufs/ufshcd.c | 54 ++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 24 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 9cc16598136d..15e5877411b3 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1448,9 +1448,6 @@ static void ufshcd_suspend_clkscaling(struct ufs_hba *hba)
unsigned long flags;
bool suspend = false;
- if (!ufshcd_is_clkscaling_supported(hba))
- return;
-
cancel_work_sync(&hba->clk_scaling.suspend_work);
cancel_work_sync(&hba->clk_scaling.resume_work);
@@ -1470,9 +1467,6 @@ static void ufshcd_resume_clkscaling(struct ufs_hba *hba)
unsigned long flags;
bool resume = false;
- if (!ufshcd_is_clkscaling_supported(hba))
- return;
-
spin_lock_irqsave(hba->host->host_lock, flags);
if (hba->clk_scaling.is_suspended) {
resume = true;
@@ -5663,7 +5657,8 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)
ufshcd_vops_resume(hba, UFS_RUNTIME_PM);
} else {
ufshcd_hold(hba, false);
- if (hba->clk_scaling.is_enabled)
+ if (ufshcd_is_clkscaling_supported(hba) &&
+ hba->clk_scaling.is_enabled)
ufshcd_suspend_clkscaling(hba);
}
down_write(&hba->clk_scaling_lock);
@@ -5678,7 +5673,8 @@ static void ufshcd_err_handling_unprepare(struct ufs_hba *hba)
down_write(&hba->clk_scaling_lock);
hba->clk_scaling.is_allowed = true;
up_write(&hba->clk_scaling_lock);
- if (hba->clk_scaling.is_enabled)
+ if (ufshcd_is_clkscaling_supported(hba) &&
+ hba->clk_scaling.is_enabled)
ufshcd_resume_clkscaling(hba);
pm_runtime_put(hba->dev);
}
@@ -8466,6 +8462,25 @@ static void ufshcd_hba_vreg_set_hpm(struct ufs_hba *hba)
ufshcd_setup_hba_vreg(hba, true);
}
+static void ufshcd_clk_scaling_pm(struct ufs_hba *hba, bool suspend)
+{
+ if (suspend) {
+ if (hba->clk_scaling.is_enabled)
+ ufshcd_suspend_clkscaling(hba);
+
+ down_write(&hba->clk_scaling_lock);
+ hba->clk_scaling.is_allowed = false;
+ up_write(&hba->clk_scaling_lock);
+ } else {
+ down_write(&hba->clk_scaling_lock);
+ hba->clk_scaling.is_allowed = true;
+ up_write(&hba->clk_scaling_lock);
+
+ if (hba->clk_scaling.is_enabled)
+ ufshcd_resume_clkscaling(hba);
+ }
+}
+
/**
* ufshcd_suspend - helper function for suspend operations
* @hba: per adapter instance
@@ -8507,12 +8522,8 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
ufshcd_hold(hba, false);
hba->clk_gating.is_suspended = true;
- if (hba->clk_scaling.is_enabled)
- ufshcd_suspend_clkscaling(hba);
-
- down_write(&hba->clk_scaling_lock);
- hba->clk_scaling.is_allowed = false;
- up_write(&hba->clk_scaling_lock);
+ if (ufshcd_is_clkscaling_supported(hba))
+ ufshcd_clk_scaling_pm(hba, true);
if (req_dev_pwr_mode == UFS_ACTIVE_PWR_MODE &&
req_link_state == UIC_LINK_ACTIVE_STATE) {
@@ -8618,11 +8629,9 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
if (!ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE))
ufshcd_disable_auto_bkops(hba);
enable_gating:
- down_write(&hba->clk_scaling_lock);
- hba->clk_scaling.is_allowed = true;
- up_write(&hba->clk_scaling_lock);
- if (hba->clk_scaling.is_enabled)
- ufshcd_resume_clkscaling(hba);
+ if (ufshcd_is_clkscaling_supported(hba))
+ ufshcd_clk_scaling_pm(hba, false);
+
hba->clk_gating.is_suspended = false;
hba->dev_info.b_rpm_dev_flush_capable = false;
ufshcd_release(hba);
@@ -8719,11 +8728,8 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
hba->clk_gating.is_suspended = false;
- down_write(&hba->clk_scaling_lock);
- hba->clk_scaling.is_allowed = true;
- up_write(&hba->clk_scaling_lock);
- if (hba->clk_scaling.is_enabled)
- ufshcd_resume_clkscaling(hba);
+ if (ufshcd_is_clkscaling_supported(hba))
+ ufshcd_clk_scaling_pm(hba, false);
/* Enable Auto-Hibernate if configured */
ufshcd_auto_hibern8_enable(hba);
--
2.18.0
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH v1 4/4] scsi: ufs: Fix build warning by incorrect function description
2020-12-15 9:39 [PATCH v1 0/4] Cleanup and refactor clock scaling Stanley Chu
` (2 preceding siblings ...)
2020-12-15 9:39 ` [PATCH v1 3/4] scsi: ufs: Cleanup and refactor clk-scaling feature Stanley Chu
@ 2020-12-15 9:39 ` Stanley Chu
3 siblings, 0 replies; 5+ messages in thread
From: Stanley Chu @ 2020-12-15 9:39 UTC (permalink / raw)
To: linux-scsi, martin.petersen, avri.altman, alim.akhtar, jejb
Cc: beanhuo, asutoshd, cang, matthias.bgg, bvanassche,
linux-mediatek, linux-arm-kernel, linux-kernel, kuohong.wang,
peter.wang, chun-hung.wu, andy.teng, chaotian.jing, cc.chou,
jiajie.hao, alice.chao, Stanley Chu
Fix build warnings as below due to incorrect function description
of ufshcd_try_to_abort_task().
ufshcd.c:6651: warning: Function parameter or member 'hba' not described in 'ufshcd_try_to_abort_task'
ufshcd.c:6651: warning: Function parameter or member 'tag' not described in 'ufshcd_try_to_abort_task'
ufshcd.c:6651: warning: Excess function parameter 'cmd' description in 'ufshcd_try_to_abort_task'
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
---
drivers/scsi/ufs/ufshcd.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 15e5877411b3..dd1ca22264da 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6637,7 +6637,8 @@ static void ufshcd_set_req_abort_skip(struct ufs_hba *hba, unsigned long bitmap)
/**
* ufshcd_try_to_abort_task - abort a specific task
- * @cmd: SCSI command pointer
+ * @hba: per adapter instance
+ * @tag: position of the bit to be aborted
*
* Abort the pending command in device by sending UFS_ABORT_TASK task management
* command, and in host controller by clearing the door-bell register. There can
--
2.18.0
^ permalink raw reply [flat|nested] 5+ messages in thread