Skip to content

Commit 02880c0

Browse files
thom24martinkpetersen
authored andcommitted
scsi: ufs: ti-j721e: Add suspend-resume support
Restore the ctrl register to resume the TI UFS wrapper. Signed-off-by: Thomas Richard (TI.com) <thomas.richard@bootlin.com> Link: https://patch.msgid.link/20251106-scsi-ufs-ti-j721e-suspend-resume-support-v1-1-6f395f51219e@bootlin.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 57565f9 commit 02880c0

1 file changed

Lines changed: 29 additions & 8 deletions

File tree

drivers/ufs/host/ti-j721e-ufs.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,26 @@
1515
#define TI_UFS_SS_RST_N_PCS BIT(0)
1616
#define TI_UFS_SS_CLK_26MHZ BIT(4)
1717

18+
struct ti_j721e_ufs {
19+
void __iomem *regbase;
20+
u32 reg;
21+
};
22+
1823
static int ti_j721e_ufs_probe(struct platform_device *pdev)
1924
{
2025
struct device *dev = &pdev->dev;
26+
struct ti_j721e_ufs *ufs;
2127
unsigned long clk_rate;
22-
void __iomem *regbase;
2328
struct clk *clk;
24-
u32 reg = 0;
2529
int ret;
2630

27-
regbase = devm_platform_ioremap_resource(pdev, 0);
28-
if (IS_ERR(regbase))
29-
return PTR_ERR(regbase);
31+
ufs = devm_kzalloc(dev, sizeof(*ufs), GFP_KERNEL);
32+
if (!ufs)
33+
return -ENOMEM;
34+
35+
ufs->regbase = devm_platform_ioremap_resource(pdev, 0);
36+
if (IS_ERR(ufs->regbase))
37+
return PTR_ERR(ufs->regbase);
3038

3139
pm_runtime_enable(dev);
3240
ret = pm_runtime_resume_and_get(dev);
@@ -42,12 +50,14 @@ static int ti_j721e_ufs_probe(struct platform_device *pdev)
4250
}
4351
clk_rate = clk_get_rate(clk);
4452
if (clk_rate == 26000000)
45-
reg |= TI_UFS_SS_CLK_26MHZ;
53+
ufs->reg |= TI_UFS_SS_CLK_26MHZ;
4654
devm_clk_put(dev, clk);
4755

4856
/* Take UFS slave device out of reset */
49-
reg |= TI_UFS_SS_RST_N_PCS;
50-
writel(reg, regbase + TI_UFS_SS_CTRL);
57+
ufs->reg |= TI_UFS_SS_RST_N_PCS;
58+
writel(ufs->reg, ufs->regbase + TI_UFS_SS_CTRL);
59+
60+
dev_set_drvdata(dev, ufs);
5161

5262
ret = of_platform_populate(pdev->dev.of_node, NULL, NULL,
5363
dev);
@@ -72,6 +82,16 @@ static void ti_j721e_ufs_remove(struct platform_device *pdev)
7282
pm_runtime_disable(&pdev->dev);
7383
}
7484

85+
static int ti_j721e_ufs_resume(struct device *dev)
86+
{
87+
struct ti_j721e_ufs *ufs = dev_get_drvdata(dev);
88+
89+
writel(ufs->reg, ufs->regbase + TI_UFS_SS_CTRL);
90+
return 0;
91+
}
92+
93+
static DEFINE_SIMPLE_DEV_PM_OPS(ti_j721e_ufs_pm_ops, NULL, ti_j721e_ufs_resume);
94+
7595
static const struct of_device_id ti_j721e_ufs_of_match[] = {
7696
{
7797
.compatible = "ti,j721e-ufs",
@@ -87,6 +107,7 @@ static struct platform_driver ti_j721e_ufs_driver = {
87107
.driver = {
88108
.name = "ti-j721e-ufs",
89109
.of_match_table = ti_j721e_ufs_of_match,
110+
.pm = pm_sleep_ptr(&ti_j721e_ufs_pm_ops),
90111
},
91112
};
92113
module_platform_driver(ti_j721e_ufs_driver);

0 commit comments

Comments
 (0)