ip32-timer.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * IP32 timer calibration
  3.  *
  4.  * This file is subject to the terms and conditions of the GNU General Public
  5.  * License.  See the file "COPYING" in the main directory of this archive
  6.  * for more details.
  7.  *
  8.  * Copyright (C) 2001 Keith M Wesolowski
  9.  */
  10. #include <linux/irq.h>
  11. #include <linux/kernel.h>
  12. #include <linux/init.h>
  13. #include <asm/mipsregs.h>
  14. #include <asm/param.h>
  15. #include <asm/ip32/crime.h>
  16. #include <asm/ip32/ip32_ints.h>
  17. extern u32 cc_interval;
  18. /* An arbitrary time; this can be decreased if reliability looks good */
  19. #define WAIT_MS 10
  20. #define PER_MHZ (1000000 / 2 / HZ)
  21. void __init ip32_timer_setup (struct irqaction *irq) {
  22. u64 crime_time;
  23. u32 cc_tick;
  24. printk("Calibrating system timer... ");
  25. crime_time = crime_read_64 (CRIME_TIME) & CRIME_TIME_MASK;
  26. cc_tick = read_32bit_cp0_register (CP0_COUNT);
  27. while ((crime_read_64 (CRIME_TIME) & CRIME_TIME_MASK) - crime_time 
  28. < WAIT_MS * 1000000 / CRIME_NS_PER_TICK)
  29. ;
  30. cc_tick = read_32bit_cp0_register (CP0_COUNT) - cc_tick;
  31. cc_interval = cc_tick / HZ * (1000 / WAIT_MS);
  32. /* The round-off seems unnecessary; in testing, the error of the
  33.  * above procedure is < 100 ticks, which means it gets filtered
  34.  * out by the HZ adjustment. 
  35.  */
  36. cc_interval = (cc_interval / PER_MHZ) * PER_MHZ;
  37. printk("%d MHz CPU detectedn", (int) (cc_interval / PER_MHZ));
  38. setup_irq (CLOCK_IRQ, irq);
  39. }