diff options
Diffstat (limited to 'kernel/power/qos.c')
| -rw-r--r-- | kernel/power/qos.c | 44 | 
1 files changed, 16 insertions, 28 deletions
diff --git a/kernel/power/qos.c b/kernel/power/qos.c index a394297f8b2..884b7705886 100644 --- a/kernel/power/qos.c +++ b/kernel/power/qos.c @@ -66,6 +66,7 @@ static struct pm_qos_constraints cpu_dma_constraints = {  	.list = PLIST_HEAD_INIT(cpu_dma_constraints.list),  	.target_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,  	.default_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE, +	.no_constraint_value = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE,  	.type = PM_QOS_MIN,  	.notifiers = &cpu_dma_lat_notifier,  }; @@ -79,6 +80,7 @@ static struct pm_qos_constraints network_lat_constraints = {  	.list = PLIST_HEAD_INIT(network_lat_constraints.list),  	.target_value = PM_QOS_NETWORK_LAT_DEFAULT_VALUE,  	.default_value = PM_QOS_NETWORK_LAT_DEFAULT_VALUE, +	.no_constraint_value = PM_QOS_NETWORK_LAT_DEFAULT_VALUE,  	.type = PM_QOS_MIN,  	.notifiers = &network_lat_notifier,  }; @@ -93,6 +95,7 @@ static struct pm_qos_constraints network_tput_constraints = {  	.list = PLIST_HEAD_INIT(network_tput_constraints.list),  	.target_value = PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE,  	.default_value = PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE, +	.no_constraint_value = PM_QOS_NETWORK_THROUGHPUT_DEFAULT_VALUE,  	.type = PM_QOS_MAX,  	.notifiers = &network_throughput_notifier,  }; @@ -128,7 +131,7 @@ static const struct file_operations pm_qos_power_fops = {  static inline int pm_qos_get_value(struct pm_qos_constraints *c)  {  	if (plist_head_empty(&c->list)) -		return c->default_value; +		return c->no_constraint_value;  	switch (c->type) {  	case PM_QOS_MIN: @@ -170,6 +173,7 @@ int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,  {  	unsigned long flags;  	int prev_value, curr_value, new_value; +	int ret;  	spin_lock_irqsave(&pm_qos_lock, flags);  	prev_value = pm_qos_get_value(c); @@ -205,13 +209,15 @@ int pm_qos_update_target(struct pm_qos_constraints *c, struct plist_node *node,  	trace_pm_qos_update_target(action, prev_value, curr_value);  	if (prev_value != curr_value) { -		blocking_notifier_call_chain(c->notifiers, -					     (unsigned long)curr_value, -					     NULL); -		return 1; +		ret = 1; +		if (c->notifiers) +			blocking_notifier_call_chain(c->notifiers, +						     (unsigned long)curr_value, +						     NULL);  	} else { -		return 0; +		ret = 0;  	} +	return ret;  }  /** @@ -558,30 +564,12 @@ static ssize_t pm_qos_power_write(struct file *filp, const char __user *buf,  	if (count == sizeof(s32)) {  		if (copy_from_user(&value, buf, sizeof(s32)))  			return -EFAULT; -	} else if (count <= 11) { /* ASCII perhaps? */ -		char ascii_value[11]; -		unsigned long int ulval; +	} else {  		int ret; -		if (copy_from_user(ascii_value, buf, count)) -			return -EFAULT; - -		if (count > 10) { -			if (ascii_value[10] == '\n') -				ascii_value[10] = '\0'; -			else -				return -EINVAL; -		} else { -			ascii_value[count] = '\0'; -		} -		ret = kstrtoul(ascii_value, 16, &ulval); -		if (ret) { -			pr_debug("%s, 0x%lx, 0x%x\n", ascii_value, ulval, ret); -			return -EINVAL; -		} -		value = (s32)lower_32_bits(ulval); -	} else { -		return -EINVAL; +		ret = kstrtos32_from_user(buf, count, 16, &value); +		if (ret) +			return ret;  	}  	req = filp->private_data;  | 
