]> Pileus Git - ~andy/linux/blob - arch/arm/mach-omap2/timer.c
ARM: SPEAr: conditionalize SMP code
[~andy/linux] / arch / arm / mach-omap2 / timer.c
1 /*
2  * linux/arch/arm/mach-omap2/timer.c
3  *
4  * OMAP2 GP timer support.
5  *
6  * Copyright (C) 2009 Nokia Corporation
7  *
8  * Update to use new clocksource/clockevent layers
9  * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
10  * Copyright (C) 2007 MontaVista Software, Inc.
11  *
12  * Original driver:
13  * Copyright (C) 2005 Nokia Corporation
14  * Author: Paul Mundt <paul.mundt@nokia.com>
15  *         Juha Yrjölä <juha.yrjola@nokia.com>
16  * OMAP Dual-mode timer framework support by Timo Teras
17  *
18  * Some parts based off of TI's 24xx code:
19  *
20  * Copyright (C) 2004-2009 Texas Instruments, Inc.
21  *
22  * Roughly modelled after the OMAP1 MPU timer code.
23  * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
24  *
25  * This file is subject to the terms and conditions of the GNU General Public
26  * License. See the file "COPYING" in the main directory of this archive
27  * for more details.
28  */
29 #include <linux/init.h>
30 #include <linux/time.h>
31 #include <linux/interrupt.h>
32 #include <linux/err.h>
33 #include <linux/clk.h>
34 #include <linux/delay.h>
35 #include <linux/irq.h>
36 #include <linux/clocksource.h>
37 #include <linux/clockchips.h>
38 #include <linux/slab.h>
39 #include <linux/of.h>
40 #include <linux/of_address.h>
41 #include <linux/of_irq.h>
42 #include <linux/platform_device.h>
43 #include <linux/platform_data/dmtimer-omap.h>
44
45 #include <asm/mach/time.h>
46 #include <asm/smp_twd.h>
47 #include <asm/sched_clock.h>
48
49 #include <asm/arch_timer.h>
50 #include "omap_hwmod.h"
51 #include "omap_device.h"
52 #include <plat/counter-32k.h>
53 #include <plat/dmtimer.h>
54 #include "omap-pm.h"
55
56 #include "soc.h"
57 #include "common.h"
58 #include "powerdomain.h"
59
60 /* Parent clocks, eventually these will come from the clock framework */
61
62 #define OMAP2_MPU_SOURCE        "sys_ck"
63 #define OMAP3_MPU_SOURCE        OMAP2_MPU_SOURCE
64 #define OMAP4_MPU_SOURCE        "sys_clkin_ck"
65 #define OMAP5_MPU_SOURCE        "sys_clkin"
66 #define OMAP2_32K_SOURCE        "func_32k_ck"
67 #define OMAP3_32K_SOURCE        "omap_32k_fck"
68 #define OMAP4_32K_SOURCE        "sys_32k_ck"
69
70 #define REALTIME_COUNTER_BASE                           0x48243200
71 #define INCREMENTER_NUMERATOR_OFFSET                    0x10
72 #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET           0x14
73 #define NUMERATOR_DENUMERATOR_MASK                      0xfffff000
74
75 /* Clockevent code */
76
77 static struct omap_dm_timer clkev;
78 static struct clock_event_device clockevent_gpt;
79
80 static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
81 {
82         struct clock_event_device *evt = &clockevent_gpt;
83
84         __omap_dm_timer_write_status(&clkev, OMAP_TIMER_INT_OVERFLOW);
85
86         evt->event_handler(evt);
87         return IRQ_HANDLED;
88 }
89
90 static struct irqaction omap2_gp_timer_irq = {
91         .name           = "gp_timer",
92         .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
93         .handler        = omap2_gp_timer_interrupt,
94 };
95
96 static int omap2_gp_timer_set_next_event(unsigned long cycles,
97                                          struct clock_event_device *evt)
98 {
99         __omap_dm_timer_load_start(&clkev, OMAP_TIMER_CTRL_ST,
100                                    0xffffffff - cycles, OMAP_TIMER_POSTED);
101
102         return 0;
103 }
104
105 static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
106                                     struct clock_event_device *evt)
107 {
108         u32 period;
109
110         __omap_dm_timer_stop(&clkev, OMAP_TIMER_POSTED, clkev.rate);
111
112         switch (mode) {
113         case CLOCK_EVT_MODE_PERIODIC:
114                 period = clkev.rate / HZ;
115                 period -= 1;
116                 /* Looks like we need to first set the load value separately */
117                 __omap_dm_timer_write(&clkev, OMAP_TIMER_LOAD_REG,
118                                       0xffffffff - period, OMAP_TIMER_POSTED);
119                 __omap_dm_timer_load_start(&clkev,
120                                         OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST,
121                                         0xffffffff - period, OMAP_TIMER_POSTED);
122                 break;
123         case CLOCK_EVT_MODE_ONESHOT:
124                 break;
125         case CLOCK_EVT_MODE_UNUSED:
126         case CLOCK_EVT_MODE_SHUTDOWN:
127         case CLOCK_EVT_MODE_RESUME:
128                 break;
129         }
130 }
131
132 static struct clock_event_device clockevent_gpt = {
133         .name           = "gp_timer",
134         .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
135         .rating         = 300,
136         .set_next_event = omap2_gp_timer_set_next_event,
137         .set_mode       = omap2_gp_timer_set_mode,
138 };
139
140 static struct property device_disabled = {
141         .name = "status",
142         .length = sizeof("disabled"),
143         .value = "disabled",
144 };
145
146 static struct of_device_id omap_timer_match[] __initdata = {
147         { .compatible = "ti,omap2-timer", },
148         { }
149 };
150
151 /**
152  * omap_get_timer_dt - get a timer using device-tree
153  * @match       - device-tree match structure for matching a device type
154  * @property    - optional timer property to match
155  *
156  * Helper function to get a timer during early boot using device-tree for use
157  * as kernel system timer. Optionally, the property argument can be used to
158  * select a timer with a specific property. Once a timer is found then mark
159  * the timer node in device-tree as disabled, to prevent the kernel from
160  * registering this timer as a platform device and so no one else can use it.
161  */
162 static struct device_node * __init omap_get_timer_dt(struct of_device_id *match,
163                                                      const char *property)
164 {
165         struct device_node *np;
166
167         for_each_matching_node(np, match) {
168                 if (!of_device_is_available(np))
169                         continue;
170
171                 if (property && !of_get_property(np, property, NULL))
172                         continue;
173
174                 of_add_property(np, &device_disabled);
175                 return np;
176         }
177
178         return NULL;
179 }
180
181 /**
182  * omap_dmtimer_init - initialisation function when device tree is used
183  *
184  * For secure OMAP3 devices, timers with device type "timer-secure" cannot
185  * be used by the kernel as they are reserved. Therefore, to prevent the
186  * kernel registering these devices remove them dynamically from the device
187  * tree on boot.
188  */
189 static void __init omap_dmtimer_init(void)
190 {
191         struct device_node *np;
192
193         if (!cpu_is_omap34xx())
194                 return;
195
196         /* If we are a secure device, remove any secure timer nodes */
197         if ((omap_type() != OMAP2_DEVICE_TYPE_GP)) {
198                 np = omap_get_timer_dt(omap_timer_match, "ti,timer-secure");
199                 if (np)
200                         of_node_put(np);
201         }
202 }
203
204 /**
205  * omap_dm_timer_get_errata - get errata flags for a timer
206  *
207  * Get the timer errata flags that are specific to the OMAP device being used.
208  */
209 static u32 __init omap_dm_timer_get_errata(void)
210 {
211         if (cpu_is_omap24xx())
212                 return 0;
213
214         return OMAP_TIMER_ERRATA_I103_I767;
215 }
216
217 static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
218                                                 int gptimer_id,
219                                                 const char *fck_source,
220                                                 const char *property,
221                                                 int posted)
222 {
223         char name[10]; /* 10 = sizeof("gptXX_Xck0") */
224         const char *oh_name;
225         struct device_node *np;
226         struct omap_hwmod *oh;
227         struct resource irq, mem;
228         int r = 0;
229
230         if (of_have_populated_dt()) {
231                 np = omap_get_timer_dt(omap_timer_match, property);
232                 if (!np)
233                         return -ENODEV;
234
235                 of_property_read_string_index(np, "ti,hwmods", 0, &oh_name);
236                 if (!oh_name)
237                         return -ENODEV;
238
239                 timer->irq = irq_of_parse_and_map(np, 0);
240                 if (!timer->irq)
241                         return -ENXIO;
242
243                 timer->io_base = of_iomap(np, 0);
244
245                 of_node_put(np);
246         } else {
247                 if (omap_dm_timer_reserve_systimer(gptimer_id))
248                         return -ENODEV;
249
250                 sprintf(name, "timer%d", gptimer_id);
251                 oh_name = name;
252         }
253
254         oh = omap_hwmod_lookup(oh_name);
255         if (!oh)
256                 return -ENODEV;
257
258         if (!of_have_populated_dt()) {
259                 r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL,
260                                                    &irq);
261                 if (r)
262                         return -ENXIO;
263                 timer->irq = irq.start;
264
265                 r = omap_hwmod_get_resource_byname(oh, IORESOURCE_MEM, NULL,
266                                                    &mem);
267                 if (r)
268                         return -ENXIO;
269
270                 /* Static mapping, never released */
271                 timer->io_base = ioremap(mem.start, mem.end - mem.start);
272         }
273
274         if (!timer->io_base)
275                 return -ENXIO;
276
277         /* After the dmtimer is using hwmod these clocks won't be needed */
278         timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh));
279         if (IS_ERR(timer->fclk))
280                 return -ENODEV;
281
282         /* FIXME: Need to remove hard-coded test on timer ID */
283         if (gptimer_id != 12) {
284                 struct clk *src;
285
286                 src = clk_get(NULL, fck_source);
287                 if (IS_ERR(src)) {
288                         r = -EINVAL;
289                 } else {
290                         r = clk_set_parent(timer->fclk, src);
291                         if (IS_ERR_VALUE(r))
292                                 pr_warn("%s: %s cannot set source\n",
293                                         __func__, oh->name);
294                         clk_put(src);
295                 }
296         }
297
298         omap_hwmod_setup_one(oh_name);
299         omap_hwmod_enable(oh);
300         __omap_dm_timer_init_regs(timer);
301
302         if (posted)
303                 __omap_dm_timer_enable_posted(timer);
304
305         /* Check that the intended posted configuration matches the actual */
306         if (posted != timer->posted)
307                 return -EINVAL;
308
309         timer->rate = clk_get_rate(timer->fclk);
310         timer->reserved = 1;
311
312         return r;
313 }
314
315 static void __init omap2_gp_clockevent_init(int gptimer_id,
316                                                 const char *fck_source,
317                                                 const char *property)
318 {
319         int res;
320
321         clkev.errata = omap_dm_timer_get_errata();
322
323         /*
324          * For clock-event timers we never read the timer counter and
325          * so we are not impacted by errata i103 and i767. Therefore,
326          * we can safely ignore this errata for clock-event timers.
327          */
328         __omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767);
329
330         res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source, property,
331                                      OMAP_TIMER_POSTED);
332         BUG_ON(res);
333
334         omap2_gp_timer_irq.dev_id = &clkev;
335         setup_irq(clkev.irq, &omap2_gp_timer_irq);
336
337         __omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
338
339         clockevent_gpt.cpumask = cpu_possible_mask;
340         clockevent_gpt.irq = omap_dm_timer_get_irq(&clkev);
341         clockevents_config_and_register(&clockevent_gpt, clkev.rate,
342                                         3, /* Timer internal resynch latency */
343                                         0xffffffff);
344
345         pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n",
346                 gptimer_id, clkev.rate);
347 }
348
349 /* Clocksource code */
350 static struct omap_dm_timer clksrc;
351 static bool use_gptimer_clksrc;
352
353 /*
354  * clocksource
355  */
356 static cycle_t clocksource_read_cycles(struct clocksource *cs)
357 {
358         return (cycle_t)__omap_dm_timer_read_counter(&clksrc,
359                                                      OMAP_TIMER_NONPOSTED);
360 }
361
362 static struct clocksource clocksource_gpt = {
363         .name           = "gp_timer",
364         .rating         = 300,
365         .read           = clocksource_read_cycles,
366         .mask           = CLOCKSOURCE_MASK(32),
367         .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
368 };
369
370 static u32 notrace dmtimer_read_sched_clock(void)
371 {
372         if (clksrc.reserved)
373                 return __omap_dm_timer_read_counter(&clksrc,
374                                                     OMAP_TIMER_NONPOSTED);
375
376         return 0;
377 }
378
379 static struct of_device_id omap_counter_match[] __initdata = {
380         { .compatible = "ti,omap-counter32k", },
381         { }
382 };
383
384 /* Setup free-running counter for clocksource */
385 static int __init __maybe_unused omap2_sync32k_clocksource_init(void)
386 {
387         int ret;
388         struct device_node *np = NULL;
389         struct omap_hwmod *oh;
390         void __iomem *vbase;
391         const char *oh_name = "counter_32k";
392
393         /*
394          * If device-tree is present, then search the DT blob
395          * to see if the 32kHz counter is supported.
396          */
397         if (of_have_populated_dt()) {
398                 np = omap_get_timer_dt(omap_counter_match, NULL);
399                 if (!np)
400                         return -ENODEV;
401
402                 of_property_read_string_index(np, "ti,hwmods", 0, &oh_name);
403                 if (!oh_name)
404                         return -ENODEV;
405         }
406
407         /*
408          * First check hwmod data is available for sync32k counter
409          */
410         oh = omap_hwmod_lookup(oh_name);
411         if (!oh || oh->slaves_cnt == 0)
412                 return -ENODEV;
413
414         omap_hwmod_setup_one(oh_name);
415
416         if (np) {
417                 vbase = of_iomap(np, 0);
418                 of_node_put(np);
419         } else {
420                 vbase = omap_hwmod_get_mpu_rt_va(oh);
421         }
422
423         if (!vbase) {
424                 pr_warn("%s: failed to get counter_32k resource\n", __func__);
425                 return -ENXIO;
426         }
427
428         ret = omap_hwmod_enable(oh);
429         if (ret) {
430                 pr_warn("%s: failed to enable counter_32k module (%d)\n",
431                                                         __func__, ret);
432                 return ret;
433         }
434
435         ret = omap_init_clocksource_32k(vbase);
436         if (ret) {
437                 pr_warn("%s: failed to initialize counter_32k as a clocksource (%d)\n",
438                                                         __func__, ret);
439                 omap_hwmod_idle(oh);
440         }
441
442         return ret;
443 }
444
445 static void __init omap2_gptimer_clocksource_init(int gptimer_id,
446                                                 const char *fck_source)
447 {
448         int res;
449
450         clksrc.errata = omap_dm_timer_get_errata();
451
452         res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source, NULL,
453                                      OMAP_TIMER_NONPOSTED);
454         BUG_ON(res);
455
456         __omap_dm_timer_load_start(&clksrc,
457                                    OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0,
458                                    OMAP_TIMER_NONPOSTED);
459         setup_sched_clock(dmtimer_read_sched_clock, 32, clksrc.rate);
460
461         if (clocksource_register_hz(&clocksource_gpt, clksrc.rate))
462                 pr_err("Could not register clocksource %s\n",
463                         clocksource_gpt.name);
464         else
465                 pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n",
466                         gptimer_id, clksrc.rate);
467 }
468
469 #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER
470 /*
471  * The realtime counter also called master counter, is a free-running
472  * counter, which is related to real time. It produces the count used
473  * by the CPU local timer peripherals in the MPU cluster. The timer counts
474  * at a rate of 6.144 MHz. Because the device operates on different clocks
475  * in different power modes, the master counter shifts operation between
476  * clocks, adjusting the increment per clock in hardware accordingly to
477  * maintain a constant count rate.
478  */
479 static void __init realtime_counter_init(void)
480 {
481         void __iomem *base;
482         static struct clk *sys_clk;
483         unsigned long rate;
484         unsigned int reg, num, den;
485
486         base = ioremap(REALTIME_COUNTER_BASE, SZ_32);
487         if (!base) {
488                 pr_err("%s: ioremap failed\n", __func__);
489                 return;
490         }
491         sys_clk = clk_get(NULL, OMAP5_MPU_SOURCE);
492         if (IS_ERR(sys_clk)) {
493                 pr_err("%s: failed to get system clock handle\n", __func__);
494                 iounmap(base);
495                 return;
496         }
497
498         rate = clk_get_rate(sys_clk);
499         /* Numerator/denumerator values refer TRM Realtime Counter section */
500         switch (rate) {
501         case 1200000:
502                 num = 64;
503                 den = 125;
504                 break;
505         case 1300000:
506                 num = 768;
507                 den = 1625;
508                 break;
509         case 19200000:
510                 num = 8;
511                 den = 25;
512                 break;
513         case 2600000:
514                 num = 384;
515                 den = 1625;
516                 break;
517         case 2700000:
518                 num = 256;
519                 den = 1125;
520                 break;
521         case 38400000:
522         default:
523                 /* Program it for 38.4 MHz */
524                 num = 4;
525                 den = 25;
526                 break;
527         }
528
529         /* Program numerator and denumerator registers */
530         reg = __raw_readl(base + INCREMENTER_NUMERATOR_OFFSET) &
531                         NUMERATOR_DENUMERATOR_MASK;
532         reg |= num;
533         __raw_writel(reg, base + INCREMENTER_NUMERATOR_OFFSET);
534
535         reg = __raw_readl(base + INCREMENTER_NUMERATOR_OFFSET) &
536                         NUMERATOR_DENUMERATOR_MASK;
537         reg |= den;
538         __raw_writel(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET);
539
540         iounmap(base);
541 }
542 #else
543 static inline void __init realtime_counter_init(void)
544 {}
545 #endif
546
547 #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop,   \
548                                clksrc_nr, clksrc_src)                   \
549 void __init omap##name##_gptimer_timer_init(void)                       \
550 {                                                                       \
551         if (omap_clk_init)                                              \
552                 omap_clk_init();                                        \
553         omap_dmtimer_init();                                            \
554         omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);    \
555         omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);        \
556 }
557
558 #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop,  \
559                                 clksrc_nr, clksrc_src)                  \
560 void __init omap##name##_sync32k_timer_init(void)               \
561 {                                                                       \
562         if (omap_clk_init)                                              \
563                 omap_clk_init();                                        \
564         omap_dmtimer_init();                                            \
565         omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop);    \
566         /* Enable the use of clocksource="gp_timer" kernel parameter */ \
567         if (use_gptimer_clksrc)                                         \
568                 omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);\
569         else                                                            \
570                 omap2_sync32k_clocksource_init();                       \
571 }
572
573 #ifdef CONFIG_ARCH_OMAP2
574 OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon",
575                         2, OMAP2_MPU_SOURCE);
576 #endif /* CONFIG_ARCH_OMAP2 */
577
578 #ifdef CONFIG_ARCH_OMAP3
579 OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon",
580                         2, OMAP3_MPU_SOURCE);
581 OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure",
582                         2, OMAP3_MPU_SOURCE);
583 OMAP_SYS_GP_TIMER_INIT(3_gp, 1, OMAP3_MPU_SOURCE, "ti,timer-alwon",
584                        2, OMAP3_MPU_SOURCE);
585 #endif /* CONFIG_ARCH_OMAP3 */
586
587 #ifdef CONFIG_SOC_AM33XX
588 OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon",
589                        2, OMAP4_MPU_SOURCE);
590 #endif /* CONFIG_SOC_AM33XX */
591
592 #ifdef CONFIG_ARCH_OMAP4
593 OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon",
594                         2, OMAP4_MPU_SOURCE);
595 #ifdef CONFIG_LOCAL_TIMERS
596 static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29);
597 void __init omap4_local_timer_init(void)
598 {
599         omap4_sync32k_timer_init();
600         /* Local timers are not supprted on OMAP4430 ES1.0 */
601         if (omap_rev() != OMAP4430_REV_ES1_0) {
602                 int err;
603
604                 if (of_have_populated_dt()) {
605                         twd_local_timer_of_register();
606                         return;
607                 }
608
609                 err = twd_local_timer_register(&twd_local_timer);
610                 if (err)
611                         pr_err("twd_local_timer_register failed %d\n", err);
612         }
613 }
614 #else /* CONFIG_LOCAL_TIMERS */
615 void __init omap4_local_timer_init(void)
616 {
617         omap4_sync32k_timer_init();
618 }
619 #endif /* CONFIG_LOCAL_TIMERS */
620 #endif /* CONFIG_ARCH_OMAP4 */
621
622 #ifdef CONFIG_SOC_OMAP5
623 OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon",
624                         2, OMAP5_MPU_SOURCE);
625 void __init omap5_realtime_timer_init(void)
626 {
627         int err;
628
629         omap5_sync32k_timer_init();
630         realtime_counter_init();
631
632         err = arch_timer_of_register();
633         if (err)
634                 pr_err("%s: arch_timer_register failed %d\n", __func__, err);
635 }
636 #endif /* CONFIG_SOC_OMAP5 */
637
638 /**
639  * omap_timer_init - build and register timer device with an
640  * associated timer hwmod
641  * @oh: timer hwmod pointer to be used to build timer device
642  * @user:       parameter that can be passed from calling hwmod API
643  *
644  * Called by omap_hwmod_for_each_by_class to register each of the timer
645  * devices present in the system. The number of timer devices is known
646  * by parsing through the hwmod database for a given class name. At the
647  * end of function call memory is allocated for timer device and it is
648  * registered to the framework ready to be proved by the driver.
649  */
650 static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)
651 {
652         int id;
653         int ret = 0;
654         char *name = "omap_timer";
655         struct dmtimer_platform_data *pdata;
656         struct platform_device *pdev;
657         struct omap_timer_capability_dev_attr *timer_dev_attr;
658
659         pr_debug("%s: %s\n", __func__, oh->name);
660
661         /* on secure device, do not register secure timer */
662         timer_dev_attr = oh->dev_attr;
663         if (omap_type() != OMAP2_DEVICE_TYPE_GP && timer_dev_attr)
664                 if (timer_dev_attr->timer_capability == OMAP_TIMER_SECURE)
665                         return ret;
666
667         pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
668         if (!pdata) {
669                 pr_err("%s: No memory for [%s]\n", __func__, oh->name);
670                 return -ENOMEM;
671         }
672
673         /*
674          * Extract the IDs from name field in hwmod database
675          * and use the same for constructing ids' for the
676          * timer devices. In a way, we are avoiding usage of
677          * static variable witin the function to do the same.
678          * CAUTION: We have to be careful and make sure the
679          * name in hwmod database does not change in which case
680          * we might either make corresponding change here or
681          * switch back static variable mechanism.
682          */
683         sscanf(oh->name, "timer%2d", &id);
684
685         if (timer_dev_attr)
686                 pdata->timer_capability = timer_dev_attr->timer_capability;
687
688         pdata->timer_errata = omap_dm_timer_get_errata();
689         pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count;
690
691         pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata));
692
693         if (IS_ERR(pdev)) {
694                 pr_err("%s: Can't build omap_device for %s: %s.\n",
695                         __func__, name, oh->name);
696                 ret = -EINVAL;
697         }
698
699         kfree(pdata);
700
701         return ret;
702 }
703
704 /**
705  * omap2_dm_timer_init - top level regular device initialization
706  *
707  * Uses dedicated hwmod api to parse through hwmod database for
708  * given class name and then build and register the timer device.
709  */
710 static int __init omap2_dm_timer_init(void)
711 {
712         int ret;
713
714         /* If dtb is there, the devices will be created dynamically */
715         if (of_have_populated_dt())
716                 return -ENODEV;
717
718         ret = omap_hwmod_for_each_by_class("timer", omap_timer_init, NULL);
719         if (unlikely(ret)) {
720                 pr_err("%s: device registration failed.\n", __func__);
721                 return -EINVAL;
722         }
723
724         return 0;
725 }
726 omap_arch_initcall(omap2_dm_timer_init);
727
728 /**
729  * omap2_override_clocksource - clocksource override with user configuration
730  *
731  * Allows user to override default clocksource, using kernel parameter
732  *   clocksource="gp_timer"     (For all OMAP2PLUS architectures)
733  *
734  * Note that, here we are using same standard kernel parameter "clocksource=",
735  * and not introducing any OMAP specific interface.
736  */
737 static int __init omap2_override_clocksource(char *str)
738 {
739         if (!str)
740                 return 0;
741         /*
742          * For OMAP architecture, we only have two options
743          *    - sync_32k (default)
744          *    - gp_timer (sys_clk based)
745          */
746         if (!strcmp(str, "gp_timer"))
747                 use_gptimer_clksrc = true;
748
749         return 0;
750 }
751 early_param("clocksource", omap2_override_clocksource);