@@ -36,6 +36,7 @@ struct imx95_blk_ctl {
3636 void __iomem * base ;
3737 /* clock gate register */
3838 u32 clk_reg_restore ;
39+ const struct imx95_blk_ctl_dev_data * pdata ;
3940};
4041
4142struct imx95_blk_ctl_clk_dev_data {
@@ -349,7 +350,6 @@ static const struct imx95_blk_ctl_dev_data imx94_dispmix_csr_dev_data = {
349350static int imx95_bc_probe (struct platform_device * pdev )
350351{
351352 struct device * dev = & pdev -> dev ;
352- const struct imx95_blk_ctl_dev_data * bc_data ;
353353 struct imx95_blk_ctl * bc ;
354354 struct clk_hw_onecell_data * clk_hw_data ;
355355 struct clk_hw * * hws ;
@@ -379,25 +379,25 @@ static int imx95_bc_probe(struct platform_device *pdev)
379379 return ret ;
380380 }
381381
382- bc_data = of_device_get_match_data (dev );
383- if (!bc_data )
382+ bc -> pdata = of_device_get_match_data (dev );
383+ if (!bc -> pdata )
384384 return devm_of_platform_populate (dev );
385385
386- clk_hw_data = devm_kzalloc (dev , struct_size (clk_hw_data , hws , bc_data -> num_clks ),
386+ clk_hw_data = devm_kzalloc (dev , struct_size (clk_hw_data , hws , bc -> pdata -> num_clks ),
387387 GFP_KERNEL );
388388 if (!clk_hw_data )
389389 return - ENOMEM ;
390390
391- if (bc_data -> rpm_enabled ) {
391+ if (bc -> pdata -> rpm_enabled ) {
392392 devm_pm_runtime_enable (& pdev -> dev );
393393 pm_runtime_resume_and_get (& pdev -> dev );
394394 }
395395
396- clk_hw_data -> num = bc_data -> num_clks ;
396+ clk_hw_data -> num = bc -> pdata -> num_clks ;
397397 hws = clk_hw_data -> hws ;
398398
399- for (i = 0 ; i < bc_data -> num_clks ; i ++ ) {
400- const struct imx95_blk_ctl_clk_dev_data * data = & bc_data -> clk_dev_data [i ];
399+ for (i = 0 ; i < bc -> pdata -> num_clks ; i ++ ) {
400+ const struct imx95_blk_ctl_clk_dev_data * data = & bc -> pdata -> clk_dev_data [i ];
401401 void __iomem * reg = base + data -> reg ;
402402
403403 if (data -> type == CLK_MUX ) {
@@ -439,7 +439,7 @@ static int imx95_bc_probe(struct platform_device *pdev)
439439 return 0 ;
440440
441441cleanup :
442- for (i = 0 ; i < bc_data -> num_clks ; i ++ ) {
442+ for (i = 0 ; i < bc -> pdata -> num_clks ; i ++ ) {
443443 if (IS_ERR_OR_NULL (hws [i ]))
444444 continue ;
445445 clk_hw_unregister (hws [i ]);
@@ -453,55 +453,54 @@ static int imx95_bc_runtime_suspend(struct device *dev)
453453{
454454 struct imx95_blk_ctl * bc = dev_get_drvdata (dev );
455455
456+ bc -> clk_reg_restore = readl (bc -> base + bc -> pdata -> clk_reg_offset );
456457 clk_disable_unprepare (bc -> clk_apb );
458+
457459 return 0 ;
458460}
459461
460462static int imx95_bc_runtime_resume (struct device * dev )
461463{
462464 struct imx95_blk_ctl * bc = dev_get_drvdata (dev );
465+ int ret ;
463466
464- return clk_prepare_enable (bc -> clk_apb );
467+ ret = clk_prepare_enable (bc -> clk_apb );
468+ if (ret )
469+ return ret ;
470+
471+ writel (bc -> clk_reg_restore , bc -> base + bc -> pdata -> clk_reg_offset );
472+
473+ return 0 ;
465474}
466475#endif
467476
468477#ifdef CONFIG_PM_SLEEP
469478static int imx95_bc_suspend (struct device * dev )
470479{
471480 struct imx95_blk_ctl * bc = dev_get_drvdata (dev );
472- const struct imx95_blk_ctl_dev_data * bc_data ;
473- int ret ;
474481
475- bc_data = of_device_get_match_data (dev );
476- if (!bc_data )
482+ if (pm_runtime_suspended (dev ))
477483 return 0 ;
478484
479- if (bc_data -> rpm_enabled ) {
480- ret = pm_runtime_get_sync (bc -> dev );
481- if (ret < 0 ) {
482- pm_runtime_put_noidle (bc -> dev );
483- return ret ;
484- }
485- }
486-
487- bc -> clk_reg_restore = readl (bc -> base + bc_data -> clk_reg_offset );
485+ bc -> clk_reg_restore = readl (bc -> base + bc -> pdata -> clk_reg_offset );
486+ clk_disable_unprepare (bc -> clk_apb );
488487
489488 return 0 ;
490489}
491490
492491static int imx95_bc_resume (struct device * dev )
493492{
494493 struct imx95_blk_ctl * bc = dev_get_drvdata (dev );
495- const struct imx95_blk_ctl_dev_data * bc_data ;
494+ int ret ;
496495
497- bc_data = of_device_get_match_data (dev );
498- if (!bc_data )
496+ if (pm_runtime_suspended (dev ))
499497 return 0 ;
500498
501- writel (bc -> clk_reg_restore , bc -> base + bc_data -> clk_reg_offset );
499+ ret = clk_prepare_enable (bc -> clk_apb );
500+ if (ret )
501+ return ret ;
502502
503- if (bc_data -> rpm_enabled )
504- pm_runtime_put (bc -> dev );
503+ writel (bc -> clk_reg_restore , bc -> base + bc -> pdata -> clk_reg_offset );
505504
506505 return 0 ;
507506}
0 commit comments