0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/clocksource.h>
0012 #include <linux/cpumask.h>
0013 #include <linux/init.h>
0014 #include <linux/kernel.h>
0015 #include <linux/percpu.h>
0016 #include <linux/sched_clock.h>
0017
0018 #include <asm/time.h>
0019 #include <asm/cevt-r4k.h>
0020 #include <asm/sgi/heart.h>
0021
0022 static u64 ip30_heart_counter_read(struct clocksource *cs)
0023 {
0024 return heart_read(&heart_regs->count);
0025 }
0026
0027 struct clocksource ip30_heart_clocksource = {
0028 .name = "HEART",
0029 .rating = 400,
0030 .read = ip30_heart_counter_read,
0031 .mask = CLOCKSOURCE_MASK(52),
0032 .flags = (CLOCK_SOURCE_IS_CONTINUOUS | CLOCK_SOURCE_VALID_FOR_HRES),
0033 };
0034
0035 static u64 notrace ip30_heart_read_sched_clock(void)
0036 {
0037 return heart_read(&heart_regs->count);
0038 }
0039
0040 static void __init ip30_heart_clocksource_init(void)
0041 {
0042 struct clocksource *cs = &ip30_heart_clocksource;
0043
0044 clocksource_register_hz(cs, HEART_CYCLES_PER_SEC);
0045
0046 sched_clock_register(ip30_heart_read_sched_clock, 52,
0047 HEART_CYCLES_PER_SEC);
0048 }
0049
0050 void __init plat_time_init(void)
0051 {
0052 int irq = get_c0_compare_int();
0053
0054 cp0_timer_irq_installed = 1;
0055 c0_compare_irqaction.percpu_dev_id = &mips_clockevent_device;
0056 c0_compare_irqaction.flags &= ~IRQF_SHARED;
0057 irq_set_handler(irq, handle_percpu_devid_irq);
0058 irq_set_percpu_devid(irq);
0059 setup_percpu_irq(irq, &c0_compare_irqaction);
0060 enable_percpu_irq(irq, IRQ_TYPE_NONE);
0061
0062 ip30_heart_clocksource_init();
0063 }