diff options
Diffstat (limited to 'drivers/devfreq/devfreq.c')
| -rw-r--r-- | drivers/devfreq/devfreq.c | 27 | 
1 files changed, 14 insertions, 13 deletions
diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c index 1d6c803804d5..e92418facc92 100644 --- a/drivers/devfreq/devfreq.c +++ b/drivers/devfreq/devfreq.c @@ -268,8 +268,11 @@ int update_devfreq(struct devfreq *devfreq)  	devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE);  	err = devfreq->profile->target(devfreq->dev.parent, &freq, flags); -	if (err) +	if (err) { +		freqs.new = cur_freq; +		devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE);  		return err; +	}  	freqs.new = freq;  	devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); @@ -552,6 +555,7 @@ struct devfreq *devfreq_add_device(struct device *dev,  	devfreq->profile = profile;  	strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);  	devfreq->previous_freq = profile->initial_freq; +	devfreq->last_status.current_frequency = profile->initial_freq;  	devfreq->data = data;  	devfreq->nb.notifier_call = devfreq_notifier_call; @@ -561,23 +565,22 @@ struct devfreq *devfreq_add_device(struct device *dev,  		mutex_lock(&devfreq->lock);  	} -	devfreq->trans_table =	devm_kzalloc(dev, sizeof(unsigned int) * -						devfreq->profile->max_state * -						devfreq->profile->max_state, -						GFP_KERNEL); -	devfreq->time_in_state = devm_kzalloc(dev, sizeof(unsigned long) * -						devfreq->profile->max_state, -						GFP_KERNEL); -	devfreq->last_stat_updated = jiffies; -  	dev_set_name(&devfreq->dev, "%s", dev_name(dev));  	err = device_register(&devfreq->dev);  	if (err) { -		put_device(&devfreq->dev);  		mutex_unlock(&devfreq->lock);  		goto err_out;  	} +	devfreq->trans_table =	devm_kzalloc(&devfreq->dev, sizeof(unsigned int) * +						devfreq->profile->max_state * +						devfreq->profile->max_state, +						GFP_KERNEL); +	devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) * +						devfreq->profile->max_state, +						GFP_KERNEL); +	devfreq->last_stat_updated = jiffies; +  	srcu_init_notifier_head(&devfreq->transition_notifier_list);  	mutex_unlock(&devfreq->lock); @@ -603,7 +606,6 @@ struct devfreq *devfreq_add_device(struct device *dev,  err_init:  	list_del(&devfreq->node);  	device_unregister(&devfreq->dev); -	kfree(devfreq);  err_out:  	return ERR_PTR(err);  } @@ -621,7 +623,6 @@ int devfreq_remove_device(struct devfreq *devfreq)  		return -EINVAL;  	device_unregister(&devfreq->dev); -	put_device(&devfreq->dev);  	return 0;  }  |