Skip to content

Commit

Permalink
PM: Do not use the syscore flag for runtime PM
Browse files Browse the repository at this point in the history
The syscore device PM flag used to mark the devices (belonging to
PM domains) that should never be turned off, except for the system
core (syscore) suspend/hibernation and resume stages, need not be
accessed by the runtime PM core functions, because all of the devices
it is set for need to be marked as "irq safe" anyway and are
protected from being turned off by runtime PM by ensuring that their
usage counters are always set.

For this reason, make the syscore flag system-wide PM-specific
and simplify the code used for manipulating it, because it need not
acquire the device's power.lock any more.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
  • Loading branch information
Rafael J. Wysocki committed Sep 3, 2012
1 parent 3cb6f10 commit feb70af
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 22 deletions.
15 changes: 0 additions & 15 deletions drivers/base/power/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,18 +83,3 @@ int dev_pm_put_subsys_data(struct device *dev)
return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_put_subsys_data);

/**
* dev_pm_syscore_device - Set/unset the given device's power.syscore flag.
* @dev: Device whose flag is to be modified.
* @val: New value of the flag.
*/
void dev_pm_syscore_device(struct device *dev, bool val)
{
unsigned long flags;

spin_lock_irqsave(&dev->power.lock, flags);
dev->power.syscore = val;
spin_unlock_irqrestore(&dev->power.lock, flags);
}
EXPORT_SYMBOL_GPL(dev_pm_syscore_device);
2 changes: 1 addition & 1 deletion drivers/base/power/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd)
not_suspended = 0;
list_for_each_entry(pdd, &genpd->dev_list, list_node)
if (pdd->dev->driver && (!pm_runtime_suspended(pdd->dev)
|| pdd->dev->power.irq_safe || pdd->dev->power.syscore))
|| pdd->dev->power.irq_safe))
not_suspended++;

if (not_suspended > genpd->in_progress)
Expand Down
2 changes: 1 addition & 1 deletion drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ static int rpm_check_suspend_allowed(struct device *dev)

if (dev->power.runtime_error)
retval = -EINVAL;
else if (dev->power.disable_depth > 0 || dev->power.syscore)
else if (dev->power.disable_depth > 0)
retval = -EACCES;
else if (atomic_read(&dev->power.usage_count) > 0)
retval = -EAGAIN;
Expand Down
7 changes: 7 additions & 0 deletions include/linux/device.h
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,13 @@ static inline void pm_suspend_ignore_children(struct device *dev, bool enable)
dev->power.ignore_children = enable;
}

static inline void dev_pm_syscore_device(struct device *dev, bool val)
{
#ifdef CONFIG_PM_SLEEP
dev->power.syscore = val;
#endif
}

static inline void device_lock(struct device *dev)
{
mutex_lock(&dev->mutex);
Expand Down
6 changes: 1 addition & 5 deletions include/linux/pm.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,8 @@ struct device;

#ifdef CONFIG_PM
extern const char power_group_name[]; /* = "power" */

extern void dev_pm_syscore_device(struct device *dev, bool val);
#else
#define power_group_name NULL

static inline void dev_pm_syscore_device(struct device *dev, bool val) {}
#endif

typedef struct pm_message {
Expand Down Expand Up @@ -515,13 +511,13 @@ struct dev_pm_info {
bool is_suspended:1; /* Ditto */
bool ignore_children:1;
bool early_init:1; /* Owned by the PM core */
bool syscore:1;
spinlock_t lock;
#ifdef CONFIG_PM_SLEEP
struct list_head entry;
struct completion completion;
struct wakeup_source *wakeup;
bool wakeup_path:1;
bool syscore:1;
#else
unsigned int should_wakeup:1;
#endif
Expand Down

0 comments on commit feb70af

Please sign in to comment.