ARC: timer: gfrc, rtc: deuglify big endian code
[linux-2.6-microblaze.git] / arch / arc / kernel / time.c
1 /*
2  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * vineetg: Jan 1011
9  *  -sched_clock( ) no longer jiffies based. Uses the same clocksource
10  *   as gtod
11  *
12  * Rajeshwarr/Vineetg: Mar 2008
13  *  -Implemented CONFIG_GENERIC_TIME (rather deleted arch specific code)
14  *   for arch independent gettimeofday()
15  *  -Implemented CONFIG_GENERIC_CLOCKEVENTS as base for hrtimers
16  *
17  * Vineetg: Mar 2008: Forked off from time.c which now is time-jiff.c
18  */
19
20 /* ARC700 has two 32bit independent prog Timers: TIMER0 and TIMER1
21  * Each can programmed to go from @count to @limit and optionally
22  * interrupt when that happens.
23  * A write to Control Register clears the Interrupt
24  *
25  * We've designated TIMER0 for events (clockevents)
26  * while TIMER1 for free running (clocksource)
27  *
28  * Newer ARC700 cores have 64bit clk fetching RTSC insn, preferred over TIMER1
29  * which however is currently broken
30  */
31
32 #include <linux/interrupt.h>
33 #include <linux/clk.h>
34 #include <linux/clk-provider.h>
35 #include <linux/clocksource.h>
36 #include <linux/clockchips.h>
37 #include <linux/cpu.h>
38 #include <linux/of.h>
39 #include <linux/of_irq.h>
40 #include <asm/irq.h>
41 #include <asm/arcregs.h>
42
43 #include <asm/mcip.h>
44
45 /* Timer related Aux registers */
46 #define ARC_REG_TIMER0_LIMIT    0x23    /* timer 0 limit */
47 #define ARC_REG_TIMER0_CTRL     0x22    /* timer 0 control */
48 #define ARC_REG_TIMER0_CNT      0x21    /* timer 0 count */
49 #define ARC_REG_TIMER1_LIMIT    0x102   /* timer 1 limit */
50 #define ARC_REG_TIMER1_CTRL     0x101   /* timer 1 control */
51 #define ARC_REG_TIMER1_CNT      0x100   /* timer 1 count */
52
53 #define TIMER_CTRL_IE   (1 << 0) /* Interrupt when Count reaches limit */
54 #define TIMER_CTRL_NH   (1 << 1) /* Count only when CPU NOT halted */
55
56 #define ARC_TIMER_MAX   0xFFFFFFFF
57
58 static unsigned long arc_timer_freq;
59
60 static int noinline arc_get_timer_clk(struct device_node *node)
61 {
62         struct clk *clk;
63         int ret;
64
65         clk = of_clk_get(node, 0);
66         if (IS_ERR(clk)) {
67                 pr_err("timer missing clk");
68                 return PTR_ERR(clk);
69         }
70
71         ret = clk_prepare_enable(clk);
72         if (ret) {
73                 pr_err("Couldn't enable parent clk\n");
74                 return ret;
75         }
76
77         arc_timer_freq = clk_get_rate(clk);
78
79         return 0;
80 }
81
82 /********** Clock Source Device *********/
83
84 #ifdef CONFIG_ARC_HAS_GFRC
85
86 static cycle_t arc_read_gfrc(struct clocksource *cs)
87 {
88         unsigned long flags;
89         u32 l, h;
90
91         local_irq_save(flags);
92
93         __mcip_cmd(CMD_GFRC_READ_LO, 0);
94         l = read_aux_reg(ARC_REG_MCIP_READBACK);
95
96         __mcip_cmd(CMD_GFRC_READ_HI, 0);
97         h = read_aux_reg(ARC_REG_MCIP_READBACK);
98
99         local_irq_restore(flags);
100
101         return (((cycle_t)h) << 32) | l;
102 }
103
104 static struct clocksource arc_counter_gfrc = {
105         .name   = "ARConnect GFRC",
106         .rating = 400,
107         .read   = arc_read_gfrc,
108         .mask   = CLOCKSOURCE_MASK(64),
109         .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
110 };
111
112 static int __init arc_cs_setup_gfrc(struct device_node *node)
113 {
114         int exists = cpuinfo_arc700[0].extn.gfrc;
115         int ret;
116
117         if (WARN(!exists, "Global-64-bit-Ctr clocksource not detected"))
118                 return -ENXIO;
119
120         ret = arc_get_timer_clk(node);
121         if (ret)
122                 return ret;
123
124         return clocksource_register_hz(&arc_counter_gfrc, arc_timer_freq);
125 }
126 CLOCKSOURCE_OF_DECLARE(arc_gfrc, "snps,archs-timer-gfrc", arc_cs_setup_gfrc);
127
128 #endif
129
130 #ifdef CONFIG_ARC_HAS_RTC
131
132 #define AUX_RTC_CTRL    0x103
133 #define AUX_RTC_LOW     0x104
134 #define AUX_RTC_HIGH    0x105
135
136 static cycle_t arc_read_rtc(struct clocksource *cs)
137 {
138         unsigned long status;
139         u32 l, h;
140
141         /*
142          * hardware has an internal state machine which tracks readout of
143          * low/high and updates the CTRL.status if
144          *  - interrupt/exception taken between the two reads
145          *  - high increments after low has been read
146          */
147         do {
148                 l = read_aux_reg(AUX_RTC_LOW);
149                 h = read_aux_reg(AUX_RTC_HIGH);
150                 status = read_aux_reg(AUX_RTC_CTRL);
151         } while (!(status & _BITUL(31)));
152
153         return (((cycle_t)h) << 32) | l;
154 }
155
156 static struct clocksource arc_counter_rtc = {
157         .name   = "ARCv2 RTC",
158         .rating = 350,
159         .read   = arc_read_rtc,
160         .mask   = CLOCKSOURCE_MASK(64),
161         .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
162 };
163
164 static int __init arc_cs_setup_rtc(struct device_node *node)
165 {
166         int exists = cpuinfo_arc700[smp_processor_id()].extn.rtc;
167         int ret;
168
169         if (WARN(!exists, "Local-64-bit-Ctr clocksource not detected"))
170                 return -ENXIO;
171
172         /* Local to CPU hence not usable in SMP */
173         if (WARN(IS_ENABLED(CONFIG_SMP), "Local-64-bit-Ctr not usable in SMP"))
174                 return -EINVAL;
175
176         ret = arc_get_timer_clk(node);
177         if (ret)
178                 return ret;
179
180         write_aux_reg(AUX_RTC_CTRL, 1);
181
182         return clocksource_register_hz(&arc_counter_rtc, arc_timer_freq);
183 }
184 CLOCKSOURCE_OF_DECLARE(arc_rtc, "snps,archs-timer-rtc", arc_cs_setup_rtc);
185
186 #endif
187
188 /*
189  * 32bit TIMER1 to keep counting monotonically and wraparound
190  */
191
192 static cycle_t arc_read_timer1(struct clocksource *cs)
193 {
194         return (cycle_t) read_aux_reg(ARC_REG_TIMER1_CNT);
195 }
196
197 static struct clocksource arc_counter_timer1 = {
198         .name   = "ARC Timer1",
199         .rating = 300,
200         .read   = arc_read_timer1,
201         .mask   = CLOCKSOURCE_MASK(32),
202         .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
203 };
204
205 static int __init arc_cs_setup_timer1(struct device_node *node)
206 {
207         int ret;
208
209         /* Local to CPU hence not usable in SMP */
210         if (IS_ENABLED(CONFIG_SMP))
211                 return -EINVAL;
212
213         ret = arc_get_timer_clk(node);
214         if (ret)
215                 return ret;
216
217         write_aux_reg(ARC_REG_TIMER1_LIMIT, ARC_TIMER_MAX);
218         write_aux_reg(ARC_REG_TIMER1_CNT, 0);
219         write_aux_reg(ARC_REG_TIMER1_CTRL, TIMER_CTRL_NH);
220
221         return clocksource_register_hz(&arc_counter_timer1, arc_timer_freq);
222 }
223
224 /********** Clock Event Device *********/
225
226 static int arc_timer_irq;
227
228 /*
229  * Arm the timer to interrupt after @cycles
230  * The distinction for oneshot/periodic is done in arc_event_timer_ack() below
231  */
232 static void arc_timer_event_setup(unsigned int cycles)
233 {
234         write_aux_reg(ARC_REG_TIMER0_LIMIT, cycles);
235         write_aux_reg(ARC_REG_TIMER0_CNT, 0);   /* start from 0 */
236
237         write_aux_reg(ARC_REG_TIMER0_CTRL, TIMER_CTRL_IE | TIMER_CTRL_NH);
238 }
239
240
241 static int arc_clkevent_set_next_event(unsigned long delta,
242                                        struct clock_event_device *dev)
243 {
244         arc_timer_event_setup(delta);
245         return 0;
246 }
247
248 static int arc_clkevent_set_periodic(struct clock_event_device *dev)
249 {
250         /*
251          * At X Hz, 1 sec = 1000ms -> X cycles;
252          *                    10ms -> X / 100 cycles
253          */
254         arc_timer_event_setup(arc_timer_freq / HZ);
255         return 0;
256 }
257
258 static DEFINE_PER_CPU(struct clock_event_device, arc_clockevent_device) = {
259         .name                   = "ARC Timer0",
260         .features               = CLOCK_EVT_FEAT_ONESHOT |
261                                   CLOCK_EVT_FEAT_PERIODIC,
262         .rating                 = 300,
263         .set_next_event         = arc_clkevent_set_next_event,
264         .set_state_periodic     = arc_clkevent_set_periodic,
265 };
266
267 static irqreturn_t timer_irq_handler(int irq, void *dev_id)
268 {
269         /*
270          * Note that generic IRQ core could have passed @evt for @dev_id if
271          * irq_set_chip_and_handler() asked for handle_percpu_devid_irq()
272          */
273         struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
274         int irq_reenable = clockevent_state_periodic(evt);
275
276         /*
277          * Any write to CTRL reg ACks the interrupt, we rewrite the
278          * Count when [N]ot [H]alted bit.
279          * And re-arm it if perioid by [I]nterrupt [E]nable bit
280          */
281         write_aux_reg(ARC_REG_TIMER0_CTRL, irq_reenable | TIMER_CTRL_NH);
282
283         evt->event_handler(evt);
284
285         return IRQ_HANDLED;
286 }
287
288
289 static int arc_timer_starting_cpu(unsigned int cpu)
290 {
291         struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
292
293         evt->cpumask = cpumask_of(smp_processor_id());
294
295         clockevents_config_and_register(evt, arc_timer_freq, 0, ARC_TIMER_MAX);
296         enable_percpu_irq(arc_timer_irq, 0);
297         return 0;
298 }
299
300 static int arc_timer_dying_cpu(unsigned int cpu)
301 {
302         disable_percpu_irq(arc_timer_irq);
303         return 0;
304 }
305
306 /*
307  * clockevent setup for boot CPU
308  */
309 static int __init arc_clockevent_setup(struct device_node *node)
310 {
311         struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
312         int ret;
313
314         arc_timer_irq = irq_of_parse_and_map(node, 0);
315         if (arc_timer_irq <= 0) {
316                 pr_err("clockevent: missing irq");
317                 return -EINVAL;
318         }
319
320         ret = arc_get_timer_clk(node);
321         if (ret) {
322                 pr_err("clockevent: missing clk");
323                 return ret;
324         }
325
326         /* Needs apriori irq_set_percpu_devid() done in intc map function */
327         ret = request_percpu_irq(arc_timer_irq, timer_irq_handler,
328                                  "Timer0 (per-cpu-tick)", evt);
329         if (ret) {
330                 pr_err("clockevent: unable to request irq\n");
331                 return ret;
332         }
333
334         ret = cpuhp_setup_state(CPUHP_AP_ARC_TIMER_STARTING,
335                                 "AP_ARC_TIMER_STARTING",
336                                 arc_timer_starting_cpu,
337                                 arc_timer_dying_cpu);
338         if (ret) {
339                 pr_err("Failed to setup hotplug state");
340                 return ret;
341         }
342         return 0;
343 }
344
345 static int __init arc_of_timer_init(struct device_node *np)
346 {
347         static int init_count = 0;
348         int ret;
349
350         if (!init_count) {
351                 init_count = 1;
352                 ret = arc_clockevent_setup(np);
353         } else {
354                 ret = arc_cs_setup_timer1(np);
355         }
356
357         return ret;
358 }
359 CLOCKSOURCE_OF_DECLARE(arc_clkevt, "snps,arc-timer", arc_of_timer_init);
360
361 /*
362  * Called from start_kernel() - boot CPU only
363  */
364 void __init time_init(void)
365 {
366         of_clk_init(NULL);
367         clocksource_probe();
368 }