88#include <linux/pm_runtime.h>
99#include <linux/export.h>
1010
11+ #define CALL_PM_OP (dev , op ) \
12+ ({ \
13+ struct device *_dev = (dev); \
14+ const struct dev_pm_ops *pm = _dev->driver ? _dev->driver->pm : NULL; \
15+ pm && pm->op ? pm->op(_dev) : 0; \
16+ })
17+
1118#ifdef CONFIG_PM
1219/**
1320 * pm_generic_runtime_suspend - Generic runtime suspend callback for subsystems.
1926 */
2027int pm_generic_runtime_suspend (struct device * dev )
2128{
22- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
23- int ret ;
24-
25- ret = pm && pm -> runtime_suspend ? pm -> runtime_suspend (dev ) : 0 ;
26-
27- return ret ;
29+ return CALL_PM_OP (dev , runtime_suspend );
2830}
2931EXPORT_SYMBOL_GPL (pm_generic_runtime_suspend );
3032
@@ -38,12 +40,7 @@ EXPORT_SYMBOL_GPL(pm_generic_runtime_suspend);
3840 */
3941int pm_generic_runtime_resume (struct device * dev )
4042{
41- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
42- int ret ;
43-
44- ret = pm && pm -> runtime_resume ? pm -> runtime_resume (dev ) : 0 ;
45-
46- return ret ;
43+ return CALL_PM_OP (dev , runtime_resume );
4744}
4845EXPORT_SYMBOL_GPL (pm_generic_runtime_resume );
4946#endif /* CONFIG_PM */
@@ -72,9 +69,7 @@ int pm_generic_prepare(struct device *dev)
7269 */
7370int pm_generic_suspend_noirq (struct device * dev )
7471{
75- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
76-
77- return pm && pm -> suspend_noirq ? pm -> suspend_noirq (dev ) : 0 ;
72+ return CALL_PM_OP (dev , suspend_noirq );
7873}
7974EXPORT_SYMBOL_GPL (pm_generic_suspend_noirq );
8075
@@ -84,9 +79,7 @@ EXPORT_SYMBOL_GPL(pm_generic_suspend_noirq);
8479 */
8580int pm_generic_suspend_late (struct device * dev )
8681{
87- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
88-
89- return pm && pm -> suspend_late ? pm -> suspend_late (dev ) : 0 ;
82+ return CALL_PM_OP (dev , suspend_late );
9083}
9184EXPORT_SYMBOL_GPL (pm_generic_suspend_late );
9285
@@ -96,9 +89,7 @@ EXPORT_SYMBOL_GPL(pm_generic_suspend_late);
9689 */
9790int pm_generic_suspend (struct device * dev )
9891{
99- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
100-
101- return pm && pm -> suspend ? pm -> suspend (dev ) : 0 ;
92+ return CALL_PM_OP (dev , suspend );
10293}
10394EXPORT_SYMBOL_GPL (pm_generic_suspend );
10495
@@ -108,9 +99,7 @@ EXPORT_SYMBOL_GPL(pm_generic_suspend);
10899 */
109100int pm_generic_freeze_noirq (struct device * dev )
110101{
111- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
112-
113- return pm && pm -> freeze_noirq ? pm -> freeze_noirq (dev ) : 0 ;
102+ return CALL_PM_OP (dev , freeze_noirq );
114103}
115104EXPORT_SYMBOL_GPL (pm_generic_freeze_noirq );
116105
@@ -120,9 +109,7 @@ EXPORT_SYMBOL_GPL(pm_generic_freeze_noirq);
120109 */
121110int pm_generic_freeze (struct device * dev )
122111{
123- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
124-
125- return pm && pm -> freeze ? pm -> freeze (dev ) : 0 ;
112+ return CALL_PM_OP (dev , freeze );
126113}
127114EXPORT_SYMBOL_GPL (pm_generic_freeze );
128115
@@ -132,9 +119,7 @@ EXPORT_SYMBOL_GPL(pm_generic_freeze);
132119 */
133120int pm_generic_poweroff_noirq (struct device * dev )
134121{
135- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
136-
137- return pm && pm -> poweroff_noirq ? pm -> poweroff_noirq (dev ) : 0 ;
122+ return CALL_PM_OP (dev , poweroff_noirq );
138123}
139124EXPORT_SYMBOL_GPL (pm_generic_poweroff_noirq );
140125
@@ -144,9 +129,7 @@ EXPORT_SYMBOL_GPL(pm_generic_poweroff_noirq);
144129 */
145130int pm_generic_poweroff_late (struct device * dev )
146131{
147- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
148-
149- return pm && pm -> poweroff_late ? pm -> poweroff_late (dev ) : 0 ;
132+ return CALL_PM_OP (dev , poweroff_late );
150133}
151134EXPORT_SYMBOL_GPL (pm_generic_poweroff_late );
152135
@@ -156,9 +139,7 @@ EXPORT_SYMBOL_GPL(pm_generic_poweroff_late);
156139 */
157140int pm_generic_poweroff (struct device * dev )
158141{
159- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
160-
161- return pm && pm -> poweroff ? pm -> poweroff (dev ) : 0 ;
142+ return CALL_PM_OP (dev , poweroff );
162143}
163144EXPORT_SYMBOL_GPL (pm_generic_poweroff );
164145
@@ -168,9 +149,7 @@ EXPORT_SYMBOL_GPL(pm_generic_poweroff);
168149 */
169150int pm_generic_thaw_noirq (struct device * dev )
170151{
171- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
172-
173- return pm && pm -> thaw_noirq ? pm -> thaw_noirq (dev ) : 0 ;
152+ return CALL_PM_OP (dev , thaw_noirq );
174153}
175154EXPORT_SYMBOL_GPL (pm_generic_thaw_noirq );
176155
@@ -180,9 +159,7 @@ EXPORT_SYMBOL_GPL(pm_generic_thaw_noirq);
180159 */
181160int pm_generic_thaw (struct device * dev )
182161{
183- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
184-
185- return pm && pm -> thaw ? pm -> thaw (dev ) : 0 ;
162+ return CALL_PM_OP (dev , thaw );
186163}
187164EXPORT_SYMBOL_GPL (pm_generic_thaw );
188165
@@ -192,9 +169,7 @@ EXPORT_SYMBOL_GPL(pm_generic_thaw);
192169 */
193170int pm_generic_resume_noirq (struct device * dev )
194171{
195- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
196-
197- return pm && pm -> resume_noirq ? pm -> resume_noirq (dev ) : 0 ;
172+ return CALL_PM_OP (dev , resume_noirq );
198173}
199174EXPORT_SYMBOL_GPL (pm_generic_resume_noirq );
200175
@@ -204,9 +179,7 @@ EXPORT_SYMBOL_GPL(pm_generic_resume_noirq);
204179 */
205180int pm_generic_resume_early (struct device * dev )
206181{
207- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
208-
209- return pm && pm -> resume_early ? pm -> resume_early (dev ) : 0 ;
182+ return CALL_PM_OP (dev , resume_early );
210183}
211184EXPORT_SYMBOL_GPL (pm_generic_resume_early );
212185
@@ -216,9 +189,7 @@ EXPORT_SYMBOL_GPL(pm_generic_resume_early);
216189 */
217190int pm_generic_resume (struct device * dev )
218191{
219- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
220-
221- return pm && pm -> resume ? pm -> resume (dev ) : 0 ;
192+ return CALL_PM_OP (dev , resume );
222193}
223194EXPORT_SYMBOL_GPL (pm_generic_resume );
224195
@@ -228,9 +199,7 @@ EXPORT_SYMBOL_GPL(pm_generic_resume);
228199 */
229200int pm_generic_restore_noirq (struct device * dev )
230201{
231- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
232-
233- return pm && pm -> restore_noirq ? pm -> restore_noirq (dev ) : 0 ;
202+ return CALL_PM_OP (dev , restore_noirq );
234203}
235204EXPORT_SYMBOL_GPL (pm_generic_restore_noirq );
236205
@@ -240,9 +209,7 @@ EXPORT_SYMBOL_GPL(pm_generic_restore_noirq);
240209 */
241210int pm_generic_restore_early (struct device * dev )
242211{
243- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
244-
245- return pm && pm -> restore_early ? pm -> restore_early (dev ) : 0 ;
212+ return CALL_PM_OP (dev , restore_early );
246213}
247214EXPORT_SYMBOL_GPL (pm_generic_restore_early );
248215
@@ -252,9 +219,7 @@ EXPORT_SYMBOL_GPL(pm_generic_restore_early);
252219 */
253220int pm_generic_restore (struct device * dev )
254221{
255- const struct dev_pm_ops * pm = dev -> driver ? dev -> driver -> pm : NULL ;
256-
257- return pm && pm -> restore ? pm -> restore (dev ) : 0 ;
222+ return CALL_PM_OP (dev , restore );
258223}
259224EXPORT_SYMBOL_GPL (pm_generic_restore );
260225
0 commit comments