|
@@ -34,6 +34,8 @@
|
|
|
struct davinci_cpufreq {
|
|
|
struct device *dev;
|
|
|
struct clk *armclk;
|
|
|
+ struct clk *asyncclk;
|
|
|
+ unsigned long asyncrate;
|
|
|
};
|
|
|
static struct davinci_cpufreq cpufreq;
|
|
|
|
|
@@ -114,6 +116,12 @@ static int davinci_target(struct cpufreq_policy *policy,
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
+ if (cpufreq.asyncclk) {
|
|
|
+ ret = clk_set_rate(cpufreq.asyncclk, cpufreq.asyncrate);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
/* if moving to lower freq, lower the voltage after lowering freq */
|
|
|
if (pdata->set_voltage && freqs.new < freqs.old)
|
|
|
pdata->set_voltage(idx);
|
|
@@ -191,6 +199,7 @@ static struct cpufreq_driver davinci_driver = {
|
|
|
static int __init davinci_cpufreq_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct davinci_cpufreq_config *pdata = pdev->dev.platform_data;
|
|
|
+ struct clk *asyncclk;
|
|
|
|
|
|
if (!pdata)
|
|
|
return -EINVAL;
|
|
@@ -205,6 +214,12 @@ static int __init davinci_cpufreq_probe(struct platform_device *pdev)
|
|
|
return PTR_ERR(cpufreq.armclk);
|
|
|
}
|
|
|
|
|
|
+ asyncclk = clk_get(cpufreq.dev, "async");
|
|
|
+ if (!IS_ERR(asyncclk)) {
|
|
|
+ cpufreq.asyncclk = asyncclk;
|
|
|
+ cpufreq.asyncrate = clk_get_rate(asyncclk);
|
|
|
+ }
|
|
|
+
|
|
|
return cpufreq_register_driver(&davinci_driver);
|
|
|
}
|
|
|
|
|
@@ -212,6 +227,9 @@ static int __exit davinci_cpufreq_remove(struct platform_device *pdev)
|
|
|
{
|
|
|
clk_put(cpufreq.armclk);
|
|
|
|
|
|
+ if (cpufreq.asyncclk)
|
|
|
+ clk_put(cpufreq.asyncclk);
|
|
|
+
|
|
|
return cpufreq_unregister_driver(&davinci_driver);
|
|
|
}
|
|
|
|