aboutsummaryrefslogtreecommitdiff
path: root/drivers/cpufreq/speedstep-lib.c
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2015-02-09 13:38:17 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2015-02-12 02:02:52 +0100
commitd4d4eda23794c701442e55129dd4f8f2fefd5e4d (patch)
tree26b68b8c7413e3bf9503a101414e9fd2f6fecf12 /drivers/cpufreq/speedstep-lib.c
parentc488ea461359483976ff7d4838cce5c0138c6b3e (diff)
downloadleg-kernel-d4d4eda23794c701442e55129dd4f8f2fefd5e4d.tar.gz
cpufreq: speedstep-smi: enable interrupts when waiting
On Dell Latitude C600 laptop with Pentium 3 850MHz processor, the speedstep-smi driver sometimes loads and sometimes doesn't load with "change to state X failed" message. The hardware sometimes refuses to change frequency and in this case, we need to retry later. I found out that we need to enable interrupts while waiting. When we enable interrupts, the hardware blockage that prevents frequency transition resolves and the transition is possible. With disabled interrupts, the blockage doesn't resolve (no matter how long do we wait). The exact reasons for this hardware behavior are unknown. This patch enables interrupts in the function speedstep_set_state that can be called with disabled interrupts. However, this function is called with disabled interrupts only from speedstep_get_freqs, so it shouldn't cause any problem. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com Cc: All applicable <stable@vger.kernel.org> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/cpufreq/speedstep-lib.c')
-rw-r--r--drivers/cpufreq/speedstep-lib.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/cpufreq/speedstep-lib.c b/drivers/cpufreq/speedstep-lib.c
index 7047821a7f8a..4ab7a2156672 100644
--- a/drivers/cpufreq/speedstep-lib.c
+++ b/drivers/cpufreq/speedstep-lib.c
@@ -400,6 +400,7 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,
pr_debug("previous speed is %u\n", prev_speed);
+ preempt_disable();
local_irq_save(flags);
/* switch to low state */
@@ -464,6 +465,8 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,
out:
local_irq_restore(flags);
+ preempt_enable();
+
return ret;
}
EXPORT_SYMBOL_GPL(speedstep_get_freqs);