Skip to content

Commit

Permalink
PM / Runtime: Remove device fields related to suspend time, v2
Browse files Browse the repository at this point in the history
After the previous changes in default_stop_ok() and
default_power_down_ok() for PM domains, there are two fields in
struct dev_pm_info that aren't necessary any more,  suspend_time
and max_time_suspended_ns.

Remove those fields along with all of the code that accesses them,
which simplifies the runtime PM framework quite a bit.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
  • Loading branch information
Rafael J. Wysocki committed May 1, 2012
1 parent dd8683e commit 76e267d
Show file tree
Hide file tree
Showing 4 changed files with 2 additions and 119 deletions.
13 changes: 0 additions & 13 deletions drivers/base/power/domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -445,16 +445,6 @@ static int pm_genpd_poweroff(struct generic_pm_domain *genpd)

genpd->status = GPD_STATE_POWER_OFF;

/* Update PM QoS information for devices in the domain. */
list_for_each_entry_reverse(pdd, &genpd->dev_list, list_node) {
struct gpd_timing_data *td = &to_gpd_data(pdd)->td;

pm_runtime_update_max_time_suspended(pdd->dev,
td->start_latency_ns +
td->restore_state_latency_ns +
genpd->power_on_latency_ns);
}

list_for_each_entry(link, &genpd->slave_links, slave_node) {
genpd_sd_counter_dec(link->master);
genpd_queue_power_off_work(link->master);
Expand Down Expand Up @@ -515,9 +505,6 @@ static int pm_genpd_runtime_suspend(struct device *dev)
if (ret)
return ret;

pm_runtime_update_max_time_suspended(dev,
dev_gpd_data(dev)->td.start_latency_ns);

/*
* If power.irq_safe is set, this routine will be run with interrupts
* off, so it can't use mutexes.
Expand Down
103 changes: 2 additions & 101 deletions drivers/base/power/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,47 +282,6 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev)
return retval != -EACCES ? retval : -EIO;
}

struct rpm_qos_data {
ktime_t time_now;
s64 constraint_ns;
};

/**
* rpm_update_qos_constraint - Update a given PM QoS constraint data.
* @dev: Device whose timing data to use.
* @data: PM QoS constraint data to update.
*
* Use the suspend timing data of @dev to update PM QoS constraint data pointed
* to by @data.
*/
static int rpm_update_qos_constraint(struct device *dev, void *data)
{
struct rpm_qos_data *qos = data;
unsigned long flags;
s64 delta_ns;
int ret = 0;

spin_lock_irqsave(&dev->power.lock, flags);

if (dev->power.max_time_suspended_ns < 0)
goto out;

delta_ns = dev->power.max_time_suspended_ns -
ktime_to_ns(ktime_sub(qos->time_now, dev->power.suspend_time));
if (delta_ns <= 0) {
ret = -EBUSY;
goto out;
}

if (qos->constraint_ns > delta_ns || qos->constraint_ns == 0)
qos->constraint_ns = delta_ns;

out:
spin_unlock_irqrestore(&dev->power.lock, flags);

return ret;
}

/**
* rpm_suspend - Carry out runtime suspend of given device.
* @dev: Device to suspend.
Expand All @@ -349,7 +308,6 @@ static int rpm_suspend(struct device *dev, int rpmflags)
{
int (*callback)(struct device *);
struct device *parent = NULL;
struct rpm_qos_data qos;
int retval;

trace_rpm_suspend(dev, rpmflags);
Expand Down Expand Up @@ -445,38 +403,14 @@ static int rpm_suspend(struct device *dev, int rpmflags)
goto out;
}

qos.constraint_ns = __dev_pm_qos_read_value(dev);
if (qos.constraint_ns < 0) {
/* Negative constraint means "never suspend". */
if (__dev_pm_qos_read_value(dev) < 0) {
/* Negative PM QoS constraint means "never suspend". */
retval = -EPERM;
goto out;
}
qos.constraint_ns *= NSEC_PER_USEC;
qos.time_now = ktime_get();

__update_runtime_status(dev, RPM_SUSPENDING);

if (!dev->power.ignore_children) {
if (dev->power.irq_safe)
spin_unlock(&dev->power.lock);
else
spin_unlock_irq(&dev->power.lock);

retval = device_for_each_child(dev, &qos,
rpm_update_qos_constraint);

if (dev->power.irq_safe)
spin_lock(&dev->power.lock);
else
spin_lock_irq(&dev->power.lock);

if (retval)
goto fail;
}

dev->power.suspend_time = qos.time_now;
dev->power.max_time_suspended_ns = qos.constraint_ns ? : -1;

if (dev->pm_domain)
callback = dev->pm_domain->ops.runtime_suspend;
else if (dev->type && dev->type->pm)
Expand Down Expand Up @@ -529,8 +463,6 @@ static int rpm_suspend(struct device *dev, int rpmflags)

fail:
__update_runtime_status(dev, RPM_ACTIVE);
dev->power.suspend_time = ktime_set(0, 0);
dev->power.max_time_suspended_ns = -1;
dev->power.deferred_resume = false;
wake_up_all(&dev->power.wait_queue);

Expand Down Expand Up @@ -704,9 +636,6 @@ static int rpm_resume(struct device *dev, int rpmflags)
if (dev->power.no_callbacks)
goto no_callback; /* Assume success. */

dev->power.suspend_time = ktime_set(0, 0);
dev->power.max_time_suspended_ns = -1;

__update_runtime_status(dev, RPM_RESUMING);

if (dev->pm_domain)
Expand Down Expand Up @@ -1369,9 +1298,6 @@ void pm_runtime_init(struct device *dev)
setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn,
(unsigned long)dev);

dev->power.suspend_time = ktime_set(0, 0);
dev->power.max_time_suspended_ns = -1;

init_waitqueue_head(&dev->power.wait_queue);
}

Expand All @@ -1389,28 +1315,3 @@ void pm_runtime_remove(struct device *dev)
if (dev->power.irq_safe && dev->parent)
pm_runtime_put_sync(dev->parent);
}

/**
* pm_runtime_update_max_time_suspended - Update device's suspend time data.
* @dev: Device to handle.
* @delta_ns: Value to subtract from the device's max_time_suspended_ns field.
*
* Update the device's power.max_time_suspended_ns field by subtracting
* @delta_ns from it. The resulting value of power.max_time_suspended_ns is
* never negative.
*/
void pm_runtime_update_max_time_suspended(struct device *dev, s64 delta_ns)
{
unsigned long flags;

spin_lock_irqsave(&dev->power.lock, flags);

if (delta_ns > 0 && dev->power.max_time_suspended_ns > 0) {
if (dev->power.max_time_suspended_ns > delta_ns)
dev->power.max_time_suspended_ns -= delta_ns;
else
dev->power.max_time_suspended_ns = 0;
}

spin_unlock_irqrestore(&dev->power.lock, flags);
}
2 changes: 0 additions & 2 deletions include/linux/pm.h
Original file line number Diff line number Diff line change
Expand Up @@ -544,8 +544,6 @@ struct dev_pm_info {
unsigned long active_jiffies;
unsigned long suspended_jiffies;
unsigned long accounting_timestamp;
ktime_t suspend_time;
s64 max_time_suspended_ns;
struct dev_pm_qos_request *pq_req;
#endif
struct pm_subsys_data *subsys_data; /* Owned by the subsystem. */
Expand Down
3 changes: 0 additions & 3 deletions include/linux/pm_runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,6 @@ static inline void pm_runtime_set_autosuspend_delay(struct device *dev,
static inline unsigned long pm_runtime_autosuspend_expiration(
struct device *dev) { return 0; }

static inline void pm_runtime_update_max_time_suspended(struct device *dev,
s64 delta_ns) {}

#endif /* !CONFIG_PM_RUNTIME */

static inline int pm_runtime_idle(struct device *dev)
Expand Down

0 comments on commit 76e267d

Please sign in to comment.