1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * ip30-timer.c: Clocksource/clockevent support for the |
4 | * HEART chip in SGI Octane (IP30) systems. |
5 | * |
6 | * Copyright (C) 2004-2007 Stanislaw Skowronek <skylark@unaligned.org> |
7 | * Copyright (C) 2009 Johannes Dickgreber <tanzy@gmx.de> |
8 | * Copyright (C) 2011 Joshua Kinard <kumba@gentoo.org> |
9 | */ |
10 | |
11 | #include <linux/clocksource.h> |
12 | #include <linux/cpumask.h> |
13 | #include <linux/init.h> |
14 | #include <linux/kernel.h> |
15 | #include <linux/percpu.h> |
16 | #include <linux/sched_clock.h> |
17 | |
18 | #include <asm/time.h> |
19 | #include <asm/cevt-r4k.h> |
20 | #include <asm/sgi/heart.h> |
21 | |
22 | static u64 ip30_heart_counter_read(struct clocksource *cs) |
23 | { |
24 | return heart_read(&heart_regs->count); |
25 | } |
26 | |
27 | struct clocksource ip30_heart_clocksource = { |
28 | .name = "HEART" , |
29 | .rating = 400, |
30 | .read = ip30_heart_counter_read, |
31 | .mask = CLOCKSOURCE_MASK(52), |
32 | .flags = (CLOCK_SOURCE_IS_CONTINUOUS | CLOCK_SOURCE_VALID_FOR_HRES), |
33 | }; |
34 | |
35 | static u64 notrace ip30_heart_read_sched_clock(void) |
36 | { |
37 | return heart_read(&heart_regs->count); |
38 | } |
39 | |
40 | static void __init ip30_heart_clocksource_init(void) |
41 | { |
42 | struct clocksource *cs = &ip30_heart_clocksource; |
43 | |
44 | clocksource_register_hz(cs, hz: HEART_CYCLES_PER_SEC); |
45 | |
46 | sched_clock_register(read: ip30_heart_read_sched_clock, bits: 52, |
47 | rate: HEART_CYCLES_PER_SEC); |
48 | } |
49 | |
50 | void __init plat_time_init(void) |
51 | { |
52 | int irq = get_c0_compare_int(); |
53 | |
54 | cp0_timer_irq_installed = 1; |
55 | c0_compare_irqaction.percpu_dev_id = &mips_clockevent_device; |
56 | c0_compare_irqaction.flags &= ~IRQF_SHARED; |
57 | irq_set_handler(irq, handle_percpu_devid_irq); |
58 | irq_set_percpu_devid(irq); |
59 | setup_percpu_irq(irq, &c0_compare_irqaction); |
60 | enable_percpu_irq(irq, IRQ_TYPE_NONE); |
61 | |
62 | ip30_heart_clocksource_init(); |
63 | } |
64 | |