1b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn/*
2b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * OpenRISC time.c
3b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *
4b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * Linux architectural port borrowing liberally from similar works of
5b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * others.  All original copyrights apply as per the original source
6b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * declaration.
7b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *
8b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * Modifications for the OpenRISC architecture:
9b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
10b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *
11b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *      This program is free software; you can redistribute it and/or
12b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *      modify it under the terms of the GNU General Public License
13b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *      as published by the Free Software Foundation; either version
14b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *      2 of the License, or (at your option) any later version.
15b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn */
16b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
17b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/kernel.h>
18b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/time.h>
19b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/timex.h>
20b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/interrupt.h>
21b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/ftrace.h>
22b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
23b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/clocksource.h>
24b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/clockchips.h>
25b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/irq.h>
26b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <linux/io.h>
27b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
28b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn#include <asm/cpuinfo.h>
29b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
30b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic int openrisc_timer_set_next_event(unsigned long delta,
31b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn					 struct clock_event_device *dev)
32b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
33b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	u32 c;
34b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
35b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/* Read 32-bit counter value, add delta, mask off the low 28 bits.
36b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 * We're guaranteed delta won't be bigger than 28 bits because the
37b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 * generic timekeeping code ensures that for us.
38b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 */
39b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	c = mfspr(SPR_TTCR);
40b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	c += delta;
41b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	c &= SPR_TTMR_TP;
42b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
43b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/* Set counter and enable interrupt.
44b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 * Keep timer in continuous mode always.
45b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 */
46b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	mtspr(SPR_TTMR, SPR_TTMR_CR | SPR_TTMR_IE | c);
47b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
48b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	return 0;
49b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
50b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
51b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic void openrisc_timer_set_mode(enum clock_event_mode mode,
52b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn				    struct clock_event_device *evt)
53b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
54b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	switch (mode) {
55b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	case CLOCK_EVT_MODE_PERIODIC:
56b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		pr_debug(KERN_INFO "%s: periodic\n", __func__);
57b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		BUG();
58b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		break;
59b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	case CLOCK_EVT_MODE_ONESHOT:
60b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		pr_debug(KERN_INFO "%s: oneshot\n", __func__);
61b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		break;
62b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	case CLOCK_EVT_MODE_UNUSED:
63b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		pr_debug(KERN_INFO "%s: unused\n", __func__);
64b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		break;
65b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	case CLOCK_EVT_MODE_SHUTDOWN:
66b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		pr_debug(KERN_INFO "%s: shutdown\n", __func__);
67b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		break;
68b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	case CLOCK_EVT_MODE_RESUME:
69b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		pr_debug(KERN_INFO "%s: resume\n", __func__);
70b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		break;
71b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	}
72b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
73b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
74b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn/* This is the clock event device based on the OR1K tick timer.
75b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * As the timer is being used as a continuous clock-source (required for HR
76b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * timers) we cannot enable the PERIODIC feature.  The tick timer can run using
77b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * one-shot events, so no problem.
78b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn */
79b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
80b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic struct clock_event_device clockevent_openrisc_timer = {
81b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.name = "openrisc_timer_clockevent",
82b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.features = CLOCK_EVT_FEAT_ONESHOT,
83b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.rating = 300,
84b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.set_next_event = openrisc_timer_set_next_event,
85b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.set_mode = openrisc_timer_set_mode,
86b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn};
87b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
88b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic inline void timer_ack(void)
89b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
90b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/* Clear the IP bit and disable further interrupts */
91b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/* This can be done very simply... we just need to keep the timer
92b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	   running, so just maintain the CR bits while clearing the rest
93b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	   of the register
94b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 */
95b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	mtspr(SPR_TTMR, SPR_TTMR_CR);
96b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
97b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
98b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn/*
99b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * The timer interrupt is mostly handled in generic code nowadays... this
100b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * function just acknowledges the interrupt and fires the event handler that
101b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * has been set on the clockevent device by the generic time management code.
102b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *
103b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * This function needs to be called by the timer exception handler and that's
104b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * all the exception handler needs to do.
105b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn */
106b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
107b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnirqreturn_t __irq_entry timer_interrupt(struct pt_regs *regs)
108b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
109b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	struct pt_regs *old_regs = set_irq_regs(regs);
110b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	struct clock_event_device *evt = &clockevent_openrisc_timer;
111b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
112b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	timer_ack();
113b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
114b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/*
115b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 * update_process_times() expects us to have called irq_enter().
116b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	 */
117b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	irq_enter();
118b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	evt->event_handler(evt);
119b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	irq_exit();
120b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
121b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	set_irq_regs(old_regs);
122b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
123b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	return IRQ_HANDLED;
124b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
125b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
126b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic __init void openrisc_clockevent_init(void)
127b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
128754d5c2bf65847f7ff4e0047a830154abe666112Jonas Bonn	clockevent_openrisc_timer.cpumask = cpumask_of(0);
129b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
130b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/* We only have 28 bits */
131754d5c2bf65847f7ff4e0047a830154abe666112Jonas Bonn	clockevents_config_and_register(&clockevent_openrisc_timer,
132754d5c2bf65847f7ff4e0047a830154abe666112Jonas Bonn					cpuinfo.clock_frequency,
133754d5c2bf65847f7ff4e0047a830154abe666112Jonas Bonn					100, 0x0fffffff);
134754d5c2bf65847f7ff4e0047a830154abe666112Jonas Bonn
135b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
136b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
137b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn/**
138b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * Clocksource: Based on OpenRISC timer/counter
139b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn *
140b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * This sets up the OpenRISC Tick Timer as a clock source.  The tick timer
141b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn * is 32 bits wide and runs at the CPU clock frequency.
142b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn */
143b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
144b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic cycle_t openrisc_timer_read(struct clocksource *cs)
145b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
146b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	return (cycle_t) mfspr(SPR_TTCR);
147b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
148b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
149b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic struct clocksource openrisc_timer = {
150b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.name = "openrisc_timer",
151b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.rating = 200,
152b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.read = openrisc_timer_read,
153b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.mask = CLOCKSOURCE_MASK(32),
154b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	.flags = CLOCK_SOURCE_IS_CONTINUOUS,
155b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn};
156b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
157b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnstatic int __init openrisc_timer_init(void)
158b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
159b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	if (clocksource_register_hz(&openrisc_timer, cpuinfo.clock_frequency))
160b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		panic("failed to register clocksource");
161b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
162b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	/* Enable the incrementer: 'continuous' mode with interrupt disabled */
163b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	mtspr(SPR_TTMR, SPR_TTMR_CR);
164b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
165b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	return 0;
166b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
167b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
168b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonnvoid __init time_init(void)
169b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn{
170b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	u32 upr;
171b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
172b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	upr = mfspr(SPR_UPR);
173b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	if (!(upr & SPR_UPR_TTP))
174b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn		panic("Linux not supported on devices without tick timer");
175b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn
176b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	openrisc_timer_init();
177b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn	openrisc_clockevent_init();
178b731fbbd246e3aba59701bd6112a14ba02bf1c1cJonas Bonn}
179