mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-04 05:29:15 +08:00
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user