aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2007-12-20 23:39:33 -0500
committerJosh Boyer <jwboyer@linux.vnet.ibm.com>2007-12-23 14:14:48 -0500
commit190de005384204ba4dc339c3d05f8d40f6b16643 (patch)
tree83fff853bdde49ec29e0fb488d8bf9578bec627a
parentbc0b4e7ffb528282df5f8ba9c7c3f60135603e9e (diff)
[POWERPC] 4xx: Rework clock probing in boot wrapper
This reworks the boot wrapper library function that probes the chip clocks. Better separate the base function that is used on 440GX,SPe,EP,... from the uart fixups as those need different device-tree path on different processors. Also, rework the function itself based on the arch/ppc code from Eugene Surovegin which I find more readable, and which handles one more bypass case. Also handle the subtle difference between 440EP/EPx and 440SPe/GX, on the former, PerClk is derived from the PLB clock while on the later, it's derived from the OPB. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Josh Boyer <jwboyer@linux.vnet.ibm.com>
-rw-r--r--arch/powerpc/boot/4xx.c272
-rw-r--r--arch/powerpc/boot/4xx.h11
-rw-r--r--arch/powerpc/boot/bamboo.c2
-rw-r--r--arch/powerpc/boot/cuboot-sequoia.c2
-rw-r--r--arch/powerpc/boot/cuboot-taishan.c4
-rw-r--r--arch/powerpc/boot/dcr.h17
-rw-r--r--arch/powerpc/boot/ebony.c60
7 files changed, 233 insertions, 135 deletions
diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c
index d16ea10d7546..1a83efe274c1 100644
--- a/arch/powerpc/boot/4xx.c
+++ b/arch/powerpc/boot/4xx.c
@@ -275,89 +275,225 @@ void ibm4xx_fixup_ebc_ranges(const char *ebc)
275 setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32)); 275 setprop(devp, "ranges", ranges, (p - ranges) * sizeof(u32));
276} 276}
277 277
278#define SPRN_CCR1 0x378 278/* Calculate 440GP clocks */
279void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk) 279void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
280{ 280{
281 u32 cpu, plb, opb, ebc, tb, uart0, m, vco; 281 u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
282 u32 reg; 282 u32 cr0 = mfdcr(DCRN_CPC0_CR0);
283 u32 fwdva, fwdvb, fbdv, lfbdv, opbdv0, perdv0, spcid0, prbdv0, tmp; 283 u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
284 284 u32 opdv = CPC0_SYS0_OPDV(sys0);
285 mtdcr(DCRN_CPR0_ADDR, CPR0_PLLD0); 285 u32 epdv = CPC0_SYS0_EPDV(sys0);
286 reg = mfdcr(DCRN_CPR0_DATA); 286
287 tmp = (reg & 0x000F0000) >> 16; 287 if (sys0 & CPC0_SYS0_BYPASS) {
288 fwdva = tmp ? tmp : 16; 288 /* Bypass system PLL */
289 tmp = (reg & 0x00000700) >> 8; 289 cpu = plb = sys_clk;
290 fwdvb = tmp ? tmp : 8; 290 } else {
291 tmp = (reg & 0x1F000000) >> 24; 291 if (sys0 & CPC0_SYS0_EXTSL)
292 fbdv = tmp ? tmp : 32; 292 /* PerClk */
293 lfbdv = (reg & 0x0000007F); 293 m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
294
295 mtdcr(DCRN_CPR0_ADDR, CPR0_OPBD0);
296 reg = mfdcr(DCRN_CPR0_DATA);
297 tmp = (reg & 0x03000000) >> 24;
298 opbdv0 = tmp ? tmp : 4;
299
300 mtdcr(DCRN_CPR0_ADDR, CPR0_PERD0);
301 reg = mfdcr(DCRN_CPR0_DATA);
302 tmp = (reg & 0x07000000) >> 24;
303 perdv0 = tmp ? tmp : 8;
304
305 mtdcr(DCRN_CPR0_ADDR, CPR0_PRIMBD0);
306 reg = mfdcr(DCRN_CPR0_DATA);
307 tmp = (reg & 0x07000000) >> 24;
308 prbdv0 = tmp ? tmp : 8;
309
310 mtdcr(DCRN_CPR0_ADDR, CPR0_SCPID);
311 reg = mfdcr(DCRN_CPR0_DATA);
312 tmp = (reg & 0x03000000) >> 24;
313 spcid0 = tmp ? tmp : 4;
314
315 /* Calculate M */
316 mtdcr(DCRN_CPR0_ADDR, CPR0_PLLC0);
317 reg = mfdcr(DCRN_CPR0_DATA);
318 tmp = (reg & 0x03000000) >> 24;
319 if (tmp == 0) { /* PLL output */
320 tmp = (reg & 0x20000000) >> 29;
321 if (!tmp) /* PLLOUTA */
322 m = fbdv * lfbdv * fwdva;
323 else 294 else
324 m = fbdv * lfbdv * fwdvb; 295 /* CPU clock */
296 m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
297 cpu = sys_clk * m / CPC0_SYS0_FWDVA(sys0);
298 plb = sys_clk * m / CPC0_SYS0_FWDVB(sys0);
325 } 299 }
326 else if (tmp == 1) /* CPU output */ 300
327 m = fbdv * fwdva; 301 opb = plb / opdv;
302 ebc = opb / epdv;
303
304 /* FIXME: Check if this is for all 440GP, or just Ebony */
305 if ((mfpvr() & 0xf0000fff) == 0x40000440)
306 /* Rev. B 440GP, use external system clock */
307 tb = sys_clk;
328 else 308 else
329 m = perdv0 * opbdv0 * fwdvb; 309 /* Rev. C 440GP, errata force us to use internal clock */
310 tb = cpu;
330 311
331 vco = (m * sysclk) + (m >> 1); 312 if (cr0 & CPC0_CR0_U0EC)
332 cpu = vco / fwdva; 313 /* External UART clock */
333 plb = vco / fwdvb / prbdv0; 314 uart0 = ser_clk;
334 opb = plb / opbdv0; 315 else
335 ebc = plb / perdv0; 316 /* Internal UART clock */
317 uart0 = plb / CPC0_CR0_UDIV(cr0);
318
319 if (cr0 & CPC0_CR0_U1EC)
320 /* External UART clock */
321 uart1 = ser_clk;
322 else
323 /* Internal UART clock */
324 uart1 = plb / CPC0_CR0_UDIV(cr0);
325
326 printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
327 (sys_clk + 500000) / 1000000, sys_clk);
328
329 dt_fixup_cpu_clocks(cpu, tb, 0);
330
331 dt_fixup_clock("/plb", plb);
332 dt_fixup_clock("/plb/opb", opb);
333 dt_fixup_clock("/plb/opb/ebc", ebc);
334 dt_fixup_clock("/plb/opb/serial@40000200", uart0);
335 dt_fixup_clock("/plb/opb/serial@40000300", uart1);
336}
337
338#define SPRN_CCR1 0x378
339
340static inline u32 __fix_zero(u32 v, u32 def)
341{
342 return v ? v : def;
343}
344
345static unsigned int __ibm440eplike_fixup_clocks(unsigned int sys_clk,
346 unsigned int tmr_clk,
347 int per_clk_from_opb)
348{
349 /* PLL config */
350 u32 pllc = CPR0_READ(DCRN_CPR0_PLLC);
351 u32 plld = CPR0_READ(DCRN_CPR0_PLLD);
352
353 /* Dividers */
354 u32 fbdv = __fix_zero((plld >> 24) & 0x1f, 32);
355 u32 fwdva = __fix_zero((plld >> 16) & 0xf, 16);
356 u32 fwdvb = __fix_zero((plld >> 8) & 7, 8);
357 u32 lfbdv = __fix_zero(plld & 0x3f, 64);
358 u32 pradv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMAD) >> 24) & 7, 8);
359 u32 prbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PRIMBD) >> 24) & 7, 8);
360 u32 opbdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_OPBD) >> 24) & 3, 4);
361 u32 perdv0 = __fix_zero((CPR0_READ(DCRN_CPR0_PERD) >> 24) & 3, 4);
362
363 /* Input clocks for primary dividers */
364 u32 clk_a, clk_b;
365
366 /* Resulting clocks */
367 u32 cpu, plb, opb, ebc, vco;
368
369 /* Timebase */
370 u32 ccr1, tb = tmr_clk;
371
372 if (pllc & 0x40000000) {
373 u32 m;
374
375 /* Feedback path */
376 switch ((pllc >> 24) & 7) {
377 case 0:
378 /* PLLOUTx */
379 m = ((pllc & 0x20000000) ? fwdvb : fwdva) * lfbdv;
380 break;
381 case 1:
382 /* CPU */
383 m = fwdva * pradv0;
384 break;
385 case 5:
386 /* PERClk */
387 m = fwdvb * prbdv0 * opbdv0 * perdv0;
388 break;
389 default:
390 printf("WARNING ! Invalid PLL feedback source !\n");
391 goto bypass;
392 }
393 m *= fbdv;
394 vco = sys_clk * m;
395 clk_a = vco / fwdva;
396 clk_b = vco / fwdvb;
397 } else {
398bypass:
399 /* Bypass system PLL */
400 vco = 0;
401 clk_a = clk_b = sys_clk;
402 }
336 403
337 /* FIXME */ 404 cpu = clk_a / pradv0;
338 uart0 = ser_clk; 405 plb = clk_b / prbdv0;
406 opb = plb / opbdv0;
407 ebc = (per_clk_from_opb ? opb : plb) / perdv0;
339 408
340 /* Figure out timebase. Either CPU or default TmrClk */ 409 /* Figure out timebase. Either CPU or default TmrClk */
341 asm volatile ( 410 ccr1 = mfspr(SPRN_CCR1);
342 "mfspr %0,%1\n" 411
343 : 412 /* If passed a 0 tmr_clk, force CPU clock */
344 "=&r"(reg) : "i"(SPRN_CCR1)); 413 if (tb == 0) {
345 if (reg & 0x0080) 414 ccr1 &= ~0x80u;
346 tb = 25000000; /* TmrClk is 25MHz */ 415 mtspr(SPRN_CCR1, ccr1);
347 else 416 }
417 if ((ccr1 & 0x0080) == 0)
348 tb = cpu; 418 tb = cpu;
349 419
350 dt_fixup_cpu_clocks(cpu, tb, 0); 420 dt_fixup_cpu_clocks(cpu, tb, 0);
351 dt_fixup_clock("/plb", plb); 421 dt_fixup_clock("/plb", plb);
352 dt_fixup_clock("/plb/opb", opb); 422 dt_fixup_clock("/plb/opb", opb);
353 dt_fixup_clock("/plb/opb/ebc", ebc); 423 dt_fixup_clock("/plb/opb/ebc", ebc);
354 dt_fixup_clock("/plb/opb/serial@ef600300", uart0); 424
355 dt_fixup_clock("/plb/opb/serial@ef600400", uart0); 425 return plb;
356 dt_fixup_clock("/plb/opb/serial@ef600500", uart0); 426}
357 dt_fixup_clock("/plb/opb/serial@ef600600", uart0); 427
428static void eplike_fixup_uart_clk(int index, const char *path,
429 unsigned int ser_clk,
430 unsigned int plb_clk)
431{
432 unsigned int sdr;
433 unsigned int clock;
434
435 switch (index) {
436 case 0:
437 sdr = SDR0_READ(DCRN_SDR0_UART0);
438 break;
439 case 1:
440 sdr = SDR0_READ(DCRN_SDR0_UART1);
441 break;
442 case 2:
443 sdr = SDR0_READ(DCRN_SDR0_UART2);
444 break;
445 case 3:
446 sdr = SDR0_READ(DCRN_SDR0_UART3);
447 break;
448 default:
449 return;
450 }
451
452 if (sdr & 0x00800000u)
453 clock = ser_clk;
454 else
455 clock = plb_clk / __fix_zero(sdr & 0xff, 256);
456
457 dt_fixup_clock(path, clock);
458}
459
460void ibm440ep_fixup_clocks(unsigned int sys_clk,
461 unsigned int ser_clk,
462 unsigned int tmr_clk)
463{
464 unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 0);
465
466 /* serial clocks beed fixup based on int/ext */
467 eplike_fixup_uart_clk(0, "/plb/opb/serial@ef600300", ser_clk, plb_clk);
468 eplike_fixup_uart_clk(1, "/plb/opb/serial@ef600400", ser_clk, plb_clk);
469 eplike_fixup_uart_clk(2, "/plb/opb/serial@ef600500", ser_clk, plb_clk);
470 eplike_fixup_uart_clk(3, "/plb/opb/serial@ef600600", ser_clk, plb_clk);
471}
472
473void ibm440gx_fixup_clocks(unsigned int sys_clk,
474 unsigned int ser_clk,
475 unsigned int tmr_clk)
476{
477 unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
478
479 /* serial clocks beed fixup based on int/ext */
480 eplike_fixup_uart_clk(0, "/plb/opb/serial@40000200", ser_clk, plb_clk);
481 eplike_fixup_uart_clk(1, "/plb/opb/serial@40000300", ser_clk, plb_clk);
482}
483
484void ibm440spe_fixup_clocks(unsigned int sys_clk,
485 unsigned int ser_clk,
486 unsigned int tmr_clk)
487{
488 unsigned int plb_clk = __ibm440eplike_fixup_clocks(sys_clk, tmr_clk, 1);
489
490 /* serial clocks beed fixup based on int/ext */
491 eplike_fixup_uart_clk(0, "/plb/opb/serial@10000200", ser_clk, plb_clk);
492 eplike_fixup_uart_clk(1, "/plb/opb/serial@10000300", ser_clk, plb_clk);
493 eplike_fixup_uart_clk(2, "/plb/opb/serial@10000600", ser_clk, plb_clk);
358} 494}
359 495
360void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk) 496void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk)
361{ 497{
362 u32 pllmr = mfdcr(DCRN_CPC0_PLLMR); 498 u32 pllmr = mfdcr(DCRN_CPC0_PLLMR);
363 u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0); 499 u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0);
@@ -374,7 +510,7 @@ void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
374 510
375 m = fwdv * fbdv * cbdv; 511 m = fwdv * fbdv * cbdv;
376 512
377 cpu = sysclk * m / fwdv; 513 cpu = sys_clk * m / fwdv;
378 plb = cpu / cbdv; 514 plb = cpu / cbdv;
379 opb = plb / opdv; 515 opb = plb / opdv;
380 ebc = plb / epdv; 516 ebc = plb / epdv;
diff --git a/arch/powerpc/boot/4xx.h b/arch/powerpc/boot/4xx.h
index 5296350ac3a0..fbe0632621ca 100644
--- a/arch/powerpc/boot/4xx.h
+++ b/arch/powerpc/boot/4xx.h
@@ -18,7 +18,14 @@ void ibm44x_dbcr_reset(void);
18void ibm40x_dbcr_reset(void); 18void ibm40x_dbcr_reset(void);
19void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1); 19void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1);
20void ibm4xx_fixup_ebc_ranges(const char *ebc); 20void ibm4xx_fixup_ebc_ranges(const char *ebc);
21void ibm440ep_fixup_clocks(unsigned int sysclk, unsigned int ser_clk); 21
22void ibm405gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk); 22void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
23void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk);
24void ibm440ep_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
25 unsigned int tmr_clk);
26void ibm440gx_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
27 unsigned int tmr_clk);
28void ibm440spe_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk,
29 unsigned int tmr_clk);
23 30
24#endif /* _POWERPC_BOOT_4XX_H_ */ 31#endif /* _POWERPC_BOOT_4XX_H_ */
diff --git a/arch/powerpc/boot/bamboo.c b/arch/powerpc/boot/bamboo.c
index a6146d9adaee..54b33f1500e2 100644
--- a/arch/powerpc/boot/bamboo.c
+++ b/arch/powerpc/boot/bamboo.c
@@ -30,7 +30,7 @@ static void bamboo_fixups(void)
30{ 30{
31 unsigned long sysclk = 33333333; 31 unsigned long sysclk = 33333333;
32 32
33 ibm440ep_fixup_clocks(sysclk, 11059200); 33 ibm440ep_fixup_clocks(sysclk, 11059200, 25000000);
34 ibm4xx_sdram_fixup_memsize(); 34 ibm4xx_sdram_fixup_memsize();
35 ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00); 35 ibm4xx_quiesce_eth((u32 *)0xef600e00, (u32 *)0xef600f00);
36 dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1); 36 dt_fixup_mac_addresses(bamboo_mac0, bamboo_mac1);
diff --git a/arch/powerpc/boot/cuboot-sequoia.c b/arch/powerpc/boot/cuboot-sequoia.c
index cf78260fcf3f..66b7eeb82b46 100644
--- a/arch/powerpc/boot/cuboot-sequoia.c
+++ b/arch/powerpc/boot/cuboot-sequoia.c
@@ -39,7 +39,7 @@ static void sequoia_fixups(void)
39{ 39{
40 unsigned long sysclk = 33333333; 40 unsigned long sysclk = 33333333;
41 41
42 ibm440ep_fixup_clocks(sysclk, 11059200); 42 ibm440ep_fixup_clocks(sysclk, 11059200, 25000000);
43 ibm4xx_fixup_ebc_ranges("/plb/opb/ebc"); 43 ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
44 ibm4xx_denali_fixup_memsize(); 44 ibm4xx_denali_fixup_memsize();
45 dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr); 45 dt_fixup_mac_addresses(&bd.bi_enetaddr, &bd.bi_enet1addr);
diff --git a/arch/powerpc/boot/cuboot-taishan.c b/arch/powerpc/boot/cuboot-taishan.c
index afd828d050c0..f66455a45ab1 100644
--- a/arch/powerpc/boot/cuboot-taishan.c
+++ b/arch/powerpc/boot/cuboot-taishan.c
@@ -34,9 +34,7 @@ static void taishan_fixups(void)
34 registers */ 34 registers */
35 unsigned long sysclk = 33000000; 35 unsigned long sysclk = 33000000;
36 36
37 /* 440EP Clock logic is all but identical to 440GX 37 ibm440gx_fixup_clocks(sysclk, 6 * 1843200, 25000000);
38 so we just use that code for now at least */
39 ibm440ep_fixup_clocks(sysclk, 6 * 1843200);
40 38
41 ibm4xx_sdram_fixup_memsize(); 39 ibm4xx_sdram_fixup_memsize();
42 40
diff --git a/arch/powerpc/boot/dcr.h b/arch/powerpc/boot/dcr.h
index f6b793573b96..55655f78505a 100644
--- a/arch/powerpc/boot/dcr.h
+++ b/arch/powerpc/boot/dcr.h
@@ -160,6 +160,23 @@ static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR,
160#define DCRN_CPR0_PERD 0x0e0 160#define DCRN_CPR0_PERD 0x0e0
161#define DCRN_CPR0_MALD 0x100 161#define DCRN_CPR0_MALD 0x100
162 162
163#define DCRN_SDR0_CONFIG_ADDR 0xe
164#define DCRN_SDR0_CONFIG_DATA 0xf
165
166/* SDR read/write helper macros */
167#define SDR0_READ(offset) ({\
168 mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
169 mfdcr(DCRN_SDR0_CONFIG_DATA); })
170#define SDR0_WRITE(offset, data) ({\
171 mtdcr(DCRN_SDR0_CONFIG_ADDR, offset); \
172 mtdcr(DCRN_SDR0_CONFIG_DATA, data); })
173
174#define DCRN_SDR0_UART0 0x0120
175#define DCRN_SDR0_UART1 0x0121
176#define DCRN_SDR0_UART2 0x0122
177#define DCRN_SDR0_UART3 0x0123
178
179
163/* CPRs read/write helper macros - based off include/asm-ppc/ibm44x.h */ 180/* CPRs read/write helper macros - based off include/asm-ppc/ibm44x.h */
164 181
165#define DCRN_CPR0_CFGADDR 0xc 182#define DCRN_CPR0_CFGADDR 0xc
diff --git a/arch/powerpc/boot/ebony.c b/arch/powerpc/boot/ebony.c
index 68beb4947190..f61364c47a76 100644
--- a/arch/powerpc/boot/ebony.c
+++ b/arch/powerpc/boot/ebony.c
@@ -31,66 +31,6 @@
31 31
32static u8 *ebony_mac0, *ebony_mac1; 32static u8 *ebony_mac0, *ebony_mac1;
33 33
34/* Calculate 440GP clocks */
35void ibm440gp_fixup_clocks(unsigned int sysclk, unsigned int ser_clk)
36{
37 u32 sys0 = mfdcr(DCRN_CPC0_SYS0);
38 u32 cr0 = mfdcr(DCRN_CPC0_CR0);
39 u32 cpu, plb, opb, ebc, tb, uart0, uart1, m;
40 u32 opdv = CPC0_SYS0_OPDV(sys0);
41 u32 epdv = CPC0_SYS0_EPDV(sys0);
42
43 if (sys0 & CPC0_SYS0_BYPASS) {
44 /* Bypass system PLL */
45 cpu = plb = sysclk;
46 } else {
47 if (sys0 & CPC0_SYS0_EXTSL)
48 /* PerClk */
49 m = CPC0_SYS0_FWDVB(sys0) * opdv * epdv;
50 else
51 /* CPU clock */
52 m = CPC0_SYS0_FBDV(sys0) * CPC0_SYS0_FWDVA(sys0);
53 cpu = sysclk * m / CPC0_SYS0_FWDVA(sys0);
54 plb = sysclk * m / CPC0_SYS0_FWDVB(sys0);
55 }
56
57 opb = plb / opdv;
58 ebc = opb / epdv;
59
60 /* FIXME: Check if this is for all 440GP, or just Ebony */
61 if ((mfpvr() & 0xf0000fff) == 0x40000440)
62 /* Rev. B 440GP, use external system clock */
63 tb = sysclk;
64 else
65 /* Rev. C 440GP, errata force us to use internal clock */
66 tb = cpu;
67
68 if (cr0 & CPC0_CR0_U0EC)
69 /* External UART clock */
70 uart0 = ser_clk;
71 else
72 /* Internal UART clock */
73 uart0 = plb / CPC0_CR0_UDIV(cr0);
74
75 if (cr0 & CPC0_CR0_U1EC)
76 /* External UART clock */
77 uart1 = ser_clk;
78 else
79 /* Internal UART clock */
80 uart1 = plb / CPC0_CR0_UDIV(cr0);
81
82 printf("PPC440GP: SysClk = %dMHz (%x)\n\r",
83 (sysclk + 500000) / 1000000, sysclk);
84
85 dt_fixup_cpu_clocks(cpu, tb, 0);
86
87 dt_fixup_clock("/plb", plb);
88 dt_fixup_clock("/plb/opb", opb);
89 dt_fixup_clock("/plb/opb/ebc", ebc);
90 dt_fixup_clock("/plb/opb/serial@40000200", uart0);
91 dt_fixup_clock("/plb/opb/serial@40000300", uart1);
92}
93
94#define EBONY_FPGA_PATH "/plb/opb/ebc/fpga" 34#define EBONY_FPGA_PATH "/plb/opb/ebc/fpga"
95#define EBONY_FPGA_FLASH_SEL 0x01 35#define EBONY_FPGA_FLASH_SEL 0x01
96#define EBONY_SMALL_FLASH_PATH "/plb/opb/ebc/small-flash" 36#define EBONY_SMALL_FLASH_PATH "/plb/opb/ebc/small-flash"