@@ -78,17 +78,13 @@ struct mtk_smi_larb { /* larb: local arbiter */
78
78
u32 * mmu ;
79
79
};
80
80
81
- static int mtk_smi_enable (const struct mtk_smi * smi )
81
+ static int mtk_smi_clk_enable (const struct mtk_smi * smi )
82
82
{
83
83
int ret ;
84
84
85
- ret = pm_runtime_get_sync (smi -> dev );
86
- if (ret < 0 )
87
- return ret ;
88
-
89
85
ret = clk_prepare_enable (smi -> clk_apb );
90
86
if (ret )
91
- goto err_put_pm ;
87
+ return ret ;
92
88
93
89
ret = clk_prepare_enable (smi -> clk_smi );
94
90
if (ret )
@@ -110,59 +106,28 @@ static int mtk_smi_enable(const struct mtk_smi *smi)
110
106
clk_disable_unprepare (smi -> clk_smi );
111
107
err_disable_apb :
112
108
clk_disable_unprepare (smi -> clk_apb );
113
- err_put_pm :
114
- pm_runtime_put_sync (smi -> dev );
115
109
return ret ;
116
110
}
117
111
118
- static void mtk_smi_disable (const struct mtk_smi * smi )
112
+ static void mtk_smi_clk_disable (const struct mtk_smi * smi )
119
113
{
120
114
clk_disable_unprepare (smi -> clk_gals1 );
121
115
clk_disable_unprepare (smi -> clk_gals0 );
122
116
clk_disable_unprepare (smi -> clk_smi );
123
117
clk_disable_unprepare (smi -> clk_apb );
124
- pm_runtime_put_sync (smi -> dev );
125
118
}
126
119
127
120
int mtk_smi_larb_get (struct device * larbdev )
128
121
{
129
- struct mtk_smi_larb * larb = dev_get_drvdata (larbdev );
130
- const struct mtk_smi_larb_gen * larb_gen = larb -> larb_gen ;
131
- struct mtk_smi * common = dev_get_drvdata (larb -> smi_common_dev );
132
- int ret ;
122
+ int ret = pm_runtime_get_sync (larbdev );
133
123
134
- /* Enable the smi-common's power and clocks */
135
- ret = mtk_smi_enable (common );
136
- if (ret )
137
- return ret ;
138
-
139
- /* Enable the larb's power and clocks */
140
- ret = mtk_smi_enable (& larb -> smi );
141
- if (ret ) {
142
- mtk_smi_disable (common );
143
- return ret ;
144
- }
145
-
146
- /* Configure the iommu info for this larb */
147
- larb_gen -> config_port (larbdev );
148
-
149
- return 0 ;
124
+ return (ret < 0 ) ? ret : 0 ;
150
125
}
151
126
EXPORT_SYMBOL_GPL (mtk_smi_larb_get );
152
127
153
128
void mtk_smi_larb_put (struct device * larbdev )
154
129
{
155
- struct mtk_smi_larb * larb = dev_get_drvdata (larbdev );
156
- struct mtk_smi * common = dev_get_drvdata (larb -> smi_common_dev );
157
-
158
- /*
159
- * Don't de-configure the iommu info for this larb since there may be
160
- * several modules in this larb.
161
- * The iommu info will be reset after power off.
162
- */
163
-
164
- mtk_smi_disable (& larb -> smi );
165
- mtk_smi_disable (common );
130
+ pm_runtime_put_sync (larbdev );
166
131
}
167
132
EXPORT_SYMBOL_GPL (mtk_smi_larb_put );
168
133
@@ -377,12 +342,52 @@ static int mtk_smi_larb_remove(struct platform_device *pdev)
377
342
return 0 ;
378
343
}
379
344
345
+ static int __maybe_unused mtk_smi_larb_resume (struct device * dev )
346
+ {
347
+ struct mtk_smi_larb * larb = dev_get_drvdata (dev );
348
+ const struct mtk_smi_larb_gen * larb_gen = larb -> larb_gen ;
349
+ int ret ;
350
+
351
+ /* Power on smi-common. */
352
+ ret = pm_runtime_get_sync (larb -> smi_common_dev );
353
+ if (ret < 0 ) {
354
+ dev_err (dev , "Failed to pm get for smi-common(%d).\n" , ret );
355
+ return ret ;
356
+ }
357
+
358
+ ret = mtk_smi_clk_enable (& larb -> smi );
359
+ if (ret < 0 ) {
360
+ dev_err (dev , "Failed to enable clock(%d).\n" , ret );
361
+ pm_runtime_put_sync (larb -> smi_common_dev );
362
+ return ret ;
363
+ }
364
+
365
+ /* Configure the basic setting for this larb */
366
+ larb_gen -> config_port (dev );
367
+
368
+ return 0 ;
369
+ }
370
+
371
+ static int __maybe_unused mtk_smi_larb_suspend (struct device * dev )
372
+ {
373
+ struct mtk_smi_larb * larb = dev_get_drvdata (dev );
374
+
375
+ mtk_smi_clk_disable (& larb -> smi );
376
+ pm_runtime_put_sync (larb -> smi_common_dev );
377
+ return 0 ;
378
+ }
379
+
380
+ static const struct dev_pm_ops smi_larb_pm_ops = {
381
+ SET_RUNTIME_PM_OPS (mtk_smi_larb_suspend , mtk_smi_larb_resume , NULL )
382
+ };
383
+
380
384
static struct platform_driver mtk_smi_larb_driver = {
381
385
.probe = mtk_smi_larb_probe ,
382
386
.remove = mtk_smi_larb_remove ,
383
387
.driver = {
384
388
.name = "mtk-smi-larb" ,
385
389
.of_match_table = mtk_smi_larb_of_ids ,
390
+ .pm = & smi_larb_pm_ops ,
386
391
}
387
392
};
388
393
@@ -481,12 +486,38 @@ static int mtk_smi_common_remove(struct platform_device *pdev)
481
486
return 0 ;
482
487
}
483
488
489
+ static int __maybe_unused mtk_smi_common_resume (struct device * dev )
490
+ {
491
+ struct mtk_smi * common = dev_get_drvdata (dev );
492
+ int ret ;
493
+
494
+ ret = mtk_smi_clk_enable (common );
495
+ if (ret ) {
496
+ dev_err (common -> dev , "Failed to enable clock(%d).\n" , ret );
497
+ return ret ;
498
+ }
499
+ return 0 ;
500
+ }
501
+
502
+ static int __maybe_unused mtk_smi_common_suspend (struct device * dev )
503
+ {
504
+ struct mtk_smi * common = dev_get_drvdata (dev );
505
+
506
+ mtk_smi_clk_disable (common );
507
+ return 0 ;
508
+ }
509
+
510
+ static const struct dev_pm_ops smi_common_pm_ops = {
511
+ SET_RUNTIME_PM_OPS (mtk_smi_common_suspend , mtk_smi_common_resume , NULL )
512
+ };
513
+
484
514
static struct platform_driver mtk_smi_common_driver = {
485
515
.probe = mtk_smi_common_probe ,
486
516
.remove = mtk_smi_common_remove ,
487
517
.driver = {
488
518
.name = "mtk-smi-common" ,
489
519
.of_match_table = mtk_smi_common_of_ids ,
520
+ .pm = & smi_common_pm_ops ,
490
521
}
491
522
};
492
523
0 commit comments