Skip to content

Instantly share code, notes, and snippets.

@kwilczynski
Last active March 22, 2021 00:38
Show Gist options
  • Select an option

  • Save kwilczynski/fedf4ecc3f037b47f6f62acf4dfa36e1 to your computer and use it in GitHub Desktop.

Select an option

Save kwilczynski/fedf4ecc3f037b47f6f62acf4dfa36e1 to your computer and use it in GitHub Desktop.
PM driver callbacks helper
// Using the && (logical AND) operator.
#define pm_driver_has_callback(__device, __callback) \
((__device)->driver && (__device)->driver->pm && (__device)->driver->pm->__callback)
#define pm_driver_do_callback(__device, __callback) \
(pm_driver_has_callback(__device, __callback) ? (__device)->driver->pm->__callback(__device) : 0)
// Using a statement expression to avoid using ternary operator...
#define pm_driver_has_callback(__device, __callback) \
({ \
int __result = -EINVAL; \
if ((__device)->driver && (__device)->driver->pm && (__device)->driver->pm->__callback) \
__result = 0; \
__result; \
})
#define pm_driver_do_callback(__device, __callback) \
({ \
int __result = -EINVAL; \
if (pm_driver_has_callback(__device, __callback)) \
__result = (__device)->driver->pm->__callback(__device); \
__result; \
})
static int gb_bundle_suspend(struct device *dev)
{
struct gb_bundle *bundle = to_gb_bundle(dev);
- const struct dev_pm_ops *pm = dev->driver->pm;
int ret;
- if (pm && pm->runtime_suspend) {
- ret = pm->runtime_suspend(&bundle->dev);
+ if (pm_driver_has_callback(dev, runtime_suspend)) {
+ ret = pm_driver_do_callback(&bundle->dev, runtime_suspend);
if (ret)
return ret;
} else {
@@ -121,8 +142,8 @@ static int gb_bundle_suspend(struct device *dev)
ret = gb_control_bundle_suspend(bundle->intf->control, bundle->id);
if (ret) {
- if (pm && pm->runtime_resume)
- ret = pm->runtime_resume(dev);
+ if (pm_driver_has_callback(dev, runtime_resume))
+ ret = pm_driver_do_callback(dev, runtime_resume);
else
gb_bundle_enable_all_connections(bundle);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment