Skip to content

Commit 6f52c5b

Browse files
committed
PM: runtime: Introduce __rpm_get_driver_callback()
JIRA: https://issues.redhat.com/browse/RHEL-109251 commit 2b2dcf0 Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Date: Thu, 03 Jul 2025 17:10:40 +0000 Add a special function for computing the address of the runtime PM callback given by an offset relative to the start of the device driver's struct dev_pm_ops and use it to obtain the driver callback in __rpm_get_callback(). Also put the shared part of the callback address computation into a separate helper function to avoid code duplication and explicit pointer type casts. The new __rpm_get_driver_callback() will be used subsequently for implementing callback lookup in pm_runtime_force_suspend/resume(). No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org> Link: https://patch.msgid.link/2054356.usQuhbGJ8B@rjwysocki.net Signed-off-by: Mark Langsdorf <mlangsdo@redhat.com>
1 parent b88ff47 commit 6f52c5b

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

drivers/base/power/runtime.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,24 @@
1919

2020
typedef int (*pm_callback_t)(struct device *);
2121

22+
static inline pm_callback_t get_callback_ptr(const void *start, size_t offset)
23+
{
24+
return *(pm_callback_t *)(start + offset);
25+
}
26+
27+
static pm_callback_t __rpm_get_driver_callback(struct device *dev,
28+
size_t cb_offset)
29+
{
30+
if (dev->driver && dev->driver->pm)
31+
return get_callback_ptr(dev->driver->pm, cb_offset);
32+
33+
return NULL;
34+
}
35+
2236
static pm_callback_t __rpm_get_callback(struct device *dev, size_t cb_offset)
2337
{
24-
pm_callback_t cb;
2538
const struct dev_pm_ops *ops;
39+
pm_callback_t cb = NULL;
2640

2741
if (dev->pm_domain)
2842
ops = &dev->pm_domain->ops;
@@ -36,12 +50,10 @@ static pm_callback_t __rpm_get_callback(struct device *dev, size_t cb_offset)
3650
ops = NULL;
3751

3852
if (ops)
39-
cb = *(pm_callback_t *)((void *)ops + cb_offset);
40-
else
41-
cb = NULL;
53+
cb = get_callback_ptr(ops, cb_offset);
4254

43-
if (!cb && dev->driver && dev->driver->pm)
44-
cb = *(pm_callback_t *)((void *)dev->driver->pm + cb_offset);
55+
if (!cb)
56+
cb = __rpm_get_driver_callback(dev, cb_offset);
4557

4658
return cb;
4759
}

0 commit comments

Comments
 (0)