aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ux500/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ux500/clock.c')
-rw-r--r--arch/arm/mach-ux500/clock.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c
index 7d107be63eb4..e832664d1bd9 100644
--- a/arch/arm/mach-ux500/clock.c
+++ b/arch/arm/mach-ux500/clock.c
@@ -14,6 +14,7 @@
14#include <linux/clk.h> 14#include <linux/clk.h>
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/clkdev.h> 16#include <linux/clkdev.h>
17#include <linux/cpufreq.h>
17 18
18#include <plat/mtu.h> 19#include <plat/mtu.h>
19#include <mach/hardware.h> 20#include <mach/hardware.h>
@@ -742,6 +743,51 @@ err_out:
742late_initcall(clk_debugfs_init); 743late_initcall(clk_debugfs_init);
743#endif /* defined(CONFIG_DEBUG_FS) */ 744#endif /* defined(CONFIG_DEBUG_FS) */
744 745
746unsigned long clk_smp_twd_rate = 400000000;
747
748unsigned long clk_smp_twd_get_rate(struct clk *clk)
749{
750 return clk_smp_twd_rate;
751}
752
753static struct clk clk_smp_twd = {
754 .get_rate = clk_smp_twd_get_rate,
755 .name = "smp_twd",
756};
757
758static struct clk_lookup clk_smp_twd_lookup = {
759 .dev_id = "smp_twd",
760 .clk = &clk_smp_twd,
761};
762
763#ifdef CONFIG_CPU_FREQ
764
765static int clk_twd_cpufreq_transition(struct notifier_block *nb,
766 unsigned long state, void *data)
767{
768 struct cpufreq_freqs *f = data;
769
770 if (state == CPUFREQ_PRECHANGE) {
771 /* Save frequency in simple Hz */
772 clk_smp_twd_rate = f->new * 1000;
773 }
774
775 return NOTIFY_OK;
776}
777
778static struct notifier_block clk_twd_cpufreq_nb = {
779 .notifier_call = clk_twd_cpufreq_transition,
780};
781
782static int clk_init_smp_twd_cpufreq(void)
783{
784 return cpufreq_register_notifier(&clk_twd_cpufreq_nb,
785 CPUFREQ_TRANSITION_NOTIFIER);
786}
787late_initcall(clk_init_smp_twd_cpufreq);
788
789#endif
790
745int __init clk_init(void) 791int __init clk_init(void)
746{ 792{
747 if (cpu_is_u8500ed()) { 793 if (cpu_is_u8500ed()) {
@@ -762,6 +808,8 @@ int __init clk_init(void)
762 else 808 else
763 clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks)); 809 clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks));
764 810
811 clkdev_add(&clk_smp_twd_lookup);
812
765#ifdef CONFIG_DEBUG_FS 813#ifdef CONFIG_DEBUG_FS
766 clk_debugfs_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks)); 814 clk_debugfs_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks));
767 if (cpu_is_u8500ed()) 815 if (cpu_is_u8500ed())