More power management updates for 5.17-rc1
This is a continuation of the rework of device power management macros used for declaring device power management callbacks (Paul Cercueil). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmHlrb8SHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxI9AP/0t2eeRYNc3i7DUpdMumkF4EQcotMCdR uXkZAUjqINNCaR6dpke1rXnqTC4LSqUtwjy7aOUCZVON8/V2O+TaVG1QQNMrvxpL ++BLv4BDkBN0hyOIEpxTQR5CZrFoI/7A+lsBlnLjSlvd3d+0DQBEYxZGuxiSHRGj 7G3pTwNdRB8TFxU9ynn1c2otTczZcbTnef//LE376TK+wRS9zLw9TyA5todcl4Rj j7zza1K6pFG6tUby3ewr/TVVWbNwXGVFO+npYptQaiTnCTm5IZpiC6gZEfvXPSbG ltOoakikopZvmcoi4ZQ8YzROuu+T/itBws/h5ZgMl+A4aSGOE+4Q+7RcL1RuGZX8 9eRFtA3VvDZMKpqXjqLiCt3XvzvZ25eFspmZEf0CwyJpO/G2Vog82abliCtpKsDT ErTXjgZtpfIO+/EMsc1to5UlmcO2vr5vZNc+aREIAndZPp/5dnU4QM74mcjNtUW/ DOMoGuf5Z2ZMcsa4WrZUwf+rwi+Pjh59rugmErGL2b7SNsRX612cy4hMNhlx2MpG jA0BueesX+bCyxjd1ROPBMHsNWw2zG1zJu0Ut1HFuvoVv8wCQDdykrOn6jzeDyQu DP5hZhw4a9KqDI9qx5zCZA0MaCzhpooVRjcnyL3VPumQ/1VBCeN7fla/O1UwK/FU lPwArcy3aSw9 =psFp -----END PGP SIGNATURE----- Merge tag 'pm-5.17-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull more power management updates from Rafael Wysocki: "This is a continuation of the rework of device power management macros used for declaring device power management callbacks (Paul Cercueil)" * tag 'pm-5.17-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: iio: pressure: bmp280: Use new PM macros PM: runtime: Add EXPORT[_GPL]_RUNTIME_DEV_PM_OPS macros PM: runtime: Add DEFINE_RUNTIME_DEV_PM_OPS() macro PM: core: Add EXPORT[_GPL]_SIMPLE_DEV_PM_OPS macros PM: core: Remove static qualifier in DEFINE_SIMPLE_DEV_PM_OPS macro PM: core: Remove DEFINE_UNIVERSAL_DEV_PM_OPS() macro
This commit is contained in:
Коммит
8357f6fb3d
|
@ -1138,7 +1138,6 @@ int bmp280_common_probe(struct device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL(bmp280_common_probe);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int bmp280_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct iio_dev *indio_dev = dev_get_drvdata(dev);
|
||||
|
@ -1159,15 +1158,9 @@ static int bmp280_runtime_resume(struct device *dev)
|
|||
usleep_range(data->start_up_time, data->start_up_time + 100);
|
||||
return data->chip_info->chip_config(data);
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
const struct dev_pm_ops bmp280_dev_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
|
||||
pm_runtime_force_resume)
|
||||
SET_RUNTIME_PM_OPS(bmp280_runtime_suspend,
|
||||
bmp280_runtime_resume, NULL)
|
||||
};
|
||||
EXPORT_SYMBOL(bmp280_dev_pm_ops);
|
||||
EXPORT_RUNTIME_DEV_PM_OPS(bmp280_dev_pm_ops, bmp280_runtime_suspend,
|
||||
bmp280_runtime_resume, NULL);
|
||||
|
||||
MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>");
|
||||
MODULE_DESCRIPTION("Driver for Bosch Sensortec BMP180/BMP280 pressure and temperature sensor");
|
||||
|
|
|
@ -58,7 +58,7 @@ static struct i2c_driver bmp280_i2c_driver = {
|
|||
.driver = {
|
||||
.name = "bmp280",
|
||||
.of_match_table = bmp280_of_i2c_match,
|
||||
.pm = &bmp280_dev_pm_ops,
|
||||
.pm = pm_ptr(&bmp280_dev_pm_ops),
|
||||
},
|
||||
.probe = bmp280_i2c_probe,
|
||||
.id_table = bmp280_i2c_id,
|
||||
|
|
|
@ -109,7 +109,7 @@ static struct spi_driver bmp280_spi_driver = {
|
|||
.driver = {
|
||||
.name = "bmp280",
|
||||
.of_match_table = bmp280_of_spi_match,
|
||||
.pm = &bmp280_dev_pm_ops,
|
||||
.pm = pm_ptr(&bmp280_dev_pm_ops),
|
||||
},
|
||||
.id_table = bmp280_spi_id,
|
||||
.probe = bmp280_spi_probe,
|
||||
|
|
|
@ -1128,8 +1128,8 @@ static int jz4740_mmc_resume(struct device *dev)
|
|||
return pinctrl_select_default_state(dev);
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend,
|
||||
jz4740_mmc_resume);
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(jz4740_mmc_pm_ops, jz4740_mmc_suspend,
|
||||
jz4740_mmc_resume);
|
||||
|
||||
static struct platform_driver jz4740_mmc_driver = {
|
||||
.probe = jz4740_mmc_probe,
|
||||
|
|
|
@ -1210,7 +1210,7 @@ static int mxcmci_resume(struct device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume);
|
||||
static DEFINE_SIMPLE_DEV_PM_OPS(mxcmci_pm_ops, mxcmci_suspend, mxcmci_resume);
|
||||
|
||||
static struct platform_driver mxcmci_driver = {
|
||||
.probe = mxcmci_probe,
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#ifndef _LINUX_PM_H
|
||||
#define _LINUX_PM_H
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
@ -357,13 +358,47 @@ struct dev_pm_ops {
|
|||
#define SET_RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn)
|
||||
#endif
|
||||
|
||||
#define _DEFINE_DEV_PM_OPS(name, \
|
||||
suspend_fn, resume_fn, \
|
||||
runtime_suspend_fn, runtime_resume_fn, idle_fn) \
|
||||
const struct dev_pm_ops name = { \
|
||||
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
|
||||
RUNTIME_PM_OPS(runtime_suspend_fn, runtime_resume_fn, idle_fn) \
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#define _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \
|
||||
runtime_resume_fn, idle_fn, sec) \
|
||||
_DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \
|
||||
runtime_resume_fn, idle_fn); \
|
||||
_EXPORT_SYMBOL(name, sec)
|
||||
#else
|
||||
#define _EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, runtime_suspend_fn, \
|
||||
runtime_resume_fn, idle_fn, sec) \
|
||||
static __maybe_unused _DEFINE_DEV_PM_OPS(__static_##name, suspend_fn, \
|
||||
resume_fn, runtime_suspend_fn, \
|
||||
runtime_resume_fn, idle_fn)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Use this if you want to use the same suspend and resume callbacks for suspend
|
||||
* to RAM and hibernation.
|
||||
*
|
||||
* If the underlying dev_pm_ops struct symbol has to be exported, use
|
||||
* EXPORT_SIMPLE_DEV_PM_OPS() or EXPORT_GPL_SIMPLE_DEV_PM_OPS() instead.
|
||||
*/
|
||||
#define DEFINE_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
|
||||
static const struct dev_pm_ops name = { \
|
||||
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
|
||||
_DEFINE_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL)
|
||||
|
||||
#define EXPORT_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
|
||||
_EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL, "")
|
||||
#define EXPORT_GPL_SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
|
||||
_EXPORT_DEV_PM_OPS(name, suspend_fn, resume_fn, NULL, NULL, NULL, "_gpl")
|
||||
|
||||
/* Deprecated. Use DEFINE_SIMPLE_DEV_PM_OPS() instead. */
|
||||
#define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
|
||||
const struct dev_pm_ops __maybe_unused name = { \
|
||||
SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -378,20 +413,10 @@ static const struct dev_pm_ops name = { \
|
|||
* suspend and "early" resume callback pointers, .suspend_late() and
|
||||
* .resume_early(), to the same routines as .runtime_suspend() and
|
||||
* .runtime_resume(), respectively (and analogously for hibernation).
|
||||
*
|
||||
* Deprecated. You most likely don't want this macro. Use
|
||||
* DEFINE_RUNTIME_DEV_PM_OPS() instead.
|
||||
*/
|
||||
#define DEFINE_UNIVERSAL_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \
|
||||
static const struct dev_pm_ops name = { \
|
||||
SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
|
||||
RUNTIME_PM_OPS(suspend_fn, resume_fn, idle_fn) \
|
||||
}
|
||||
|
||||
/* Deprecated. Use DEFINE_SIMPLE_DEV_PM_OPS() instead. */
|
||||
#define SIMPLE_DEV_PM_OPS(name, suspend_fn, resume_fn) \
|
||||
const struct dev_pm_ops __maybe_unused name = { \
|
||||
SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
|
||||
}
|
||||
|
||||
/* Deprecated. Use DEFINE_UNIVERSAL_DEV_PM_OPS() instead. */
|
||||
#define UNIVERSAL_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \
|
||||
const struct dev_pm_ops __maybe_unused name = { \
|
||||
SET_SYSTEM_SLEEP_PM_OPS(suspend_fn, resume_fn) \
|
||||
|
|
|
@ -22,6 +22,30 @@
|
|||
usage_count */
|
||||
#define RPM_AUTO 0x08 /* Use autosuspend_delay */
|
||||
|
||||
/*
|
||||
* Use this for defining a set of PM operations to be used in all situations
|
||||
* (system suspend, hibernation or runtime PM).
|
||||
*
|
||||
* Note that the behaviour differs from the deprecated UNIVERSAL_DEV_PM_OPS()
|
||||
* macro, which uses the provided callbacks for both runtime PM and system
|
||||
* sleep, while DEFINE_RUNTIME_DEV_PM_OPS() uses pm_runtime_force_suspend()
|
||||
* and pm_runtime_force_resume() for its system sleep callbacks.
|
||||
*
|
||||
* If the underlying dev_pm_ops struct symbol has to be exported, use
|
||||
* EXPORT_RUNTIME_DEV_PM_OPS() or EXPORT_GPL_RUNTIME_DEV_PM_OPS() instead.
|
||||
*/
|
||||
#define DEFINE_RUNTIME_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \
|
||||
_DEFINE_DEV_PM_OPS(name, pm_runtime_force_suspend, \
|
||||
pm_runtime_force_resume, suspend_fn, \
|
||||
resume_fn, idle_fn)
|
||||
|
||||
#define EXPORT_RUNTIME_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \
|
||||
_EXPORT_DEV_PM_OPS(name, pm_runtime_force_suspend, pm_runtime_force_resume, \
|
||||
suspend_fn, resume_fn, idle_fn, "")
|
||||
#define EXPORT_GPL_RUNTIME_DEV_PM_OPS(name, suspend_fn, resume_fn, idle_fn) \
|
||||
_EXPORT_DEV_PM_OPS(name, pm_runtime_force_suspend, pm_runtime_force_resume, \
|
||||
suspend_fn, resume_fn, idle_fn, "_gpl")
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
extern struct workqueue_struct *pm_wq;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче