mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 23:21:31 +00:00
PM / Runtime: Remove device fields related to suspend time, v2
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>
This commit is contained in:
parent
dd8683e97f
commit
76e267d822
@ -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);
|
||||
@ -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.
|
||||
|
@ -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.
|
||||
@ -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);
|
||||
@ -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)
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
@ -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. */
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user