Messages in this thread | | | Date | Sun, 06 Mar 2022 15:29:17 +0000 | From | Paul Cercueil <> | Subject | Re: [PATCH -next] misc: rtsx: fix build for CONFIG_PM not set |
| |
Hi Jonathan,
Le dim., mars 6 2022 at 15:12:12 +0000, Jonathan Cameron <Jonathan.Cameron@Huawei.com> a écrit : > On Sun, 27 Feb 2022 17:56:31 +0000 > Paul Cercueil <paul@crapouillou.net> wrote: > >> Le dim., févr. 27 2022 at 18:51:38 +0100, Arnd Bergmann >> <arnd@arndb.de> a écrit : >> > On Sun, Feb 27, 2022 at 6:46 PM Paul Cercueil >> <paul@crapouillou.net> >> > wrote: >> >> Le dim., févr. 27 2022 at 18:30:16 +0100, Arnd Bergmann >> >> >> >> There could be a DEFINE_DEV_PM_OPS(), but I don't think that's >> >> really >> >> needed - you can very well declare your struct dev_pm_ops >> without >> >> using >> >> one of these macros. Just make sure to use the >> SYSTEM_SLEEP_PM_OPS / >> >> RUNTIME_PM_OPS macros for the callbacks and pm_ptr() for the >> >> device.pm >> >> pointer. >> > >> > Ah, of course, so it comes down to >> > s/SET_SYSTEM_SLEEP_PM_OPS/SYSTEM_SLEEP_PM_OPS/ while >> > removing all the #ifdef an __maybe_unused annotations. The >> pm_ptr() >> > in driver.pm makes this slightly more optimized AFAICT, but has no >> > effect on behavior, right? >> >> The use of SYSTEM_SLEEP_PM_OPS makes sure that the callbacks are >> dropped if the dev_pm_ops is dead code, and the pm_ptr() must be >> used >> for the compiler to know that the dev_pm_ops is dead code. >> >> -Paul >> >> > > Hi Paul, > > We have one remaining case which is still ugly to do. > Where both SYSTEM_SLEEP_PM_OPS/RUNTIME_PM_OPS are set and > the dev_pm_ops structure is exported. > > For that one we still need to expose #ifdef fun in the > drivers I think. > > Any suggestions on a clean solution for that?
Use the _EXPORT_DEV_PM_OPS() macro?
If you make it call __EXPORT_SYMBOL() (with two underscores instead of one) you can specify the namespace as well. All you need then is a nice wrapper macro in pm_runtime.h, that can be used in the driver.
Cheers, -Paul
> Currently I have this... > > #ifdef CONFIG_PM > const struct dev_pm_ops bmc150_magn_pm_ops = { > SYSTEM_SLEEP_PM_OPS(...) > RUNTIME_PM_OPS(...) > }; > EXPORT_SYMBOL_NS(bmc150_magn_pm_ops, IIO_BMC150_MAGN); > #else > static const __maybe_unused dev_pm_ops bmc150_magn_pm_ops = { > SYSTEM_SLEEP_PM_OPS(...) > RUNTIME_PM_OPS(...) > }; > #endif > Not super clean but perhaps we do need > EXPORT_NS_DEV_PM_OPS > EXPORT_NS_GPL_DEV_PM_OPS > and potentially the non namespaced versions. > > Thanks, > > Jonathan
| |