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) | |||
| 268 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE); | 268 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_PRECHANGE); |
| 269 | 269 | ||
| 270 | err = devfreq->profile->target(devfreq->dev.parent, &freq, flags); | 270 | err = devfreq->profile->target(devfreq->dev.parent, &freq, flags); |
| 271 | if (err) | 271 | if (err) { |
| 272 | freqs.new = cur_freq; | ||
| 273 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); | ||
| 272 | return err; | 274 | return err; |
| 275 | } | ||
| 273 | 276 | ||
| 274 | freqs.new = freq; | 277 | freqs.new = freq; |
| 275 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); | 278 | devfreq_notify_transition(devfreq, &freqs, DEVFREQ_POSTCHANGE); |
| @@ -552,6 +555,7 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
| 552 | devfreq->profile = profile; | 555 | devfreq->profile = profile; |
| 553 | strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN); | 556 | strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN); |
| 554 | devfreq->previous_freq = profile->initial_freq; | 557 | devfreq->previous_freq = profile->initial_freq; |
| 558 | devfreq->last_status.current_frequency = profile->initial_freq; | ||
| 555 | devfreq->data = data; | 559 | devfreq->data = data; |
| 556 | devfreq->nb.notifier_call = devfreq_notifier_call; | 560 | devfreq->nb.notifier_call = devfreq_notifier_call; |
| 557 | 561 | ||
| @@ -561,23 +565,22 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
| 561 | mutex_lock(&devfreq->lock); | 565 | mutex_lock(&devfreq->lock); |
| 562 | } | 566 | } |
| 563 | 567 | ||
| 564 | devfreq->trans_table = devm_kzalloc(dev, sizeof(unsigned int) * | ||
| 565 | devfreq->profile->max_state * | ||
| 566 | devfreq->profile->max_state, | ||
| 567 | GFP_KERNEL); | ||
| 568 | devfreq->time_in_state = devm_kzalloc(dev, sizeof(unsigned long) * | ||
| 569 | devfreq->profile->max_state, | ||
| 570 | GFP_KERNEL); | ||
| 571 | devfreq->last_stat_updated = jiffies; | ||
| 572 | |||
| 573 | dev_set_name(&devfreq->dev, "%s", dev_name(dev)); | 568 | dev_set_name(&devfreq->dev, "%s", dev_name(dev)); |
| 574 | err = device_register(&devfreq->dev); | 569 | err = device_register(&devfreq->dev); |
| 575 | if (err) { | 570 | if (err) { |
| 576 | put_device(&devfreq->dev); | ||
| 577 | mutex_unlock(&devfreq->lock); | 571 | mutex_unlock(&devfreq->lock); |
| 578 | goto err_out; | 572 | goto err_out; |
| 579 | } | 573 | } |
| 580 | 574 | ||
| 575 | devfreq->trans_table = devm_kzalloc(&devfreq->dev, sizeof(unsigned int) * | ||
| 576 | devfreq->profile->max_state * | ||
| 577 | devfreq->profile->max_state, | ||
| 578 | GFP_KERNEL); | ||
| 579 | devfreq->time_in_state = devm_kzalloc(&devfreq->dev, sizeof(unsigned long) * | ||
| 580 | devfreq->profile->max_state, | ||
| 581 | GFP_KERNEL); | ||
| 582 | devfreq->last_stat_updated = jiffies; | ||
| 583 | |||
| 581 | srcu_init_notifier_head(&devfreq->transition_notifier_list); | 584 | srcu_init_notifier_head(&devfreq->transition_notifier_list); |
| 582 | 585 | ||
| 583 | mutex_unlock(&devfreq->lock); | 586 | mutex_unlock(&devfreq->lock); |
| @@ -603,7 +606,6 @@ struct devfreq *devfreq_add_device(struct device *dev, | |||
| 603 | err_init: | 606 | err_init: |
| 604 | list_del(&devfreq->node); | 607 | list_del(&devfreq->node); |
| 605 | device_unregister(&devfreq->dev); | 608 | device_unregister(&devfreq->dev); |
| 606 | kfree(devfreq); | ||
| 607 | err_out: | 609 | err_out: |
| 608 | return ERR_PTR(err); | 610 | return ERR_PTR(err); |
| 609 | } | 611 | } |
| @@ -621,7 +623,6 @@ int devfreq_remove_device(struct devfreq *devfreq) | |||
| 621 | return -EINVAL; | 623 | return -EINVAL; |
| 622 | 624 | ||
| 623 | device_unregister(&devfreq->dev); | 625 | device_unregister(&devfreq->dev); |
| 624 | put_device(&devfreq->dev); | ||
| 625 | 626 | ||
| 626 | return 0; | 627 | return 0; |
| 627 | } | 628 | } |
