diff options
Diffstat (limited to 'arch/ppc64/kernel/time.c')
-rw-r--r-- | arch/ppc64/kernel/time.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/arch/ppc64/kernel/time.c b/arch/ppc64/kernel/time.c index 33364a7d2cd2..2348a75e050d 100644 --- a/arch/ppc64/kernel/time.c +++ b/arch/ppc64/kernel/time.c | |||
@@ -107,6 +107,9 @@ void ppc_adjtimex(void); | |||
107 | 107 | ||
108 | static unsigned adjusting_time = 0; | 108 | static unsigned adjusting_time = 0; |
109 | 109 | ||
110 | unsigned long ppc_proc_freq; | ||
111 | unsigned long ppc_tb_freq; | ||
112 | |||
110 | static __inline__ void timer_check_rtc(void) | 113 | static __inline__ void timer_check_rtc(void) |
111 | { | 114 | { |
112 | /* | 115 | /* |
@@ -472,6 +475,66 @@ int do_settimeofday(struct timespec *tv) | |||
472 | 475 | ||
473 | EXPORT_SYMBOL(do_settimeofday); | 476 | EXPORT_SYMBOL(do_settimeofday); |
474 | 477 | ||
478 | #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_MAPLE) || defined(CONFIG_PPC_BPA) | ||
479 | void __init generic_calibrate_decr(void) | ||
480 | { | ||
481 | struct device_node *cpu; | ||
482 | struct div_result divres; | ||
483 | unsigned int *fp; | ||
484 | int node_found; | ||
485 | |||
486 | /* | ||
487 | * The cpu node should have a timebase-frequency property | ||
488 | * to tell us the rate at which the decrementer counts. | ||
489 | */ | ||
490 | cpu = of_find_node_by_type(NULL, "cpu"); | ||
491 | |||
492 | ppc_tb_freq = DEFAULT_TB_FREQ; /* hardcoded default */ | ||
493 | node_found = 0; | ||
494 | if (cpu != 0) { | ||
495 | fp = (unsigned int *)get_property(cpu, "timebase-frequency", | ||
496 | NULL); | ||
497 | if (fp != 0) { | ||
498 | node_found = 1; | ||
499 | ppc_tb_freq = *fp; | ||
500 | } | ||
501 | } | ||
502 | if (!node_found) | ||
503 | printk(KERN_ERR "WARNING: Estimating decrementer frequency " | ||
504 | "(not found)\n"); | ||
505 | |||
506 | ppc_proc_freq = DEFAULT_PROC_FREQ; | ||
507 | node_found = 0; | ||
508 | if (cpu != 0) { | ||
509 | fp = (unsigned int *)get_property(cpu, "clock-frequency", | ||
510 | NULL); | ||
511 | if (fp != 0) { | ||
512 | node_found = 1; | ||
513 | ppc_proc_freq = *fp; | ||
514 | } | ||
515 | } | ||
516 | if (!node_found) | ||
517 | printk(KERN_ERR "WARNING: Estimating processor frequency " | ||
518 | "(not found)\n"); | ||
519 | |||
520 | of_node_put(cpu); | ||
521 | |||
522 | printk(KERN_INFO "time_init: decrementer frequency = %lu.%.6lu MHz\n", | ||
523 | ppc_tb_freq/1000000, ppc_tb_freq%1000000); | ||
524 | printk(KERN_INFO "time_init: processor frequency = %lu.%.6lu MHz\n", | ||
525 | ppc_proc_freq/1000000, ppc_proc_freq%1000000); | ||
526 | |||
527 | tb_ticks_per_jiffy = ppc_tb_freq / HZ; | ||
528 | tb_ticks_per_sec = tb_ticks_per_jiffy * HZ; | ||
529 | tb_ticks_per_usec = ppc_tb_freq / 1000000; | ||
530 | tb_to_us = mulhwu_scale_factor(ppc_tb_freq, 1000000); | ||
531 | div128_by_32(1024*1024, 0, tb_ticks_per_sec, &divres); | ||
532 | tb_to_xs = divres.result_low; | ||
533 | |||
534 | setup_default_decr(); | ||
535 | } | ||
536 | #endif | ||
537 | |||
475 | void __init time_init(void) | 538 | void __init time_init(void) |
476 | { | 539 | { |
477 | /* This function is only called on the boot processor */ | 540 | /* This function is only called on the boot processor */ |