FROMLIST: ufs: allow host driver to disable wb toggling during clock scaling

Mediatek ufs do not want to toggle write booster during clock scaling.
This patch allow host driver to disable wb toggling during clock scaling.

So, introduce a flag UFSHCD_CAP_WB_WITH_CLK_SCALING to decouple WB
and clock scaling. UFSHCD_CAP_WB_WITH_CLK_SCALING only valid when
UFSHCD_CAP_CLK_SCALING is set. Just like UFSHCD_CAP_HIBERN8_WITH_CLK_GATING
is valid only when UFSHCD_CAP_CLK_GATING set.

Set UFSHCD_CAP_WB_WITH_CLK_SCALING for qcom to compatible legacy design in
the same time.

Bug: 243114290
Link: https://lore.kernel.org/linux-scsi/20220804025422.18803-1-peter.wang@mediatek.com/
[Peter: Resolved minor conflict in drivers/scsi/ufs/ufs-qcom.c,
drivers/scsi/ufs/ufs-sysfs.c, drivers/scsi/ufs/ufshcd.h, drivers/scsi/ufs/ufshcd.c ]
Change-Id: Id58fd6dcbeb63e7567922ddec7e70cd2787bbb6e
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
This commit is contained in:
Peter Wang
2022-08-19 20:00:58 +08:00
committed by Treehugger Robot
parent 8d76ae003b
commit f42e2933f0
4 changed files with 19 additions and 5 deletions

View File

@@ -868,7 +868,7 @@ static void ufs_qcom_set_caps(struct ufs_hba *hba)
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
hba->caps |= UFSHCD_CAP_CLK_GATING | UFSHCD_CAP_HIBERN8_WITH_CLK_GATING;
hba->caps |= UFSHCD_CAP_CLK_SCALING;
hba->caps |= UFSHCD_CAP_CLK_SCALING | UFSHCD_CAP_WB_WITH_CLK_SCALING;
hba->caps |= UFSHCD_CAP_AUTO_BKOPS_SUSPEND;
hba->caps |= UFSHCD_CAP_WB_EN;
hba->caps |= UFSHCD_CAP_CRYPTO;

View File

@@ -226,7 +226,8 @@ static ssize_t wb_on_store(struct device *dev, struct device_attribute *attr,
unsigned int wb_enable;
ssize_t res;
if (!ufshcd_is_wb_allowed(hba) || ufshcd_is_clkscaling_supported(hba)) {
if (!ufshcd_is_wb_allowed(hba) || (ufshcd_is_clkscaling_supported(hba)
&& ufshcd_enable_wb_if_scaling_up(hba))) {
/*
* If the platform supports UFSHCD_CAP_CLK_SCALING, turn WB
* on/off will be done while clock scaling up/down.

View File

@@ -1270,9 +1270,11 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up)
}
/* Enable Write Booster if we have scaled up else disable it */
downgrade_write(&hba->clk_scaling_lock);
is_writelock = false;
ufshcd_wb_toggle(hba, scale_up);
if (ufshcd_enable_wb_if_scaling_up(hba)) {
downgrade_write(&hba->clk_scaling_lock);
is_writelock = false;
ufshcd_wb_toggle(hba, scale_up);
}
out_unprepare:
ufshcd_clock_scaling_unprepare(hba, is_writelock);

View File

@@ -709,6 +709,12 @@ enum ufshcd_caps {
* notification if it is supported by the UFS device.
*/
UFSHCD_CAP_TEMP_NOTIF = 1 << 11,
/*
* Enable WriteBooster when scaling up the clock and disable
* WriteBooster when scaling the clock down.
*/
UFSHCD_CAP_WB_WITH_CLK_SCALING = 1 << 12,
};
struct ufs_hba_variant_params {
@@ -1046,6 +1052,11 @@ static inline bool ufshcd_is_user_access_allowed(struct ufs_hba *hba)
return !hba->shutting_down;
}
static inline bool ufshcd_enable_wb_if_scaling_up(struct ufs_hba *hba)
{
return hba->caps & UFSHCD_CAP_WB_WITH_CLK_SCALING;
}
#define ufshcd_writel(hba, val, reg) \
writel((val), (hba)->mmio_base + (reg))
#define ufshcd_readl(hba, reg) \