1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License.  See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 2007 by Ralf Baechle
7 */
8#include <linux/clocksource.h>
9#include <linux/init.h>
10#include <linux/sched_clock.h>
11
12#include <asm/time.h>
13
14static cycle_t c0_hpt_read(struct clocksource *cs)
15{
16	return read_c0_count();
17}
18
19static struct clocksource clocksource_mips = {
20	.name		= "MIPS",
21	.read		= c0_hpt_read,
22	.mask		= CLOCKSOURCE_MASK(32),
23	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
24};
25
26static u64 notrace r4k_read_sched_clock(void)
27{
28	return read_c0_count();
29}
30
31int __init init_r4k_clocksource(void)
32{
33	if (!cpu_has_counter || !mips_hpt_frequency)
34		return -ENXIO;
35
36	/* Calculate a somewhat reasonable rating value */
37	clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000;
38
39	clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
40
41	sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency);
42
43	return 0;
44}
45