forked from mirrors/linux
		
	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
					
				
					 4 changed files with 2 additions and 119 deletions
				
			
		|  | @ -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 a new issue
	
	 Rafael J. Wysocki
						Rafael J. Wysocki