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+
1823static 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+
7595static 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};
92113module_platform_driver (ti_j721e_ufs_driver );
0 commit comments