diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/powerpc/boot/4xx.c | 81 | ||||
| -rw-r--r-- | arch/powerpc/boot/4xx.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/boot/dcr.h | 5 |
3 files changed, 80 insertions, 7 deletions
diff --git a/arch/powerpc/boot/4xx.c b/arch/powerpc/boot/4xx.c index 33f25b671340..61a4045324cb 100644 --- a/arch/powerpc/boot/4xx.c +++ b/arch/powerpc/boot/4xx.c | |||
| @@ -499,20 +499,45 @@ void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk) | |||
| 499 | u32 pllmr = mfdcr(DCRN_CPC0_PLLMR); | 499 | u32 pllmr = mfdcr(DCRN_CPC0_PLLMR); |
| 500 | u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0); | 500 | u32 cpc0_cr0 = mfdcr(DCRN_405_CPC0_CR0); |
| 501 | u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1); | 501 | u32 cpc0_cr1 = mfdcr(DCRN_405_CPC0_CR1); |
| 502 | u32 psr = mfdcr(DCRN_405_CPC0_PSR); | ||
| 502 | u32 cpu, plb, opb, ebc, tb, uart0, uart1, m; | 503 | u32 cpu, plb, opb, ebc, tb, uart0, uart1, m; |
| 503 | u32 fwdv, fbdv, cbdv, opdv, epdv, udiv; | 504 | u32 fwdv, fwdvb, fbdv, cbdv, opdv, epdv, ppdv, udiv; |
| 504 | 505 | ||
| 505 | fwdv = (8 - ((pllmr & 0xe0000000) >> 29)); | 506 | fwdv = (8 - ((pllmr & 0xe0000000) >> 29)); |
| 506 | fbdv = (pllmr & 0x1e000000) >> 25; | 507 | fbdv = (pllmr & 0x1e000000) >> 25; |
| 507 | cbdv = ((pllmr & 0x00060000) >> 17) + 1; | 508 | if (fbdv == 0) |
| 508 | opdv = ((pllmr & 0x00018000) >> 15) + 1; | 509 | fbdv = 16; |
| 509 | epdv = ((pllmr & 0x00001800) >> 13) + 2; | 510 | cbdv = ((pllmr & 0x00060000) >> 17) + 1; /* CPU:PLB */ |
| 511 | opdv = ((pllmr & 0x00018000) >> 15) + 1; /* PLB:OPB */ | ||
| 512 | ppdv = ((pllmr & 0x00001800) >> 13) + 1; /* PLB:PCI */ | ||
| 513 | epdv = ((pllmr & 0x00001800) >> 11) + 2; /* PLB:EBC */ | ||
| 510 | udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1; | 514 | udiv = ((cpc0_cr0 & 0x3e) >> 1) + 1; |
| 511 | 515 | ||
| 512 | m = fwdv * fbdv * cbdv; | 516 | /* check for 405GPr */ |
| 517 | if ((mfpvr() & 0xfffffff0) == (0x50910951 & 0xfffffff0)) { | ||
| 518 | fwdvb = 8 - (pllmr & 0x00000007); | ||
| 519 | if (!(psr & 0x00001000)) /* PCI async mode enable == 0 */ | ||
| 520 | if (psr & 0x00000020) /* New mode enable */ | ||
| 521 | m = fwdvb * 2 * ppdv; | ||
| 522 | else | ||
| 523 | m = fwdvb * cbdv * ppdv; | ||
| 524 | else if (psr & 0x00000020) /* New mode enable */ | ||
| 525 | if (psr & 0x00000800) /* PerClk synch mode */ | ||
| 526 | m = fwdvb * 2 * epdv; | ||
| 527 | else | ||
| 528 | m = fbdv * fwdv; | ||
| 529 | else if (epdv == fbdv) | ||
| 530 | m = fbdv * cbdv * epdv; | ||
| 531 | else | ||
| 532 | m = fbdv * fwdvb * cbdv; | ||
| 513 | 533 | ||
| 514 | cpu = sys_clk * m / fwdv; | 534 | cpu = sys_clk * m / fwdv; |
| 515 | plb = cpu / cbdv; | 535 | plb = sys_clk * m / (fwdvb * cbdv); |
| 536 | } else { | ||
| 537 | m = fwdv * fbdv * cbdv; | ||
| 538 | cpu = sys_clk * m / fwdv; | ||
| 539 | plb = cpu / cbdv; | ||
| 540 | } | ||
| 516 | opb = plb / opdv; | 541 | opb = plb / opdv; |
| 517 | ebc = plb / epdv; | 542 | ebc = plb / epdv; |
| 518 | 543 | ||
| @@ -541,3 +566,45 @@ void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk) | |||
| 541 | dt_fixup_clock("/plb/opb/serial@ef600400", uart1); | 566 | dt_fixup_clock("/plb/opb/serial@ef600400", uart1); |
| 542 | } | 567 | } |
| 543 | 568 | ||
| 569 | |||
| 570 | void ibm405ep_fixup_clocks(unsigned int sys_clk) | ||
| 571 | { | ||
| 572 | u32 pllmr0 = mfdcr(DCRN_CPC0_PLLMR0); | ||
| 573 | u32 pllmr1 = mfdcr(DCRN_CPC0_PLLMR1); | ||
| 574 | u32 cpc0_ucr = mfdcr(DCRN_CPC0_UCR); | ||
| 575 | u32 cpu, plb, opb, ebc, uart0, uart1; | ||
| 576 | u32 fwdva, fwdvb, fbdv, cbdv, opdv, epdv; | ||
| 577 | u32 pllmr0_ccdv, tb, m; | ||
| 578 | |||
| 579 | fwdva = 8 - ((pllmr1 & 0x00070000) >> 16); | ||
| 580 | fwdvb = 8 - ((pllmr1 & 0x00007000) >> 12); | ||
| 581 | fbdv = (pllmr1 & 0x00f00000) >> 20; | ||
| 582 | if (fbdv == 0) | ||
| 583 | fbdv = 16; | ||
| 584 | |||
| 585 | cbdv = ((pllmr0 & 0x00030000) >> 16) + 1; /* CPU:PLB */ | ||
| 586 | epdv = ((pllmr0 & 0x00000300) >> 8) + 2; /* PLB:EBC */ | ||
| 587 | opdv = ((pllmr0 & 0x00003000) >> 12) + 1; /* PLB:OPB */ | ||
| 588 | |||
| 589 | m = fbdv * fwdvb; | ||
| 590 | |||
| 591 | pllmr0_ccdv = ((pllmr0 & 0x00300000) >> 20) + 1; | ||
| 592 | if (pllmr1 & 0x80000000) | ||
| 593 | cpu = sys_clk * m / (fwdva * pllmr0_ccdv); | ||
| 594 | else | ||
| 595 | cpu = sys_clk / pllmr0_ccdv; | ||
| 596 | |||
| 597 | plb = cpu / cbdv; | ||
| 598 | opb = plb / opdv; | ||
| 599 | ebc = plb / epdv; | ||
| 600 | tb = cpu; | ||
| 601 | uart0 = cpu / (cpc0_ucr & 0x0000007f); | ||
| 602 | uart1 = cpu / ((cpc0_ucr & 0x00007f00) >> 8); | ||
| 603 | |||
| 604 | dt_fixup_cpu_clocks(cpu, tb, 0); | ||
| 605 | dt_fixup_clock("/plb", plb); | ||
| 606 | dt_fixup_clock("/plb/opb", opb); | ||
| 607 | dt_fixup_clock("/plb/ebc", ebc); | ||
| 608 | dt_fixup_clock("/plb/opb/serial@ef600300", uart0); | ||
| 609 | dt_fixup_clock("/plb/opb/serial@ef600400", uart1); | ||
| 610 | } | ||
diff --git a/arch/powerpc/boot/4xx.h b/arch/powerpc/boot/4xx.h index fbe0632621ca..2606e64f0c4b 100644 --- a/arch/powerpc/boot/4xx.h +++ b/arch/powerpc/boot/4xx.h | |||
| @@ -20,6 +20,7 @@ void ibm4xx_quiesce_eth(u32 *emac0, u32 *emac1); | |||
| 20 | void ibm4xx_fixup_ebc_ranges(const char *ebc); | 20 | void ibm4xx_fixup_ebc_ranges(const char *ebc); |
| 21 | 21 | ||
| 22 | void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk); | 22 | void ibm405gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk); |
| 23 | void ibm405ep_fixup_clocks(unsigned int sys_clk); | ||
| 23 | void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk); | 24 | void ibm440gp_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk); |
| 24 | void ibm440ep_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk, | 25 | void ibm440ep_fixup_clocks(unsigned int sys_clk, unsigned int ser_clk, |
| 25 | unsigned int tmr_clk); | 26 | unsigned int tmr_clk); |
diff --git a/arch/powerpc/boot/dcr.h b/arch/powerpc/boot/dcr.h index 55655f78505a..95b9f5344016 100644 --- a/arch/powerpc/boot/dcr.h +++ b/arch/powerpc/boot/dcr.h | |||
| @@ -146,7 +146,12 @@ static const unsigned long sdram_bxcr[] = { SDRAM0_B0CR, SDRAM0_B1CR, | |||
| 146 | #define DCRN_CPC0_PLLMR 0xb0 | 146 | #define DCRN_CPC0_PLLMR 0xb0 |
| 147 | #define DCRN_405_CPC0_CR0 0xb1 | 147 | #define DCRN_405_CPC0_CR0 0xb1 |
| 148 | #define DCRN_405_CPC0_CR1 0xb2 | 148 | #define DCRN_405_CPC0_CR1 0xb2 |
| 149 | #define DCRN_405_CPC0_PSR 0xb4 | ||
| 149 | 150 | ||
| 151 | /* 405EP Clocking/Power Management/Chip Control regs */ | ||
| 152 | #define DCRN_CPC0_PLLMR0 0xf0 | ||
| 153 | #define DCRN_CPC0_PLLMR1 0xf4 | ||
| 154 | #define DCRN_CPC0_UCR 0xf5 | ||
| 150 | 155 | ||
| 151 | /* 440GX Clock control etc */ | 156 | /* 440GX Clock control etc */ |
| 152 | 157 | ||
