Last active
March 22, 2021 00:38
-
-
Save kwilczynski/fedf4ecc3f037b47f6f62acf4dfa36e1 to your computer and use it in GitHub Desktop.
PM driver callbacks helper
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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; \ | |
| }) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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