Skip to content

Commit 5a151c2

Browse files
kaushlenrafaeljw
authored andcommitted
PM: sleep: Introduce CALL_PM_OP() macro to simplify code
Add CALL_PM_OP() macro to eliminate a repetitive code pattern in power management generic operations. Replace analogous driver PM callback invocation logic across all pm_generic_*() functions with a single macro that handles the NULL pointer checks and function calls. This reduces code size while maintaining the same functionality and improving code maintainability. Signed-off-by: Kaushlendra Kumar <kaushlendra.kumar@intel.com> Reviewed-by: Dhruva Gole <d-gole@ti.com> Link: https://patch.msgid.link/20250919124437.3075016-1-kaushlendra.kumar@intel.com [ rjw: Subject and changelog edits, adjust white space ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent b57100a commit 5a151c2

1 file changed

Lines changed: 25 additions & 60 deletions

File tree

drivers/base/power/generic_ops.c

Lines changed: 25 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
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.
@@ -19,12 +26,7 @@
1926
*/
2027
int 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
}
2931
EXPORT_SYMBOL_GPL(pm_generic_runtime_suspend);
3032

@@ -38,12 +40,7 @@ EXPORT_SYMBOL_GPL(pm_generic_runtime_suspend);
3840
*/
3941
int 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
}
4845
EXPORT_SYMBOL_GPL(pm_generic_runtime_resume);
4946
#endif /* CONFIG_PM */
@@ -72,9 +69,7 @@ int pm_generic_prepare(struct device *dev)
7269
*/
7370
int 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
}
7974
EXPORT_SYMBOL_GPL(pm_generic_suspend_noirq);
8075

@@ -84,9 +79,7 @@ EXPORT_SYMBOL_GPL(pm_generic_suspend_noirq);
8479
*/
8580
int 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
}
9184
EXPORT_SYMBOL_GPL(pm_generic_suspend_late);
9285

@@ -96,9 +89,7 @@ EXPORT_SYMBOL_GPL(pm_generic_suspend_late);
9689
*/
9790
int 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
}
10394
EXPORT_SYMBOL_GPL(pm_generic_suspend);
10495

@@ -108,9 +99,7 @@ EXPORT_SYMBOL_GPL(pm_generic_suspend);
10899
*/
109100
int 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
}
115104
EXPORT_SYMBOL_GPL(pm_generic_freeze_noirq);
116105

@@ -120,9 +109,7 @@ EXPORT_SYMBOL_GPL(pm_generic_freeze_noirq);
120109
*/
121110
int 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
}
127114
EXPORT_SYMBOL_GPL(pm_generic_freeze);
128115

@@ -132,9 +119,7 @@ EXPORT_SYMBOL_GPL(pm_generic_freeze);
132119
*/
133120
int 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
}
139124
EXPORT_SYMBOL_GPL(pm_generic_poweroff_noirq);
140125

@@ -144,9 +129,7 @@ EXPORT_SYMBOL_GPL(pm_generic_poweroff_noirq);
144129
*/
145130
int 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
}
151134
EXPORT_SYMBOL_GPL(pm_generic_poweroff_late);
152135

@@ -156,9 +139,7 @@ EXPORT_SYMBOL_GPL(pm_generic_poweroff_late);
156139
*/
157140
int 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
}
163144
EXPORT_SYMBOL_GPL(pm_generic_poweroff);
164145

@@ -168,9 +149,7 @@ EXPORT_SYMBOL_GPL(pm_generic_poweroff);
168149
*/
169150
int 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
}
175154
EXPORT_SYMBOL_GPL(pm_generic_thaw_noirq);
176155

@@ -180,9 +159,7 @@ EXPORT_SYMBOL_GPL(pm_generic_thaw_noirq);
180159
*/
181160
int 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
}
187164
EXPORT_SYMBOL_GPL(pm_generic_thaw);
188165

@@ -192,9 +169,7 @@ EXPORT_SYMBOL_GPL(pm_generic_thaw);
192169
*/
193170
int 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
}
199174
EXPORT_SYMBOL_GPL(pm_generic_resume_noirq);
200175

@@ -204,9 +179,7 @@ EXPORT_SYMBOL_GPL(pm_generic_resume_noirq);
204179
*/
205180
int 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
}
211184
EXPORT_SYMBOL_GPL(pm_generic_resume_early);
212185

@@ -216,9 +189,7 @@ EXPORT_SYMBOL_GPL(pm_generic_resume_early);
216189
*/
217190
int 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
}
223194
EXPORT_SYMBOL_GPL(pm_generic_resume);
224195

@@ -228,9 +199,7 @@ EXPORT_SYMBOL_GPL(pm_generic_resume);
228199
*/
229200
int 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
}
235204
EXPORT_SYMBOL_GPL(pm_generic_restore_noirq);
236205

@@ -240,9 +209,7 @@ EXPORT_SYMBOL_GPL(pm_generic_restore_noirq);
240209
*/
241210
int 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
}
247214
EXPORT_SYMBOL_GPL(pm_generic_restore_early);
248215

@@ -252,9 +219,7 @@ EXPORT_SYMBOL_GPL(pm_generic_restore_early);
252219
*/
253220
int 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
}
259224
EXPORT_SYMBOL_GPL(pm_generic_restore);
260225

0 commit comments

Comments
 (0)