34 #define TIMER_MATCH_VAL 0x0000
35 #define TIMER_COUNT_VAL 0x0004
36 #define TIMER_ENABLE 0x0008
37 #define TIMER_ENABLE_CLR_ON_MATCH_EN BIT(1)
38 #define TIMER_ENABLE_EN BIT(0)
39 #define TIMER_CLEAR 0x000C
40 #define DGT_CLK_CTL_DIV_4 0x3
44 #define MSM_DGT_SHIFT 5
46 static void __iomem *event_base;
50 struct clock_event_device *
evt = *(
struct clock_event_device **)dev_id;
52 if (evt->mode == CLOCK_EVT_MODE_ONESHOT) {
57 evt->event_handler(evt);
61 static int msm_timer_set_next_event(
unsigned long cycles,
62 struct clock_event_device *
evt)
72 static void msm_timer_set_mode(
enum clock_event_mode
mode,
73 struct clock_event_device *
evt)
81 case CLOCK_EVT_MODE_RESUME:
82 case CLOCK_EVT_MODE_PERIODIC:
84 case CLOCK_EVT_MODE_ONESHOT:
87 case CLOCK_EVT_MODE_UNUSED:
88 case CLOCK_EVT_MODE_SHUTDOWN:
94 static struct clock_event_device msm_clockevent = {
96 .features = CLOCK_EVT_FEAT_ONESHOT,
98 .set_next_event = msm_timer_set_next_event,
99 .set_mode = msm_timer_set_mode,
103 struct clock_event_device *
evt;
107 static void __iomem *source_base;
126 .read = msm_read_timer_count,
131 #ifdef CONFIG_LOCAL_TIMERS
132 static int __cpuinit msm_local_timer_setup(
struct clock_event_device *evt)
141 evt->irq = msm_clockevent.irq;
142 evt->name =
"local_timer";
143 evt->features = msm_clockevent.features;
144 evt->rating = msm_clockevent.rating;
145 evt->set_mode = msm_timer_set_mode;
146 evt->set_next_event = msm_timer_set_next_event;
147 evt->shift = msm_clockevent.shift;
158 static void msm_local_timer_stop(
struct clock_event_device *evt)
160 evt->set_mode(CLOCK_EVT_MODE_UNUSED, evt);
165 .setup = msm_local_timer_setup,
166 .stop = msm_local_timer_stop,
172 return msm_clocksource.
read(&msm_clocksource);
175 static void __init msm_timer_init(
u32 dgt_hz,
int sched_bits,
int irq,
178 struct clock_event_device *
ce = &msm_clockevent;
190 msm_evt.percpu_evt =
alloc_percpu(
struct clock_event_device *);
191 if (!msm_evt.percpu_evt) {
192 pr_err(
"memory allocation failed for %s\n", ce->name);
197 ce->name, msm_evt.percpu_evt);
200 #ifdef CONFIG_LOCAL_TIMERS
201 local_timer_register(&msm_local_timer_ops);
212 pr_err(
"request_irq failed for %s\n", ce->name);
215 res = clocksource_register_hz(cs, dgt_hz);
217 pr_err(
"clocksource_register failed\n");
223 { .compatible =
"qcom,msm-dgt" },
227 static const struct of_device_id msm_gpt_match[] __initconst = {
232 static void __init msm_dt_timer_init(
void)
243 pr_err(
"Can't find GPT DT node\n");
249 pr_err(
"Failed to map event base\n");
255 pr_err(
"Can't get irq\n");
262 pr_err(
"Can't find DGT DT node\n");
266 if (of_property_read_u32(np,
"cpu-offset", &percpu_offset))
270 pr_err(
"Failed to parse DGT resource\n");
274 source_base =
ioremap(res.start + percpu_offset, resource_size(&res));
276 pr_err(
"Failed to map source base\n");
281 dgt_clk_ctl =
ioremap(res.start + percpu_offset,
282 resource_size(&res));
284 pr_err(
"Failed to map DGT control base\n");
291 if (of_property_read_u32(np,
"clock-frequency", &freq)) {
292 pr_err(
"Unknown frequency\n");
297 msm_timer_init(freq, 32, irq, !!percpu_offset);
301 .init = msm_dt_timer_init
309 pr_err(
"Failed to map event base\n");
314 pr_err(
"Failed to map source base\n");
320 static void __init msm7x01_timer_init(
void)
324 if (msm_timer_map(0xc0100000, 0xc0100010))
326 cs->
read = msm_read_timer_count_shift;
334 .init = msm7x01_timer_init
337 static void __init msm7x30_timer_init(
void)
339 if (msm_timer_map(0xc0100004, 0xc0100024))
341 msm_timer_init(24576000 / 4, 32, 1,
false);
345 .init = msm7x30_timer_init
348 static void __init qsd8x50_timer_init(
void)
350 if (msm_timer_map(0xAC100000, 0xAC100010))
352 msm_timer_init(19200000 / 4, 32, 7,
false);
356 .init = qsd8x50_timer_init