]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PM: runtime: Introduce __rpm_get_driver_callback()
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 27 Jun 2025 19:20:40 +0000 (21:20 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 3 Jul 2025 15:10:40 +0000 (17:10 +0200)
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
drivers/base/power/runtime.c

index f61b7fa183e016dcba3e6c1a91ef8f1d5ed302e3..8cd1a4db5e8465b1cd992fdcab3ba4fafcae010e 100644 (file)
 
 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;
 }