diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq.c')
-rw-r--r-- | drivers/cpufreq/cpufreq.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 6c9cbb9ebd1f..02d534da22dd 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1669,6 +1669,8 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
1669 | retval = cpufreq_driver->target(policy, target_freq, relation); | 1669 | retval = cpufreq_driver->target(policy, target_freq, relation); |
1670 | else if (cpufreq_driver->target_index) { | 1670 | else if (cpufreq_driver->target_index) { |
1671 | struct cpufreq_frequency_table *freq_table; | 1671 | struct cpufreq_frequency_table *freq_table; |
1672 | struct cpufreq_freqs freqs; | ||
1673 | bool notify; | ||
1672 | int index; | 1674 | int index; |
1673 | 1675 | ||
1674 | freq_table = cpufreq_frequency_get_table(policy->cpu); | 1676 | freq_table = cpufreq_frequency_get_table(policy->cpu); |
@@ -1684,10 +1686,42 @@ int __cpufreq_driver_target(struct cpufreq_policy *policy, | |||
1684 | goto out; | 1686 | goto out; |
1685 | } | 1687 | } |
1686 | 1688 | ||
1687 | if (freq_table[index].frequency == policy->cur) | 1689 | if (freq_table[index].frequency == policy->cur) { |
1688 | retval = 0; | 1690 | retval = 0; |
1689 | else | 1691 | goto out; |
1690 | retval = cpufreq_driver->target_index(policy, index); | 1692 | } |
1693 | |||
1694 | notify = !(cpufreq_driver->flags & CPUFREQ_ASYNC_NOTIFICATION); | ||
1695 | |||
1696 | if (notify) { | ||
1697 | freqs.old = policy->cur; | ||
1698 | freqs.new = freq_table[index].frequency; | ||
1699 | freqs.flags = 0; | ||
1700 | |||
1701 | pr_debug("%s: cpu: %d, oldfreq: %u, new freq: %u\n", | ||
1702 | __func__, policy->cpu, freqs.old, | ||
1703 | freqs.new); | ||
1704 | |||
1705 | cpufreq_notify_transition(policy, &freqs, | ||
1706 | CPUFREQ_PRECHANGE); | ||
1707 | } | ||
1708 | |||
1709 | retval = cpufreq_driver->target_index(policy, index); | ||
1710 | if (retval) | ||
1711 | pr_err("%s: Failed to change cpu frequency: %d\n", | ||
1712 | __func__, retval); | ||
1713 | |||
1714 | if (notify) { | ||
1715 | /* | ||
1716 | * Notify with old freq in case we failed to change | ||
1717 | * frequency | ||
1718 | */ | ||
1719 | if (retval) | ||
1720 | freqs.new = freqs.old; | ||
1721 | |||
1722 | cpufreq_notify_transition(policy, &freqs, | ||
1723 | CPUFREQ_POSTCHANGE); | ||
1724 | } | ||
1691 | } | 1725 | } |
1692 | 1726 | ||
1693 | out: | 1727 | out: |