diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-02 21:32:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-02 21:32:35 -0400 |
commit | 16642a2e7be23bbda013fc32d8f6c68982eab603 (patch) | |
tree | 346ae485f485f6901e5d8150f0d34d178a7dd448 /drivers/cpufreq/omap-cpufreq.c | |
parent | 51562cba98939da0a1d10fe7c25359b77a069033 (diff) | |
parent | b9142167a2bb979b58b98ffcd928a311b55cbd9f (diff) |
Merge tag 'pm-for-3.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull power management updates from Rafael J Wysocki:
- Improved system suspend/resume and runtime PM handling for the SH
TMU, CMT and MTU2 clock event devices (also used by ARM/shmobile).
- Generic PM domains framework extensions related to cpuidle support
and domain objects lookup using names.
- ARM/shmobile power management updates including improved support for
the SH7372's A4S power domain containing the CPU core.
- cpufreq changes related to AMD CPUs support from Matthew Garrett,
Andre Przywara and Borislav Petkov.
- cpu0 cpufreq driver from Shawn Guo.
- cpufreq governor fixes related to the relaxing of limit from Michal
Pecio.
- OMAP cpufreq updates from Axel Lin and Richard Zhao.
- cpuidle ladder governor fixes related to the disabling of states from
Carsten Emde and me.
- Runtime PM core updates related to the interactions with the system
suspend core from Alan Stern and Kevin Hilman.
- Wakeup sources modification allowing more helper functions to be
called from interrupt context from John Stultz and additional
diagnostic code from Todd Poynor.
- System suspend error code path fix from Feng Hong.
Fixed up conflicts in cpufreq/powernow-k8 that stemmed from the
workqueue fixes conflicting fairly badly with the removal of support for
hardware P-state chips. The changes were independent but somewhat
intertwined.
* tag 'pm-for-3.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (76 commits)
Revert "PM QoS: Use spinlock in the per-device PM QoS constraints code"
PM / Runtime: let rpm_resume() succeed if RPM_ACTIVE, even when disabled, v2
cpuidle: rename function name "__cpuidle_register_driver", v2
cpufreq: OMAP: Check IS_ERR() instead of NULL for omap_device_get_by_hwmod_name
cpuidle: remove some empty lines
PM: Prevent runtime suspend during system resume
PM QoS: Use spinlock in the per-device PM QoS constraints code
PM / Sleep: use resume event when call dpm_resume_early
cpuidle / ACPI : move cpuidle_device field out of the acpi_processor_power structure
ACPI / processor: remove pointless variable initialization
ACPI / processor: remove unused function parameter
cpufreq: OMAP: remove loops_per_jiffy recalculate for smp
sections: fix section conflicts in drivers/cpufreq
cpufreq: conservative: update frequency when limits are relaxed
cpufreq / ondemand: update frequency when limits are relaxed
properly __init-annotate pm_sysrq_init()
cpufreq: Add a generic cpufreq-cpu0 driver
PM / OPP: Initialize OPP table from device tree
ARM: add cpufreq transiton notifier to adjust loops_per_jiffy for smp
cpufreq: Remove support for hardware P-state chips from powernow-k8
...
Diffstat (limited to 'drivers/cpufreq/omap-cpufreq.c')
-rw-r--r-- | drivers/cpufreq/omap-cpufreq.c | 39 |
1 files changed, 2 insertions, 37 deletions
diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c index b47034e650a5..65f8e9a54975 100644 --- a/drivers/cpufreq/omap-cpufreq.c +++ b/drivers/cpufreq/omap-cpufreq.c | |||
@@ -40,16 +40,6 @@ | |||
40 | /* OPP tolerance in percentage */ | 40 | /* OPP tolerance in percentage */ |
41 | #define OPP_TOLERANCE 4 | 41 | #define OPP_TOLERANCE 4 |
42 | 42 | ||
43 | #ifdef CONFIG_SMP | ||
44 | struct lpj_info { | ||
45 | unsigned long ref; | ||
46 | unsigned int freq; | ||
47 | }; | ||
48 | |||
49 | static DEFINE_PER_CPU(struct lpj_info, lpj_ref); | ||
50 | static struct lpj_info global_lpj_ref; | ||
51 | #endif | ||
52 | |||
53 | static struct cpufreq_frequency_table *freq_table; | 43 | static struct cpufreq_frequency_table *freq_table; |
54 | static atomic_t freq_table_users = ATOMIC_INIT(0); | 44 | static atomic_t freq_table_users = ATOMIC_INIT(0); |
55 | static struct clk *mpu_clk; | 45 | static struct clk *mpu_clk; |
@@ -161,31 +151,6 @@ static int omap_target(struct cpufreq_policy *policy, | |||
161 | } | 151 | } |
162 | 152 | ||
163 | freqs.new = omap_getspeed(policy->cpu); | 153 | freqs.new = omap_getspeed(policy->cpu); |
164 | #ifdef CONFIG_SMP | ||
165 | /* | ||
166 | * Note that loops_per_jiffy is not updated on SMP systems in | ||
167 | * cpufreq driver. So, update the per-CPU loops_per_jiffy value | ||
168 | * on frequency transition. We need to update all dependent CPUs. | ||
169 | */ | ||
170 | for_each_cpu(i, policy->cpus) { | ||
171 | struct lpj_info *lpj = &per_cpu(lpj_ref, i); | ||
172 | if (!lpj->freq) { | ||
173 | lpj->ref = per_cpu(cpu_data, i).loops_per_jiffy; | ||
174 | lpj->freq = freqs.old; | ||
175 | } | ||
176 | |||
177 | per_cpu(cpu_data, i).loops_per_jiffy = | ||
178 | cpufreq_scale(lpj->ref, lpj->freq, freqs.new); | ||
179 | } | ||
180 | |||
181 | /* And don't forget to adjust the global one */ | ||
182 | if (!global_lpj_ref.freq) { | ||
183 | global_lpj_ref.ref = loops_per_jiffy; | ||
184 | global_lpj_ref.freq = freqs.old; | ||
185 | } | ||
186 | loops_per_jiffy = cpufreq_scale(global_lpj_ref.ref, global_lpj_ref.freq, | ||
187 | freqs.new); | ||
188 | #endif | ||
189 | 154 | ||
190 | done: | 155 | done: |
191 | /* notifiers */ | 156 | /* notifiers */ |
@@ -301,9 +266,9 @@ static int __init omap_cpufreq_init(void) | |||
301 | } | 266 | } |
302 | 267 | ||
303 | mpu_dev = omap_device_get_by_hwmod_name("mpu"); | 268 | mpu_dev = omap_device_get_by_hwmod_name("mpu"); |
304 | if (!mpu_dev) { | 269 | if (IS_ERR(mpu_dev)) { |
305 | pr_warning("%s: unable to get the mpu device\n", __func__); | 270 | pr_warning("%s: unable to get the mpu device\n", __func__); |
306 | return -EINVAL; | 271 | return PTR_ERR(mpu_dev); |
307 | } | 272 | } |
308 | 273 | ||
309 | mpu_reg = regulator_get(mpu_dev, "vcc"); | 274 | mpu_reg = regulator_get(mpu_dev, "vcc"); |