2 * linux/arch/arm/mach-footbridge/dc21285-timer.c
4 * Copyright (C) 1998 Russell King.
5 * Copyright (C) 1998 Phil Blundell
7 #include <linux/clockchips.h>
8 #include <linux/clocksource.h>
9 #include <linux/init.h>
10 #include <linux/interrupt.h>
11 #include <linux/irq.h>
15 #include <asm/hardware/dec21285.h>
16 #include <asm/mach/time.h>
17 #include <asm/system_info.h>
21 static cycle_t
cksrc_dc21285_read(struct clocksource
*cs
)
23 return cs
->mask
- *CSR_TIMER2_VALUE
;
26 static int cksrc_dc21285_enable(struct clocksource
*cs
)
28 *CSR_TIMER2_LOAD
= cs
->mask
;
30 *CSR_TIMER2_CNTL
= TIMER_CNTL_ENABLE
| TIMER_CNTL_DIV16
;
34 static void cksrc_dc21285_disable(struct clocksource
*cs
)
39 static struct clocksource cksrc_dc21285
= {
40 .name
= "dc21285_timer2",
42 .read
= cksrc_dc21285_read
,
43 .enable
= cksrc_dc21285_enable
,
44 .disable
= cksrc_dc21285_disable
,
45 .mask
= CLOCKSOURCE_MASK(24),
46 .flags
= CLOCK_SOURCE_IS_CONTINUOUS
,
49 static void ckevt_dc21285_set_mode(enum clock_event_mode mode
,
50 struct clock_event_device
*c
)
53 case CLOCK_EVT_MODE_RESUME
:
54 case CLOCK_EVT_MODE_PERIODIC
:
56 *CSR_TIMER1_LOAD
= (mem_fclk_21285
+ 8 * HZ
) / (16 * HZ
);
57 *CSR_TIMER1_CNTL
= TIMER_CNTL_ENABLE
| TIMER_CNTL_AUTORELOAD
|
67 static struct clock_event_device ckevt_dc21285
= {
68 .name
= "dc21285_timer1",
69 .features
= CLOCK_EVT_FEAT_PERIODIC
,
72 .set_mode
= ckevt_dc21285_set_mode
,
75 static irqreturn_t
timer1_interrupt(int irq
, void *dev_id
)
77 struct clock_event_device
*ce
= dev_id
;
81 ce
->event_handler(ce
);
86 static struct irqaction footbridge_timer_irq
= {
87 .name
= "dc21285_timer1",
88 .handler
= timer1_interrupt
,
89 .flags
= IRQF_DISABLED
| IRQF_TIMER
| IRQF_IRQPOLL
,
90 .dev_id
= &ckevt_dc21285
,
94 * Set up timer interrupt.
96 static void __init
footbridge_timer_init(void)
98 struct clock_event_device
*ce
= &ckevt_dc21285
;
100 clocksource_register_hz(&cksrc_dc21285
, (mem_fclk_21285
+ 8) / 16);
102 setup_irq(ce
->irq
, &footbridge_timer_irq
);
104 clockevents_calc_mult_shift(ce
, mem_fclk_21285
, 5);
105 ce
->max_delta_ns
= clockevent_delta2ns(0xffffff, ce
);
106 ce
->min_delta_ns
= clockevent_delta2ns(0x000004, ce
);
107 ce
->cpumask
= cpumask_of(smp_processor_id());
109 clockevents_register_device(ce
);
112 struct sys_timer footbridge_timer
= {
113 .init
= footbridge_timer_init
,