diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 13:08:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-11 13:08:33 -0400 |
commit | d3d07d941fd80c173b6d690ded00ee5fb8302e06 (patch) | |
tree | f1a82c956e393df9933c8544bb564ef1735384ee /arch/sh/kernel/cpu/sh4a/clock-shx3.c | |
parent | 6cd8e300b49332eb9eeda45816c711c198d31505 (diff) | |
parent | 54ff328b46e58568c4b3350c2fa3223ef862e5a4 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/lethal/sh-2.6: (266 commits)
sh: Tie sparseirq in to Kconfig.
sh: Wire up sys_rt_tgsigqueueinfo.
sh: Fix sys_pwritev() syscall table entry for sh32.
sh: Fix sh4a llsc-based cmpxchg()
sh: sh7724: Add JPU support
sh: sh7724: INTC setting update
sh: sh7722 clock framework rewrite
sh: sh7366 clock framework rewrite
sh: sh7343 clock framework rewrite
sh: sh7724 clock framework rewrite V3
sh: sh7723 clock framework rewrite V2
sh: add enable()/disable()/set_rate() to div6 code
sh: add AP325RXA mode pin configuration
sh: add Migo-R mode pin configuration
sh: sh7722 mode pin definitions
sh: sh7724 mode pin comments
sh: sh7723 mode pin V2
sh: rework mode pin code
sh: clock div6 helper code
sh: clock div4 frequency table offset fix
...
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a/clock-shx3.c')
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/clock-shx3.c | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-shx3.c b/arch/sh/kernel/cpu/sh4a/clock-shx3.c index c630b29e06a8..23c27d32d982 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/clock-shx3.c | |||
@@ -40,30 +40,30 @@ static struct clk_ops shx3_master_clk_ops = { | |||
40 | .init = master_clk_init, | 40 | .init = master_clk_init, |
41 | }; | 41 | }; |
42 | 42 | ||
43 | static void module_clk_recalc(struct clk *clk) | 43 | static unsigned long module_clk_recalc(struct clk *clk) |
44 | { | 44 | { |
45 | int idx = ((ctrl_inl(FRQCR) >> PFC_POS) & PFC_MSK); | 45 | int idx = ((ctrl_inl(FRQCR) >> PFC_POS) & PFC_MSK); |
46 | clk->rate = clk->parent->rate / pfc_divisors[idx]; | 46 | return clk->parent->rate / pfc_divisors[idx]; |
47 | } | 47 | } |
48 | 48 | ||
49 | static struct clk_ops shx3_module_clk_ops = { | 49 | static struct clk_ops shx3_module_clk_ops = { |
50 | .recalc = module_clk_recalc, | 50 | .recalc = module_clk_recalc, |
51 | }; | 51 | }; |
52 | 52 | ||
53 | static void bus_clk_recalc(struct clk *clk) | 53 | static unsigned long bus_clk_recalc(struct clk *clk) |
54 | { | 54 | { |
55 | int idx = ((ctrl_inl(FRQCR) >> BFC_POS) & BFC_MSK); | 55 | int idx = ((ctrl_inl(FRQCR) >> BFC_POS) & BFC_MSK); |
56 | clk->rate = clk->parent->rate / bfc_divisors[idx]; | 56 | return clk->parent->rate / bfc_divisors[idx]; |
57 | } | 57 | } |
58 | 58 | ||
59 | static struct clk_ops shx3_bus_clk_ops = { | 59 | static struct clk_ops shx3_bus_clk_ops = { |
60 | .recalc = bus_clk_recalc, | 60 | .recalc = bus_clk_recalc, |
61 | }; | 61 | }; |
62 | 62 | ||
63 | static void cpu_clk_recalc(struct clk *clk) | 63 | static unsigned long cpu_clk_recalc(struct clk *clk) |
64 | { | 64 | { |
65 | int idx = ((ctrl_inl(FRQCR) >> IFC_POS) & IFC_MSK); | 65 | int idx = ((ctrl_inl(FRQCR) >> IFC_POS) & IFC_MSK); |
66 | clk->rate = clk->parent->rate / ifc_divisors[idx]; | 66 | return clk->parent->rate / ifc_divisors[idx]; |
67 | } | 67 | } |
68 | 68 | ||
69 | static struct clk_ops shx3_cpu_clk_ops = { | 69 | static struct clk_ops shx3_cpu_clk_ops = { |
@@ -83,10 +83,10 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | |||
83 | *ops = shx3_clk_ops[idx]; | 83 | *ops = shx3_clk_ops[idx]; |
84 | } | 84 | } |
85 | 85 | ||
86 | static void shyway_clk_recalc(struct clk *clk) | 86 | static unsigned long shyway_clk_recalc(struct clk *clk) |
87 | { | 87 | { |
88 | int idx = ((ctrl_inl(FRQCR) >> CFC_POS) & CFC_MSK); | 88 | int idx = ((ctrl_inl(FRQCR) >> CFC_POS) & CFC_MSK); |
89 | clk->rate = clk->parent->rate / cfc_divisors[idx]; | 89 | return clk->parent->rate / cfc_divisors[idx]; |
90 | } | 90 | } |
91 | 91 | ||
92 | static struct clk_ops shx3_shyway_clk_ops = { | 92 | static struct clk_ops shx3_shyway_clk_ops = { |
@@ -95,7 +95,7 @@ static struct clk_ops shx3_shyway_clk_ops = { | |||
95 | 95 | ||
96 | static struct clk shx3_shyway_clk = { | 96 | static struct clk shx3_shyway_clk = { |
97 | .name = "shyway_clk", | 97 | .name = "shyway_clk", |
98 | .flags = CLK_ALWAYS_ENABLED, | 98 | .flags = CLK_ENABLE_ON_INIT, |
99 | .ops = &shx3_shyway_clk_ops, | 99 | .ops = &shx3_shyway_clk_ops, |
100 | }; | 100 | }; |
101 | 101 | ||
@@ -107,29 +107,22 @@ static struct clk *shx3_onchip_clocks[] = { | |||
107 | &shx3_shyway_clk, | 107 | &shx3_shyway_clk, |
108 | }; | 108 | }; |
109 | 109 | ||
110 | static int __init shx3_clk_init(void) | 110 | int __init arch_clk_init(void) |
111 | { | 111 | { |
112 | struct clk *clk = clk_get(NULL, "master_clk"); | 112 | struct clk *clk; |
113 | int i; | 113 | int i, ret = 0; |
114 | 114 | ||
115 | cpg_clk_init(); | ||
116 | |||
117 | clk = clk_get(NULL, "master_clk"); | ||
115 | for (i = 0; i < ARRAY_SIZE(shx3_onchip_clocks); i++) { | 118 | for (i = 0; i < ARRAY_SIZE(shx3_onchip_clocks); i++) { |
116 | struct clk *clkp = shx3_onchip_clocks[i]; | 119 | struct clk *clkp = shx3_onchip_clocks[i]; |
117 | 120 | ||
118 | clkp->parent = clk; | 121 | clkp->parent = clk; |
119 | clk_register(clkp); | 122 | ret |= clk_register(clkp); |
120 | clk_enable(clkp); | ||
121 | } | 123 | } |
122 | 124 | ||
123 | /* | ||
124 | * Now that we have the rest of the clocks registered, we need to | ||
125 | * force the parent clock to propagate so that these clocks will | ||
126 | * automatically figure out their rate. We cheat by handing the | ||
127 | * parent clock its current rate and forcing child propagation. | ||
128 | */ | ||
129 | clk_set_rate(clk, clk_get_rate(clk)); | ||
130 | |||
131 | clk_put(clk); | 125 | clk_put(clk); |
132 | 126 | ||
133 | return 0; | 127 | return ret; |
134 | } | 128 | } |
135 | arch_initcall(shx3_clk_init); | ||