diff options
author | Nancy Chen <Nancy.Chen@freescale.com> | 2010-04-06 23:12:19 -0500 |
---|---|---|
committer | Alejandro Gonzalez <alex.gonzalez@digi.com> | 2010-05-25 11:20:22 +0200 |
commit | 1711eb5cd1f217ba759cdfe211f38244b459110a (patch) | |
tree | 0f6be6c2e41df1af6d68d8a89daa16200ee49cbc /arch/arm/plat-mxs/clock.c | |
parent | 1b86778c6746d9173d8d00dd615318472f72ce60 (diff) |
ENGR00121905-2 MX28: Restructure cpufreq driver
Restructure cpufreq driver.
Fix clock count not right.
Fix cpu frequency can not be changed from 64 MHz.
Add cpufreq trig update feature.
Signed-off-by: Nancy Chen <Nancy.Chen@freescale.com>
Signed-off-by: Alejandro Gonzalez <alex.gonzalez@digi.com>
Diffstat (limited to 'arch/arm/plat-mxs/clock.c')
-rw-r--r-- | arch/arm/plat-mxs/clock.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/arch/arm/plat-mxs/clock.c b/arch/arm/plat-mxs/clock.c index a4bd61cb699e..9fecdbde49ad 100644 --- a/arch/arm/plat-mxs/clock.c +++ b/arch/arm/plat-mxs/clock.c @@ -24,9 +24,11 @@ #include <linux/clk.h> #include <linux/io.h> #include <linux/spinlock.h> +#include <linux/cpufreq.h> #include <mach/clock.h> +extern int cpufreq_trig_needed; static DEFINE_SPINLOCK(clockfw_lock); /* @@ -101,13 +103,20 @@ int clk_enable(struct clk *clk) { unsigned long flags; int ret = 0; + int pre_usage; if (clk == NULL || IS_ERR(clk)) return -EINVAL; spin_lock_irqsave(&clockfw_lock, flags); + pre_usage = clk->ref; ret = __clk_enable(clk); spin_unlock_irqrestore(&clockfw_lock, flags); + if ((clk->flags & CPU_FREQ_TRIG_UPDATE) + && (pre_usage == 0)) { + cpufreq_trig_needed = 1; + cpufreq_update_policy(0); + } return ret; } EXPORT_SYMBOL(clk_enable); @@ -123,13 +132,19 @@ void clk_disable(struct clk *clk) spin_lock_irqsave(&clockfw_lock, flags); __clk_disable(clk); spin_unlock_irqrestore(&clockfw_lock, flags); + if ((clk->flags & CPU_FREQ_TRIG_UPDATE) + && (clk->ref == 0)) { + cpufreq_trig_needed = 1; + cpufreq_update_policy(0); + } } EXPORT_SYMBOL(clk_disable); int clk_get_usecount(struct clk *clk) { if (clk == NULL || IS_ERR(clk)) - return -EINVAL; + return 0; + return clk->ref & CLK_EN_MASK; } EXPORT_SYMBOL(clk_get_usecount); |