2 * Support code for virtual Ranchu board for MIPS.
4 * Author: Miodrag Dinic <miodrag.dinic@mips.com>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version.
12 #include <linux/of_address.h>
13 #include <linux/types.h>
15 #include <asm/machine.h>
16 #include <asm/mipsregs.h>
19 #define GOLDFISH_TIMER_LOW 0x00
20 #define GOLDFISH_TIMER_HIGH 0x04
22 static __init u64
read_rtc_time(void __iomem
*base
)
28 * Reading the low address latches the high value
29 * as well so there is no fear that we may read
30 * inaccurate high value.
32 time_low
= readl(base
+ GOLDFISH_TIMER_LOW
);
33 time_high
= readl(base
+ GOLDFISH_TIMER_HIGH
);
35 return ((u64
)time_high
<< 32) | time_low
;
38 static __init
unsigned int ranchu_measure_hpt_freq(void)
40 u64 rtc_start
, rtc_current
, rtc_delta
;
41 unsigned int start
, count
;
42 struct device_node
*np
;
43 void __iomem
*rtc_base
;
45 np
= of_find_compatible_node(NULL
, NULL
, "google,goldfish-rtc");
47 panic("%s(): Failed to find 'google,goldfish-rtc' dt node!",
50 rtc_base
= of_iomap(np
, 0);
52 panic("%s(): Failed to ioremap Goldfish RTC base!", __func__
);
55 * Poll the nanosecond resolution RTC for one
56 * second to calibrate the CPU frequency.
58 rtc_start
= read_rtc_time(rtc_base
);
59 start
= read_c0_count();
62 rtc_current
= read_rtc_time(rtc_base
);
63 rtc_delta
= rtc_current
- rtc_start
;
64 } while (rtc_delta
< NSEC_PER_SEC
);
66 count
= read_c0_count() - start
;
69 * Make sure the frequency will be a round number.
70 * Without this correction, the returned value may vary
71 * between subsequent emulation executions.
73 * TODO: Set this value using device tree.
76 count
-= count
% 10000;
83 static const struct of_device_id ranchu_of_match
[] __initconst
= {
85 .compatible
= "mti,ranchu",
90 MIPS_MACHINE(ranchu
) = {
91 .matches
= ranchu_of_match
,
92 .measure_hpt_freq
= ranchu_measure_hpt_freq
,