mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-12 17:26:47 -04:00
[POWERPC] 8xx: Timebase frequency should not depend on bus-frequency
m8xx_setup.c says:
/* Force all 8xx processors to use divide by 16 processor clock. */
And at the same time it is using bus-frequency for calculating
timebase. It is okay for most setups because bus-frequency is
equal to clock-frequency.
The problem emerges when cpu frequency is > 66MHz, quoting
u-boot/cpu/mpc8xx/speed.c:
if (gd->cpu_clk <= 66000000) {
sccr_reg |= SCCR_EBDF00; /* bus division factor = 1 */
gd->bus_clk = gd->cpu_clk;
} else {
sccr_reg |= SCCR_EBDF01; /* bus division factor = 2 */
gd->bus_clk = gd->cpu_clk / 2;
}
So in case of cpu clock > 66MHz, bus_clk = cpu_clk / 2. An then, from
Linux, we calculate timebase frequency as tb_freq = bus_clk / 16,
that is cpu_clk / 2 / 16, which is wrong.
This fixes the system time drifting problem on the EP885C board
running at 133MHz.
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
committed by
Paul Mackerras
parent
d9d1063d47
commit
5053037816
@@ -111,17 +111,12 @@ void __init mpc8xx_calibrate_decr(void)
|
||||
|
||||
/* Processor frequency is MHz.
|
||||
*/
|
||||
ppc_tb_freq = 50000000;
|
||||
if (!get_freq("bus-frequency", &ppc_tb_freq)) {
|
||||
printk(KERN_ERR "WARNING: Estimating decrementer frequency "
|
||||
"(not found)\n");
|
||||
}
|
||||
ppc_tb_freq /= 16;
|
||||
ppc_proc_freq = 50000000;
|
||||
if (!get_freq("clock-frequency", &ppc_proc_freq))
|
||||
printk(KERN_ERR "WARNING: Estimating processor frequency "
|
||||
"(not found)\n");
|
||||
|
||||
ppc_tb_freq = ppc_proc_freq / 16;
|
||||
printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
|
||||
|
||||
/* Perform some more timer/timebase initialization. This used
|
||||
|
||||
Reference in New Issue
Block a user