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; | 	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) { | 	list_for_each_entry(link, &genpd->slave_links, slave_node) { | ||||||
| 		genpd_sd_counter_dec(link->master); | 		genpd_sd_counter_dec(link->master); | ||||||
| 		genpd_queue_power_off_work(link->master); | 		genpd_queue_power_off_work(link->master); | ||||||
|  | @ -515,9 +505,6 @@ static int pm_genpd_runtime_suspend(struct device *dev) | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		return 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 | 	 * If power.irq_safe is set, this routine will be run with interrupts | ||||||
| 	 * off, so it can't use mutexes. | 	 * 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; | 	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. |  * rpm_suspend - Carry out runtime suspend of given device. | ||||||
|  * @dev: Device to suspend. |  * @dev: Device to suspend. | ||||||
|  | @ -349,7 +308,6 @@ static int rpm_suspend(struct device *dev, int rpmflags) | ||||||
| { | { | ||||||
| 	int (*callback)(struct device *); | 	int (*callback)(struct device *); | ||||||
| 	struct device *parent = NULL; | 	struct device *parent = NULL; | ||||||
| 	struct rpm_qos_data qos; |  | ||||||
| 	int retval; | 	int retval; | ||||||
| 
 | 
 | ||||||
| 	trace_rpm_suspend(dev, rpmflags); | 	trace_rpm_suspend(dev, rpmflags); | ||||||
|  | @ -445,38 +403,14 @@ static int rpm_suspend(struct device *dev, int rpmflags) | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	qos.constraint_ns = __dev_pm_qos_read_value(dev); | 	if (__dev_pm_qos_read_value(dev) < 0) { | ||||||
| 	if (qos.constraint_ns < 0) { | 		/* Negative PM QoS constraint means "never suspend". */ | ||||||
| 		/* Negative constraint means "never suspend". */ |  | ||||||
| 		retval = -EPERM; | 		retval = -EPERM; | ||||||
| 		goto out; | 		goto out; | ||||||
| 	} | 	} | ||||||
| 	qos.constraint_ns *= NSEC_PER_USEC; |  | ||||||
| 	qos.time_now = ktime_get(); |  | ||||||
| 
 | 
 | ||||||
| 	__update_runtime_status(dev, RPM_SUSPENDING); | 	__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) | 	if (dev->pm_domain) | ||||||
| 		callback = dev->pm_domain->ops.runtime_suspend; | 		callback = dev->pm_domain->ops.runtime_suspend; | ||||||
| 	else if (dev->type && dev->type->pm) | 	else if (dev->type && dev->type->pm) | ||||||
|  | @ -529,8 +463,6 @@ static int rpm_suspend(struct device *dev, int rpmflags) | ||||||
| 
 | 
 | ||||||
|  fail: |  fail: | ||||||
| 	__update_runtime_status(dev, RPM_ACTIVE); | 	__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; | 	dev->power.deferred_resume = false; | ||||||
| 	wake_up_all(&dev->power.wait_queue); | 	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) | 	if (dev->power.no_callbacks) | ||||||
| 		goto no_callback;	/* Assume success. */ | 		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); | 	__update_runtime_status(dev, RPM_RESUMING); | ||||||
| 
 | 
 | ||||||
| 	if (dev->pm_domain) | 	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, | 	setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn, | ||||||
| 			(unsigned long)dev); | 			(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); | 	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) | 	if (dev->power.irq_safe && dev->parent) | ||||||
| 		pm_runtime_put_sync(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		active_jiffies; | ||||||
| 	unsigned long		suspended_jiffies; | 	unsigned long		suspended_jiffies; | ||||||
| 	unsigned long		accounting_timestamp; | 	unsigned long		accounting_timestamp; | ||||||
| 	ktime_t			suspend_time; |  | ||||||
| 	s64			max_time_suspended_ns; |  | ||||||
| 	struct dev_pm_qos_request *pq_req; | 	struct dev_pm_qos_request *pq_req; | ||||||
| #endif | #endif | ||||||
| 	struct pm_subsys_data	*subsys_data;  /* Owned by the subsystem. */ | 	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( | static inline unsigned long pm_runtime_autosuspend_expiration( | ||||||
| 				struct device *dev) { return 0; } | 				struct device *dev) { return 0; } | ||||||
| 
 | 
 | ||||||
| static inline void pm_runtime_update_max_time_suspended(struct device *dev, |  | ||||||
| 							s64 delta_ns) {} |  | ||||||
| 
 |  | ||||||
| #endif /* !CONFIG_PM_RUNTIME */ | #endif /* !CONFIG_PM_RUNTIME */ | ||||||
| 
 | 
 | ||||||
| static inline int pm_runtime_idle(struct device *dev) | static inline int pm_runtime_idle(struct device *dev) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Rafael J. Wysocki
						Rafael J. Wysocki