diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-29 17:06:55 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-29 17:06:55 -0400 |
commit | 82798a17ad40df827d465329a20ace80497f9b32 (patch) | |
tree | 449ba69dc5a5e19a56b2a9d12d218f9486e5316d /arch/mips/mipssim/sim_time.c | |
parent | db8185360d91c01f6e482db5ee402c0ad90dec52 (diff) | |
parent | 1a3b7920fe55247d39c3e1ac1e9b8aca607d0188 (diff) |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (34 commits)
[MIPS] tb0219: Update copyright message.
[MIPS] MT: Fix bug in multithreaded kernels.
[MIPS] Alchemy: Remove CONFIG_TS_AU1X00_ADS7846 from defconfigs.
Author: Ralf Baechle <ralf@linux-mips.org>
[MIPS] sb1250: Enable GenBus IDE in defconfig.
[MIPS] vmlinux.ld.S: correctly indent .data section
[MIPS] c-r3k: Implement flush_cache_range()
[MIPS] Store sign-extend register values for PTRACE_GETREGS
[MIPS] Alchemy: Register platform devices
[MIPS] Add len and addr validation for MAP_FIXED mappings.
[MIPS] IRIX: Fix off-by-one error in signal compat code.
[MIPS] time: Replace plat_timer_setup with modern APIs.
[MIPS] time: Fix cut'n'paste bug in Sibyte clockevent driver.
[MIPS] time: Make c0_compare_int_usable faster
[MIPS] time: Fix cevt-r4k.c for 64-bit kernel
[MIPS] Sibyte: Delete {sb1250,bcm1480}_steal_irq().
[MIPS] txx9tmr clockevent/clocksource driver
[MIPS] Add mips_hpt_frequency check to mips_clockevent_init().
[MIPS] IP32: Fixes after interrupt renumbering.
[MIPS] IP27: Fix slice logic to work for arbitrary number of slices.
...
Diffstat (limited to 'arch/mips/mipssim/sim_time.c')
-rw-r--r-- | arch/mips/mipssim/sim_time.c | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/arch/mips/mipssim/sim_time.c b/arch/mips/mipssim/sim_time.c index e7fa0d1078a3..bfaafa38846f 100644 --- a/arch/mips/mipssim/sim_time.c +++ b/arch/mips/mipssim/sim_time.c | |||
@@ -75,25 +75,6 @@ static unsigned int __init estimate_cpu_frequency(void) | |||
75 | return count; | 75 | return count; |
76 | } | 76 | } |
77 | 77 | ||
78 | void __init plat_time_init(void) | ||
79 | { | ||
80 | unsigned int est_freq, flags; | ||
81 | |||
82 | local_irq_save(flags); | ||
83 | |||
84 | /* Set Data mode - binary. */ | ||
85 | CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL); | ||
86 | |||
87 | est_freq = estimate_cpu_frequency(); | ||
88 | |||
89 | printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000, | ||
90 | (est_freq % 1000000) * 100 / 1000000); | ||
91 | |||
92 | cpu_khz = est_freq / 1000; | ||
93 | |||
94 | local_irq_restore(flags); | ||
95 | } | ||
96 | |||
97 | static int mips_cpu_timer_irq; | 78 | static int mips_cpu_timer_irq; |
98 | 79 | ||
99 | static void mips_timer_dispatch(void) | 80 | static void mips_timer_dispatch(void) |
@@ -102,26 +83,37 @@ static void mips_timer_dispatch(void) | |||
102 | } | 83 | } |
103 | 84 | ||
104 | 85 | ||
105 | void __init plat_timer_setup(struct irqaction *irq) | 86 | unsigned __init get_c0_compare_int(void) |
106 | { | 87 | { |
88 | #ifdef MSC01E_INT_BASE | ||
107 | if (cpu_has_veic) { | 89 | if (cpu_has_veic) { |
108 | set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch); | 90 | set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch); |
109 | mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR; | 91 | mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR; |
110 | } else { | 92 | } else { |
93 | #endif | ||
111 | if (cpu_has_vint) | 94 | if (cpu_has_vint) |
112 | set_vi_handler(cp0_compare_irq, mips_timer_dispatch); | 95 | set_vi_handler(cp0_compare_irq, mips_timer_dispatch); |
113 | mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; | 96 | mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; |
114 | } | 97 | } |
115 | 98 | ||
116 | /* we are using the cpu counter for timer interrupts */ | 99 | return mips_cpu_timer_irq; |
117 | setup_irq(mips_cpu_timer_irq, irq); | 100 | } |
118 | 101 | ||
119 | #ifdef CONFIG_SMP | 102 | void __init plat_time_init(void) |
120 | /* irq_desc(riptor) is a global resource, when the interrupt overlaps | 103 | { |
121 | on seperate cpu's the first one tries to handle the second interrupt. | 104 | unsigned int est_freq, flags; |
122 | The effect is that the int remains disabled on the second cpu. | 105 | |
123 | Mark the interrupt with IRQ_PER_CPU to avoid any confusion */ | 106 | local_irq_save(flags); |
124 | irq_desc[mips_cpu_timer_irq].flags |= IRQ_PER_CPU; | 107 | |
125 | set_irq_handler(mips_cpu_timer_irq, handle_percpu_irq); | 108 | /* Set Data mode - binary. */ |
126 | #endif | 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 | |||
118 | local_irq_restore(flags); | ||
127 | } | 119 | } |