diff options
| author | Rafael J. Wysocki <rjw@sisk.pl> | 2012-04-29 22:54:36 +0200 | 
|---|---|---|
| committer | Rafael J. Wysocki <rjw@sisk.pl> | 2012-05-01 21:28:38 +0200 | 
| commit | 76e267d822f2913893ad210ba431607aa8e2af94 (patch) | |
| tree | ce3a821135a398748063f29cb064147d27b40a47 | |
| parent | dd8683e97f12609fb3f8c4318628f0d246542f89 (diff) | |
| download | olio-linux-3.10-76e267d822f2913893ad210ba431607aa8e2af94.tar.xz olio-linux-3.10-76e267d822f2913893ad210ba431607aa8e2af94.zip | |
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>
| -rw-r--r-- | drivers/base/power/domain.c | 13 | ||||
| -rw-r--r-- | drivers/base/power/runtime.c | 103 | ||||
| -rw-r--r-- | include/linux/pm.h | 2 | ||||
| -rw-r--r-- | include/linux/pm_runtime.h | 3 | 
4 files changed, 2 insertions, 119 deletions
| diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index d03a8c7ad84..45c2b7f0fe3 100644 --- a/drivers/base/power/domain.c +++ b/drivers/base/power/domain.c @@ -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. diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index bd0f3949bcf..59894873a3b 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -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); -} diff --git a/include/linux/pm.h b/include/linux/pm.h index 715305e0512..f067e60a383 100644 --- a/include/linux/pm.h +++ b/include/linux/pm.h @@ -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. */ diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h index 609daae7a01..f271860c78d 100644 --- a/include/linux/pm_runtime.h +++ b/include/linux/pm_runtime.h @@ -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) |