diff options
Diffstat (limited to 'arch/sh/kernel/cpu/sh4a/clock-sh7786.c')
-rw-r--r-- | arch/sh/kernel/cpu/sh4a/clock-sh7786.c | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c index f84a9c134471..a0e8869071ac 100644 --- a/arch/sh/kernel/cpu/sh4a/clock-sh7786.c +++ b/arch/sh/kernel/cpu/sh4a/clock-sh7786.c | |||
@@ -36,30 +36,30 @@ static struct clk_ops sh7786_master_clk_ops = { | |||
36 | .init = master_clk_init, | 36 | .init = master_clk_init, |
37 | }; | 37 | }; |
38 | 38 | ||
39 | static void module_clk_recalc(struct clk *clk) | 39 | static unsigned long module_clk_recalc(struct clk *clk) |
40 | { | 40 | { |
41 | int idx = (ctrl_inl(FRQMR1) & 0x000f); | 41 | int idx = (ctrl_inl(FRQMR1) & 0x000f); |
42 | clk->rate = clk->parent->rate / pfc_divisors[idx]; | 42 | return clk->parent->rate / pfc_divisors[idx]; |
43 | } | 43 | } |
44 | 44 | ||
45 | static struct clk_ops sh7786_module_clk_ops = { | 45 | static struct clk_ops sh7786_module_clk_ops = { |
46 | .recalc = module_clk_recalc, | 46 | .recalc = module_clk_recalc, |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static void bus_clk_recalc(struct clk *clk) | 49 | static unsigned long bus_clk_recalc(struct clk *clk) |
50 | { | 50 | { |
51 | int idx = ((ctrl_inl(FRQMR1) >> 16) & 0x000f); | 51 | int idx = ((ctrl_inl(FRQMR1) >> 16) & 0x000f); |
52 | clk->rate = clk->parent->rate / bfc_divisors[idx]; | 52 | return clk->parent->rate / bfc_divisors[idx]; |
53 | } | 53 | } |
54 | 54 | ||
55 | static struct clk_ops sh7786_bus_clk_ops = { | 55 | static struct clk_ops sh7786_bus_clk_ops = { |
56 | .recalc = bus_clk_recalc, | 56 | .recalc = bus_clk_recalc, |
57 | }; | 57 | }; |
58 | 58 | ||
59 | static void cpu_clk_recalc(struct clk *clk) | 59 | static unsigned long cpu_clk_recalc(struct clk *clk) |
60 | { | 60 | { |
61 | int idx = ((ctrl_inl(FRQMR1) >> 28) & 0x0003); | 61 | int idx = ((ctrl_inl(FRQMR1) >> 28) & 0x0003); |
62 | clk->rate = clk->parent->rate / ifc_divisors[idx]; | 62 | return clk->parent->rate / ifc_divisors[idx]; |
63 | } | 63 | } |
64 | 64 | ||
65 | static struct clk_ops sh7786_cpu_clk_ops = { | 65 | static struct clk_ops sh7786_cpu_clk_ops = { |
@@ -79,10 +79,10 @@ void __init arch_init_clk_ops(struct clk_ops **ops, int idx) | |||
79 | *ops = sh7786_clk_ops[idx]; | 79 | *ops = sh7786_clk_ops[idx]; |
80 | } | 80 | } |
81 | 81 | ||
82 | static void shyway_clk_recalc(struct clk *clk) | 82 | static unsigned long shyway_clk_recalc(struct clk *clk) |
83 | { | 83 | { |
84 | int idx = ((ctrl_inl(FRQMR1) >> 20) & 0x0003); | 84 | int idx = ((ctrl_inl(FRQMR1) >> 20) & 0x0003); |
85 | clk->rate = clk->parent->rate / sfc_divisors[idx]; | 85 | return clk->parent->rate / sfc_divisors[idx]; |
86 | } | 86 | } |
87 | 87 | ||
88 | static struct clk_ops sh7786_shyway_clk_ops = { | 88 | static struct clk_ops sh7786_shyway_clk_ops = { |
@@ -91,14 +91,14 @@ static struct clk_ops sh7786_shyway_clk_ops = { | |||
91 | 91 | ||
92 | static struct clk sh7786_shyway_clk = { | 92 | static struct clk sh7786_shyway_clk = { |
93 | .name = "shyway_clk", | 93 | .name = "shyway_clk", |
94 | .flags = CLK_ALWAYS_ENABLED, | 94 | .flags = CLK_ENABLE_ON_INIT, |
95 | .ops = &sh7786_shyway_clk_ops, | 95 | .ops = &sh7786_shyway_clk_ops, |
96 | }; | 96 | }; |
97 | 97 | ||
98 | static void ddr_clk_recalc(struct clk *clk) | 98 | static unsigned long ddr_clk_recalc(struct clk *clk) |
99 | { | 99 | { |
100 | int idx = ((ctrl_inl(FRQMR1) >> 12) & 0x0003); | 100 | int idx = ((ctrl_inl(FRQMR1) >> 12) & 0x0003); |
101 | clk->rate = clk->parent->rate / mfc_divisors[idx]; | 101 | return clk->parent->rate / mfc_divisors[idx]; |
102 | } | 102 | } |
103 | 103 | ||
104 | static struct clk_ops sh7786_ddr_clk_ops = { | 104 | static struct clk_ops sh7786_ddr_clk_ops = { |
@@ -107,7 +107,7 @@ static struct clk_ops sh7786_ddr_clk_ops = { | |||
107 | 107 | ||
108 | static struct clk sh7786_ddr_clk = { | 108 | static struct clk sh7786_ddr_clk = { |
109 | .name = "ddr_clk", | 109 | .name = "ddr_clk", |
110 | .flags = CLK_ALWAYS_ENABLED, | 110 | .flags = CLK_ENABLE_ON_INIT, |
111 | .ops = &sh7786_ddr_clk_ops, | 111 | .ops = &sh7786_ddr_clk_ops, |
112 | }; | 112 | }; |
113 | 113 | ||
@@ -120,29 +120,22 @@ static struct clk *sh7786_onchip_clocks[] = { | |||
120 | &sh7786_ddr_clk, | 120 | &sh7786_ddr_clk, |
121 | }; | 121 | }; |
122 | 122 | ||
123 | static int __init sh7786_clk_init(void) | 123 | int __init arch_clk_init(void) |
124 | { | 124 | { |
125 | struct clk *clk = clk_get(NULL, "master_clk"); | 125 | struct clk *clk; |
126 | int i; | 126 | int i, ret = 0; |
127 | 127 | ||
128 | cpg_clk_init(); | ||
129 | |||
130 | clk = clk_get(NULL, "master_clk"); | ||
128 | for (i = 0; i < ARRAY_SIZE(sh7786_onchip_clocks); i++) { | 131 | for (i = 0; i < ARRAY_SIZE(sh7786_onchip_clocks); i++) { |
129 | struct clk *clkp = sh7786_onchip_clocks[i]; | 132 | struct clk *clkp = sh7786_onchip_clocks[i]; |
130 | 133 | ||
131 | clkp->parent = clk; | 134 | clkp->parent = clk; |
132 | clk_register(clkp); | 135 | ret |= clk_register(clkp); |
133 | clk_enable(clkp); | ||
134 | } | 136 | } |
135 | 137 | ||
136 | /* | ||
137 | * Now that we have the rest of the clocks registered, we need to | ||
138 | * force the parent clock to propagate so that these clocks will | ||
139 | * automatically figure out their rate. We cheat by handing the | ||
140 | * parent clock its current rate and forcing child propagation. | ||
141 | */ | ||
142 | clk_set_rate(clk, clk_get_rate(clk)); | ||
143 | |||
144 | clk_put(clk); | 138 | clk_put(clk); |
145 | 139 | ||
146 | return 0; | 140 | return ret; |
147 | } | 141 | } |
148 | arch_initcall(sh7786_clk_init); | ||