775b64d2b6
This patch reorganizes the way suspend and resume notifications are sent to drivers. The major changes are that now the PM core acquires every device semaphore before calling the methods, and calls to device_add() during suspends will fail, while calls to device_del() during suspends will block. It also provides a way to safely remove a suspended device with the help of the PM core, by using the device_pm_schedule_removal() callback introduced specifically for this purpose, and updates two drivers (msr and cpuid) that need to use it. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
70 lines
1.0 KiB
C
70 lines
1.0 KiB
C
/*
|
|
* shutdown.c
|
|
*/
|
|
|
|
extern void device_shutdown(void);
|
|
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
|
|
/*
|
|
* main.c
|
|
*/
|
|
|
|
extern struct list_head dpm_active; /* The active device list */
|
|
|
|
static inline struct device *to_device(struct list_head *entry)
|
|
{
|
|
return container_of(entry, struct device, power.entry);
|
|
}
|
|
|
|
extern void device_pm_add(struct device *);
|
|
extern void device_pm_remove(struct device *);
|
|
extern void device_pm_schedule_removal(struct device *);
|
|
extern int pm_sleep_lock(void);
|
|
extern void pm_sleep_unlock(void);
|
|
|
|
#else /* CONFIG_PM_SLEEP */
|
|
|
|
|
|
static inline void device_pm_add(struct device *dev)
|
|
{
|
|
}
|
|
|
|
static inline void device_pm_remove(struct device *dev)
|
|
{
|
|
}
|
|
|
|
static inline int pm_sleep_lock(void)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void pm_sleep_unlock(void)
|
|
{
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_PM
|
|
|
|
/*
|
|
* sysfs.c
|
|
*/
|
|
|
|
extern int dpm_sysfs_add(struct device *);
|
|
extern void dpm_sysfs_remove(struct device *);
|
|
|
|
#else /* CONFIG_PM */
|
|
|
|
static inline int dpm_sysfs_add(struct device *dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void dpm_sysfs_remove(struct device *dev)
|
|
{
|
|
}
|
|
|
|
#endif
|