11
#include <asm/mipsregs.h>
12
#include <framework/mod/options.h>
14
#include <hal/system.h>
15
#include <kernel/irq.h>
16
#include <kernel/time/clock_source.h>
17
#include <kernel/time/time.h>
19
#define CYC_PER_TICK OPTION_GET(NUMBER, cyc_per_tick)
21
#define TIMER_IRQ_INTERVAL (SYS_CLOCK / (CYC_PER_TICK * JIFFIES_PERIOD))
23
static irq_return_t clock_handler(unsigned int irq_nr, void *dev_id) {
24
mips_write_c0_compare(TIMER_IRQ_INTERVAL);
25
mips_write_c0_count(0);
27
clock_tick_handler(dev_id);
32
static cycle_t mips_clk_read(struct clock_source *cs) {
33
return (cycle_t)mips_read_c0_count();
36
static int mips_clock_setup(struct clock_source *cs) {
37
mips_write_c0_compare(TIMER_IRQ_INTERVAL);
38
mips_write_c0_count(0);
43
static struct time_event_device mips_event_device = {
44
.set_periodic = mips_clock_setup,
46
.irq_nr = MIPS_IRQN_TIMER,
49
static struct time_counter_device mips_counter_device = {
50
.read = mips_clk_read,
51
.cycle_hz = SYS_CLOCK,
54
static int mips_clock_init(struct clock_source *cs) {
55
return irq_attach(MIPS_IRQN_TIMER, clock_handler, 0, cs, "mips_clk");
58
CLOCK_SOURCE_DEF(mips_clk, mips_clock_init, NULL, &mips_event_device,
59
&mips_counter_device);