Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * ip30-timer.c: Clocksource/clockevent support for the
0004  *               HEART chip in SGI Octane (IP30) systems.
0005  *
0006  * Copyright (C) 2004-2007 Stanislaw Skowronek <skylark@unaligned.org>
0007  * Copyright (C) 2009 Johannes Dickgreber <tanzy@gmx.de>
0008  * Copyright (C) 2011 Joshua Kinard <kumba@gentoo.org>
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 }