aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/sysdev/cpm2_common.c100
-rw-r--r--include/asm-powerpc/cpm2.h5
2 files changed, 99 insertions, 6 deletions
diff --git a/arch/powerpc/sysdev/cpm2_common.c b/arch/powerpc/sysdev/cpm2_common.c
index 0330ca490928..c6dc0bf614b3 100644
--- a/arch/powerpc/sysdev/cpm2_common.c
+++ b/arch/powerpc/sysdev/cpm2_common.c
@@ -144,7 +144,8 @@ int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
144 cpmux_t __iomem *im_cpmux; 144 cpmux_t __iomem *im_cpmux;
145 u32 __iomem *reg; 145 u32 __iomem *reg;
146 u32 mask = 7; 146 u32 mask = 7;
147 u8 clk_map [24][3] = { 147
148 u8 clk_map[][3] = {
148 {CPM_CLK_FCC1, CPM_BRG5, 0}, 149 {CPM_CLK_FCC1, CPM_BRG5, 0},
149 {CPM_CLK_FCC1, CPM_BRG6, 1}, 150 {CPM_CLK_FCC1, CPM_BRG6, 1},
150 {CPM_CLK_FCC1, CPM_BRG7, 2}, 151 {CPM_CLK_FCC1, CPM_BRG7, 2},
@@ -168,8 +169,40 @@ int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
168 {CPM_CLK_FCC3, CPM_CLK13, 4}, 169 {CPM_CLK_FCC3, CPM_CLK13, 4},
169 {CPM_CLK_FCC3, CPM_CLK14, 5}, 170 {CPM_CLK_FCC3, CPM_CLK14, 5},
170 {CPM_CLK_FCC3, CPM_CLK15, 6}, 171 {CPM_CLK_FCC3, CPM_CLK15, 6},
171 {CPM_CLK_FCC3, CPM_CLK16, 7} 172 {CPM_CLK_FCC3, CPM_CLK16, 7},
172 }; 173 {CPM_CLK_SCC1, CPM_BRG1, 0},
174 {CPM_CLK_SCC1, CPM_BRG2, 1},
175 {CPM_CLK_SCC1, CPM_BRG3, 2},
176 {CPM_CLK_SCC1, CPM_BRG4, 3},
177 {CPM_CLK_SCC1, CPM_CLK11, 4},
178 {CPM_CLK_SCC1, CPM_CLK12, 5},
179 {CPM_CLK_SCC1, CPM_CLK3, 6},
180 {CPM_CLK_SCC1, CPM_CLK4, 7},
181 {CPM_CLK_SCC2, CPM_BRG1, 0},
182 {CPM_CLK_SCC2, CPM_BRG2, 1},
183 {CPM_CLK_SCC2, CPM_BRG3, 2},
184 {CPM_CLK_SCC2, CPM_BRG4, 3},
185 {CPM_CLK_SCC2, CPM_CLK11, 4},
186 {CPM_CLK_SCC2, CPM_CLK12, 5},
187 {CPM_CLK_SCC2, CPM_CLK3, 6},
188 {CPM_CLK_SCC2, CPM_CLK4, 7},
189 {CPM_CLK_SCC3, CPM_BRG1, 0},
190 {CPM_CLK_SCC3, CPM_BRG2, 1},
191 {CPM_CLK_SCC3, CPM_BRG3, 2},
192 {CPM_CLK_SCC3, CPM_BRG4, 3},
193 {CPM_CLK_SCC3, CPM_CLK5, 4},
194 {CPM_CLK_SCC3, CPM_CLK6, 5},
195 {CPM_CLK_SCC3, CPM_CLK7, 6},
196 {CPM_CLK_SCC3, CPM_CLK8, 7},
197 {CPM_CLK_SCC4, CPM_BRG1, 0},
198 {CPM_CLK_SCC4, CPM_BRG2, 1},
199 {CPM_CLK_SCC4, CPM_BRG3, 2},
200 {CPM_CLK_SCC4, CPM_BRG4, 3},
201 {CPM_CLK_SCC4, CPM_CLK5, 4},
202 {CPM_CLK_SCC4, CPM_CLK6, 5},
203 {CPM_CLK_SCC4, CPM_CLK7, 6},
204 {CPM_CLK_SCC4, CPM_CLK8, 7},
205 };
173 206
174 im_cpmux = cpm2_map(im_cpmux); 207 im_cpmux = cpm2_map(im_cpmux);
175 208
@@ -209,23 +242,80 @@ int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
209 if (mode == CPM_CLK_RX) 242 if (mode == CPM_CLK_RX)
210 shift += 3; 243 shift += 3;
211 244
212 for (i=0; i<24; i++) { 245 for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
213 if (clk_map[i][0] == target && clk_map[i][1] == clock) { 246 if (clk_map[i][0] == target && clk_map[i][1] == clock) {
214 bits = clk_map[i][2]; 247 bits = clk_map[i][2];
215 break; 248 break;
216 } 249 }
217 } 250 }
218 if (i == sizeof(clk_map)/3) 251 if (i == ARRAY_SIZE(clk_map))
219 ret = -EINVAL; 252 ret = -EINVAL;
220 253
221 bits <<= shift; 254 bits <<= shift;
222 mask <<= shift; 255 mask <<= shift;
256
223 out_be32(reg, (in_be32(reg) & ~mask) | bits); 257 out_be32(reg, (in_be32(reg) & ~mask) | bits);
224 258
225 cpm2_unmap(im_cpmux); 259 cpm2_unmap(im_cpmux);
226 return ret; 260 return ret;
227} 261}
228 262
263int cpm2_smc_clk_setup(enum cpm_clk_target target, int clock)
264{
265 int ret = 0;
266 int shift;
267 int i, bits = 0;
268 cpmux_t __iomem *im_cpmux;
269 u8 __iomem *reg;
270 u8 mask = 3;
271
272 u8 clk_map[][3] = {
273 {CPM_CLK_SMC1, CPM_BRG1, 0},
274 {CPM_CLK_SMC1, CPM_BRG7, 1},
275 {CPM_CLK_SMC1, CPM_CLK7, 2},
276 {CPM_CLK_SMC1, CPM_CLK9, 3},
277 {CPM_CLK_SMC2, CPM_BRG2, 0},
278 {CPM_CLK_SMC2, CPM_BRG8, 1},
279 {CPM_CLK_SMC2, CPM_CLK4, 2},
280 {CPM_CLK_SMC2, CPM_CLK15, 3},
281 };
282
283 im_cpmux = cpm2_map(im_cpmux);
284
285 switch (target) {
286 case CPM_CLK_SMC1:
287 reg = &im_cpmux->cmx_smr;
288 mask = 3;
289 shift = 4;
290 break;
291 case CPM_CLK_SMC2:
292 reg = &im_cpmux->cmx_smr;
293 mask = 3;
294 shift = 0;
295 break;
296 default:
297 printk(KERN_ERR "cpm2_smc_clock_setup: invalid clock target\n");
298 return -EINVAL;
299 }
300
301 for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
302 if (clk_map[i][0] == target && clk_map[i][1] == clock) {
303 bits = clk_map[i][2];
304 break;
305 }
306 }
307 if (i == ARRAY_SIZE(clk_map))
308 ret = -EINVAL;
309
310 bits <<= shift;
311 mask <<= shift;
312
313 out_8(reg, (in_8(reg) & ~mask) | bits);
314
315 cpm2_unmap(im_cpmux);
316 return ret;
317}
318
229/* 319/*
230 * dpalloc / dpfree bits. 320 * dpalloc / dpfree bits.
231 */ 321 */
diff --git a/include/asm-powerpc/cpm2.h b/include/asm-powerpc/cpm2.h
index c03650609792..41a45db0c8b1 100644
--- a/include/asm-powerpc/cpm2.h
+++ b/include/asm-powerpc/cpm2.h
@@ -1206,7 +1206,9 @@ enum cpm_clk_target {
1206 CPM_CLK_SCC4, 1206 CPM_CLK_SCC4,
1207 CPM_CLK_FCC1, 1207 CPM_CLK_FCC1,
1208 CPM_CLK_FCC2, 1208 CPM_CLK_FCC2,
1209 CPM_CLK_FCC3 1209 CPM_CLK_FCC3,
1210 CPM_CLK_SMC1,
1211 CPM_CLK_SMC2,
1210}; 1212};
1211 1213
1212enum cpm_clk { 1214enum cpm_clk {
@@ -1243,6 +1245,7 @@ enum cpm_clk {
1243}; 1245};
1244 1246
1245extern int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode); 1247extern int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode);
1248extern int cpm2_smc_clk_setup(enum cpm_clk_target target, int clock);
1246 1249
1247#endif /* __CPM2__ */ 1250#endif /* __CPM2__ */
1248#endif /* __KERNEL__ */ 1251#endif /* __KERNEL__ */