Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.5-rc2 117 lines 2.5 kB view raw
1#include <linux/types.h> 2#include <linux/init.h> 3#include <linux/kernel_stat.h> 4#include <linux/sched.h> 5#include <linux/spinlock.h> 6#include <linux/interrupt.h> 7#include <linux/mc146818rtc.h> 8#include <linux/smp.h> 9#include <linux/timex.h> 10 11#include <asm/hardirq.h> 12#include <asm/div64.h> 13#include <asm/cpu.h> 14#include <asm/setup.h> 15#include <asm/time.h> 16#include <asm/irq.h> 17#include <asm/mc146818-time.h> 18#include <asm/msc01_ic.h> 19 20#include <asm/mips-boards/generic.h> 21#include <asm/mips-boards/prom.h> 22#include <asm/mips-boards/simint.h> 23 24 25unsigned long cpu_khz; 26 27/* 28 * Estimate CPU frequency. Sets mips_hpt_frequency as a side-effect 29 */ 30static unsigned int __init estimate_cpu_frequency(void) 31{ 32 unsigned int prid = read_c0_prid() & 0xffff00; 33 unsigned int count; 34 35#if 1 36 /* 37 * hardwire the board frequency to 12MHz. 38 */ 39 40 if ((prid == (PRID_COMP_MIPS | PRID_IMP_20KC)) || 41 (prid == (PRID_COMP_MIPS | PRID_IMP_25KF))) 42 count = 12000000; 43 else 44 count = 6000000; 45#else 46 unsigned int flags; 47 48 local_irq_save(flags); 49 50 /* Start counter exactly on falling edge of update flag */ 51 while (CMOS_READ(RTC_REG_A) & RTC_UIP); 52 while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); 53 54 /* Start r4k counter. */ 55 write_c0_count(0); 56 57 /* Read counter exactly on falling edge of update flag */ 58 while (CMOS_READ(RTC_REG_A) & RTC_UIP); 59 while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); 60 61 count = read_c0_count(); 62 63 /* restore interrupts */ 64 local_irq_restore(flags); 65#endif 66 67 mips_hpt_frequency = count; 68 69 if ((prid != (PRID_COMP_MIPS | PRID_IMP_20KC)) && 70 (prid != (PRID_COMP_MIPS | PRID_IMP_25KF))) 71 count *= 2; 72 73 count += 5000; /* round */ 74 count -= count%10000; 75 76 return count; 77} 78 79static int mips_cpu_timer_irq; 80 81static void mips_timer_dispatch(void) 82{ 83 do_IRQ(mips_cpu_timer_irq); 84} 85 86 87unsigned __cpuinit get_c0_compare_int(void) 88{ 89#ifdef MSC01E_INT_BASE 90 if (cpu_has_veic) { 91 set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch); 92 mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR; 93 94 return mips_cpu_timer_irq; 95 } 96#endif 97 if (cpu_has_vint) 98 set_vi_handler(cp0_compare_irq, mips_timer_dispatch); 99 mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; 100 101 return mips_cpu_timer_irq; 102} 103 104void __init plat_time_init(void) 105{ 106 unsigned int est_freq; 107 108 /* Set Data mode - binary. */ 109 CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL); 110 111 est_freq = estimate_cpu_frequency(); 112 113 printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000, 114 (est_freq % 1000000) * 100 / 1000000); 115 116 cpu_khz = est_freq / 1000; 117}