diff options
| author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2025-06-27 21:20:40 +0200 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2025-07-03 17:10:40 +0200 |
| commit | 2b2dcf08116d6e96a446c8f3216b2479701e39aa (patch) | |
| tree | 6fa48c8c991a590f0655f04bd9efc2e3f680bb9f /drivers/base | |
| parent | PM: Check power.needs_force_resume in pm_runtime_force_suspend() (diff) | |
| download | linux-2b2dcf08116d6e96a446c8f3216b2479701e39aa.tar.gz linux-2b2dcf08116d6e96a446c8f3216b2479701e39aa.zip | |
PM: runtime: Introduce __rpm_get_driver_callback()
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
Diffstat (limited to 'drivers/base')
| -rw-r--r-- | drivers/base/power/runtime.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index f61b7fa183e0..8cd1a4db5e84 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -19,10 +19,24 @@ typedef int (*pm_callback_t)(struct device *); +static inline pm_callback_t get_callback_ptr(const void *start, size_t offset) +{ + return *(pm_callback_t *)(start + offset); +} + +static pm_callback_t __rpm_get_driver_callback(struct device *dev, + size_t cb_offset) +{ + if (dev->driver && dev->driver->pm) + return get_callback_ptr(dev->driver->pm, cb_offset); + + return NULL; +} + static pm_callback_t __rpm_get_callback(struct device *dev, size_t cb_offset) { - pm_callback_t cb; const struct dev_pm_ops *ops; + pm_callback_t cb = NULL; if (dev->pm_domain) ops = &dev->pm_domain->ops; @@ -36,12 +50,10 @@ static pm_callback_t __rpm_get_callback(struct device *dev, size_t cb_offset) ops = NULL; if (ops) - cb = *(pm_callback_t *)((void *)ops + cb_offset); - else - cb = NULL; + cb = get_callback_ptr(ops, cb_offset); - if (!cb && dev->driver && dev->driver->pm) - cb = *(pm_callback_t *)((void *)dev->driver->pm + cb_offset); + if (!cb) + cb = __rpm_get_driver_callback(dev, cb_offset); return cb; } |
