diff options
| author | Takashi Iwai <tiwai@suse.de> | 2012-05-21 12:45:18 +0200 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2012-05-21 12:45:18 +0200 | 
| commit | 775b2449bdba7c97dda9f274c92bf7a83dac4142 (patch) | |
| tree | b4bee45c13762ea93642b1e38c62de454e51cf5d /kernel/power/qos.c | |
| parent | 21363cf0ca5c9c62e34e37422fb1d13d70d3de3c (diff) | |
| parent | 5fb86e5d4a951ddb0474cdfd809380c8e2a8d101 (diff) | |
| download | olio-linux-3.10-775b2449bdba7c97dda9f274c92bf7a83dac4142.tar.xz olio-linux-3.10-775b2449bdba7c97dda9f274c92bf7a83dac4142.zip  | |
Merge branch 'topic/asoc' into for-linus
Diffstat (limited to 'kernel/power/qos.c')
| -rw-r--r-- | kernel/power/qos.c | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/kernel/power/qos.c b/kernel/power/qos.c index d6d6dbd1ecc..6a031e68402 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c @@ -230,6 +230,21 @@ int pm_qos_request_active(struct pm_qos_request *req)  EXPORT_SYMBOL_GPL(pm_qos_request_active);  /** + * pm_qos_work_fn - the timeout handler of pm_qos_update_request_timeout + * @work: work struct for the delayed work (timeout) + * + * This cancels the timeout request by falling back to the default at timeout. + */ +static void pm_qos_work_fn(struct work_struct *work) +{ +	struct pm_qos_request *req = container_of(to_delayed_work(work), +						  struct pm_qos_request, +						  work); + +	pm_qos_update_request(req, PM_QOS_DEFAULT_VALUE); +} + +/**   * pm_qos_add_request - inserts new qos request into the list   * @req: pointer to a preallocated handle   * @pm_qos_class: identifies which list of qos request to use @@ -253,6 +268,7 @@ void pm_qos_add_request(struct pm_qos_request *req,  		return;  	}  	req->pm_qos_class = pm_qos_class; +	INIT_DELAYED_WORK(&req->work, pm_qos_work_fn);  	pm_qos_update_target(pm_qos_array[pm_qos_class]->constraints,  			     &req->node, PM_QOS_ADD_REQ, value);  } @@ -279,6 +295,9 @@ void pm_qos_update_request(struct pm_qos_request *req,  		return;  	} +	if (delayed_work_pending(&req->work)) +		cancel_delayed_work_sync(&req->work); +  	if (new_value != req->node.prio)  		pm_qos_update_target(  			pm_qos_array[req->pm_qos_class]->constraints, @@ -287,6 +306,34 @@ void pm_qos_update_request(struct pm_qos_request *req,  EXPORT_SYMBOL_GPL(pm_qos_update_request);  /** + * pm_qos_update_request_timeout - modifies an existing qos request temporarily. + * @req : handle to list element holding a pm_qos request to use + * @new_value: defines the temporal qos request + * @timeout_us: the effective duration of this qos request in usecs. + * + * After timeout_us, this qos request is cancelled automatically. + */ +void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value, +				   unsigned long timeout_us) +{ +	if (!req) +		return; +	if (WARN(!pm_qos_request_active(req), +		 "%s called for unknown object.", __func__)) +		return; + +	if (delayed_work_pending(&req->work)) +		cancel_delayed_work_sync(&req->work); + +	if (new_value != req->node.prio) +		pm_qos_update_target( +			pm_qos_array[req->pm_qos_class]->constraints, +			&req->node, PM_QOS_UPDATE_REQ, new_value); + +	schedule_delayed_work(&req->work, usecs_to_jiffies(timeout_us)); +} + +/**   * pm_qos_remove_request - modifies an existing qos request   * @req: handle to request list element   * @@ -305,6 +352,9 @@ void pm_qos_remove_request(struct pm_qos_request *req)  		return;  	} +	if (delayed_work_pending(&req->work)) +		cancel_delayed_work_sync(&req->work); +  	pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints,  			     &req->node, PM_QOS_REMOVE_REQ,  			     PM_QOS_DEFAULT_VALUE);  |