Skip to content

Commit 5e5976f

Browse files
ptr324martinkpetersen
authored andcommitted
scsi: ufs: host: mediatek: Support FDE (AES) clock scaling
Add support for scaling the FDE (AES) clock to achieve higher performance, particularly for HS-G5: 1. Parse DTS settings for FDE min/max mux. 2. Scale up the FDE clock when required for enhanced performance. These changes ensure that the FDE clock can be dynamically adjusted based on performance needs, leveraging DTS configurations. Signed-off-by: Peter Wang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Chun-Hung Wu <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 31a20e9 commit 5e5976f

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

drivers/ufs/host/ufs-mediatek.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -953,9 +953,23 @@ static void ufs_mtk_init_clocks(struct ufs_hba *hba)
953953
host->mclk.ufs_sel_min_clki = clki;
954954
clk_disable_unprepare(clki->clk);
955955
list_del(&clki->list);
956+
} else if (!strcmp(clki->name, "ufs_fde")) {
957+
host->mclk.ufs_fde_clki = clki;
958+
} else if (!strcmp(clki->name, "ufs_fde_max_src")) {
959+
host->mclk.ufs_fde_max_clki = clki;
960+
clk_disable_unprepare(clki->clk);
961+
list_del(&clki->list);
962+
} else if (!strcmp(clki->name, "ufs_fde_min_src")) {
963+
host->mclk.ufs_fde_min_clki = clki;
964+
clk_disable_unprepare(clki->clk);
965+
list_del(&clki->list);
956966
}
957967
}
958968

969+
list_for_each_entry(clki, head, list) {
970+
dev_info(hba->dev, "clk \"%s\" present", clki->name);
971+
}
972+
959973
if (!ufs_mtk_is_clk_scale_ready(hba)) {
960974
hba->caps &= ~UFSHCD_CAP_CLK_SCALING;
961975
dev_info(hba->dev,
@@ -1758,28 +1772,42 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up)
17581772
struct ufs_mtk_host *host = ufshcd_get_variant(hba);
17591773
struct ufs_mtk_clk *mclk = &host->mclk;
17601774
struct ufs_clk_info *clki = mclk->ufs_sel_clki;
1775+
struct ufs_clk_info *fde_clki = mclk->ufs_fde_clki;
17611776
struct regulator *reg;
17621777
int volt, ret = 0;
17631778
bool clk_bind_vcore = false;
1779+
bool clk_fde_scale = false;
17641780

17651781
if (!hba->clk_scaling.is_initialized)
17661782
return;
17671783

1768-
if (!clki)
1784+
if (!clki || !fde_clki)
17691785
return;
17701786

17711787
reg = host->mclk.reg_vcore;
17721788
volt = host->mclk.vcore_volt;
17731789
if (reg && volt != 0)
17741790
clk_bind_vcore = true;
17751791

1792+
if (mclk->ufs_fde_max_clki && mclk->ufs_fde_min_clki)
1793+
clk_fde_scale = true;
1794+
17761795
ret = clk_prepare_enable(clki->clk);
17771796
if (ret) {
17781797
dev_info(hba->dev,
17791798
"clk_prepare_enable() fail, ret: %d\n", ret);
17801799
return;
17811800
}
17821801

1802+
if (clk_fde_scale) {
1803+
ret = clk_prepare_enable(fde_clki->clk);
1804+
if (ret) {
1805+
dev_info(hba->dev,
1806+
"fde clk_prepare_enable() fail, ret: %d\n", ret);
1807+
return;
1808+
}
1809+
}
1810+
17831811
if (scale_up) {
17841812
if (clk_bind_vcore) {
17851813
ret = regulator_set_voltage(reg, volt, INT_MAX);
@@ -1795,7 +1823,28 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up)
17951823
dev_info(hba->dev, "Failed to set clk mux, ret = %d\n",
17961824
ret);
17971825
}
1826+
1827+
if (clk_fde_scale) {
1828+
ret = clk_set_parent(fde_clki->clk,
1829+
mclk->ufs_fde_max_clki->clk);
1830+
if (ret) {
1831+
dev_info(hba->dev,
1832+
"Failed to set fde clk mux, ret = %d\n",
1833+
ret);
1834+
}
1835+
}
17981836
} else {
1837+
if (clk_fde_scale) {
1838+
ret = clk_set_parent(fde_clki->clk,
1839+
mclk->ufs_fde_min_clki->clk);
1840+
if (ret) {
1841+
dev_info(hba->dev,
1842+
"Failed to set fde clk mux, ret = %d\n",
1843+
ret);
1844+
goto out;
1845+
}
1846+
}
1847+
17991848
ret = clk_set_parent(clki->clk, mclk->ufs_sel_min_clki->clk);
18001849
if (ret) {
18011850
dev_info(hba->dev, "Failed to set clk mux, ret = %d\n",
@@ -1814,6 +1863,9 @@ static void _ufs_mtk_clk_scale(struct ufs_hba *hba, bool scale_up)
18141863

18151864
out:
18161865
clk_disable_unprepare(clki->clk);
1866+
1867+
if (clk_fde_scale)
1868+
clk_disable_unprepare(fde_clki->clk);
18171869
}
18181870

18191871
/**

drivers/ufs/host/ufs-mediatek.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ struct ufs_mtk_clk {
149149
struct ufs_clk_info *ufs_sel_clki; /* Mux */
150150
struct ufs_clk_info *ufs_sel_max_clki; /* Max src */
151151
struct ufs_clk_info *ufs_sel_min_clki; /* Min src */
152+
struct ufs_clk_info *ufs_fde_clki; /* Mux */
153+
struct ufs_clk_info *ufs_fde_max_clki; /* Max src */
154+
struct ufs_clk_info *ufs_fde_min_clki; /* Min src */
152155
struct regulator *reg_vcore;
153156
int vcore_volt;
154157
};

0 commit comments

Comments
 (0)