|
@@ -27,6 +27,7 @@
|
|
|
#include <linux/mutex.h>
|
|
|
#include <linux/slab.h>
|
|
|
#include <linux/suspend.h>
|
|
|
+#include <linux/syscore_ops.h>
|
|
|
#include <linux/tick.h>
|
|
|
#include <trace/events/power.h>
|
|
|
|
|
@@ -2556,6 +2557,14 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
|
|
|
|
|
|
+/*
|
|
|
+ * Stop cpufreq at shutdown to make sure it isn't holding any locks
|
|
|
+ * or mutexes when secondary CPUs are halted.
|
|
|
+ */
|
|
|
+static struct syscore_ops cpufreq_syscore_ops = {
|
|
|
+ .shutdown = cpufreq_suspend,
|
|
|
+};
|
|
|
+
|
|
|
static int __init cpufreq_core_init(void)
|
|
|
{
|
|
|
if (cpufreq_disabled())
|
|
@@ -2564,6 +2573,8 @@ static int __init cpufreq_core_init(void)
|
|
|
cpufreq_global_kobject = kobject_create();
|
|
|
BUG_ON(!cpufreq_global_kobject);
|
|
|
|
|
|
+ register_syscore_ops(&cpufreq_syscore_ops);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
core_initcall(cpufreq_core_init);
|