|
@@ -26,7 +26,6 @@
|
|
#include <linux/err.h>
|
|
#include <linux/err.h>
|
|
#include <linux/clk.h>
|
|
#include <linux/clk.h>
|
|
#include <linux/io.h>
|
|
#include <linux/io.h>
|
|
-#include <linux/suspend.h>
|
|
|
|
|
|
|
|
static struct cpufreq_frequency_table freq_table[] = {
|
|
static struct cpufreq_frequency_table freq_table[] = {
|
|
{ .frequency = 216000 },
|
|
{ .frequency = 216000 },
|
|
@@ -47,9 +46,6 @@ static struct clk *pll_x_clk;
|
|
static struct clk *pll_p_clk;
|
|
static struct clk *pll_p_clk;
|
|
static struct clk *emc_clk;
|
|
static struct clk *emc_clk;
|
|
|
|
|
|
-static DEFINE_MUTEX(tegra_cpu_lock);
|
|
|
|
-static bool is_suspended;
|
|
|
|
-
|
|
|
|
static int tegra_cpu_clk_set_rate(unsigned long rate)
|
|
static int tegra_cpu_clk_set_rate(unsigned long rate)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
@@ -112,42 +108,9 @@ static int tegra_update_cpu_speed(struct cpufreq_policy *policy,
|
|
|
|
|
|
static int tegra_target(struct cpufreq_policy *policy, unsigned int index)
|
|
static int tegra_target(struct cpufreq_policy *policy, unsigned int index)
|
|
{
|
|
{
|
|
- int ret = -EBUSY;
|
|
|
|
-
|
|
|
|
- mutex_lock(&tegra_cpu_lock);
|
|
|
|
-
|
|
|
|
- if (!is_suspended)
|
|
|
|
- ret = tegra_update_cpu_speed(policy,
|
|
|
|
- freq_table[index].frequency);
|
|
|
|
-
|
|
|
|
- mutex_unlock(&tegra_cpu_lock);
|
|
|
|
- return ret;
|
|
|
|
|
|
+ return tegra_update_cpu_speed(policy, freq_table[index].frequency);
|
|
}
|
|
}
|
|
|
|
|
|
-static int tegra_pm_notify(struct notifier_block *nb, unsigned long event,
|
|
|
|
- void *dummy)
|
|
|
|
-{
|
|
|
|
- mutex_lock(&tegra_cpu_lock);
|
|
|
|
- if (event == PM_SUSPEND_PREPARE) {
|
|
|
|
- struct cpufreq_policy *policy = cpufreq_cpu_get(0);
|
|
|
|
- is_suspended = true;
|
|
|
|
- pr_info("Tegra cpufreq suspend: setting frequency to %d kHz\n",
|
|
|
|
- freq_table[0].frequency);
|
|
|
|
- if (clk_get_rate(cpu_clk) / 1000 != freq_table[0].frequency)
|
|
|
|
- tegra_update_cpu_speed(policy, freq_table[0].frequency);
|
|
|
|
- cpufreq_cpu_put(policy);
|
|
|
|
- } else if (event == PM_POST_SUSPEND) {
|
|
|
|
- is_suspended = false;
|
|
|
|
- }
|
|
|
|
- mutex_unlock(&tegra_cpu_lock);
|
|
|
|
-
|
|
|
|
- return NOTIFY_OK;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static struct notifier_block tegra_cpu_pm_notifier = {
|
|
|
|
- .notifier_call = tegra_pm_notify,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
static int tegra_cpu_init(struct cpufreq_policy *policy)
|
|
static int tegra_cpu_init(struct cpufreq_policy *policy)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
@@ -166,10 +129,8 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
- if (policy->cpu == 0)
|
|
|
|
- register_pm_notifier(&tegra_cpu_pm_notifier);
|
|
|
|
-
|
|
|
|
policy->clk = cpu_clk;
|
|
policy->clk = cpu_clk;
|
|
|
|
+ policy->suspend_freq = freq_table[0].frequency;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -190,6 +151,9 @@ static struct cpufreq_driver tegra_cpufreq_driver = {
|
|
.exit = tegra_cpu_exit,
|
|
.exit = tegra_cpu_exit,
|
|
.name = "tegra",
|
|
.name = "tegra",
|
|
.attr = cpufreq_generic_attr,
|
|
.attr = cpufreq_generic_attr,
|
|
|
|
+#ifdef CONFIG_PM
|
|
|
|
+ .suspend = cpufreq_generic_suspend,
|
|
|
|
+#endif
|
|
};
|
|
};
|
|
|
|
|
|
static int __init tegra_cpufreq_init(void)
|
|
static int __init tegra_cpufreq_init(void)
|