37 #include <linux/kernel.h>
41 #include <linux/sched.h>
55 #include <mach/hardware.h>
72 #define OMAP1_32K_TIMER_BASE 0xfffb9000
73 #define OMAP1_32KSYNC_TIMER_BASE 0xfffbc400
74 #define OMAP1_32K_TIMER_CR 0x08
75 #define OMAP1_32K_TIMER_TVR 0x00
76 #define OMAP1_32K_TIMER_TCR 0x04
78 #define OMAP_32K_TICKS_PER_SEC (32768)
84 #define OMAP_32K_TIMER_TICK_PERIOD ((OMAP_32K_TICKS_PER_SEC / HZ) - 1)
86 #define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
87 (((nr_jiffies) * (clock_rate)) / HZ)
89 static inline void omap_32k_timer_write(
int val,
int reg)
94 static inline unsigned long omap_32k_timer_read(
int reg)
99 static inline void omap_32k_timer_start(
unsigned long load_val)
107 static inline void omap_32k_timer_stop(
void)
112 #define omap_32k_timer_ack_irq()
114 static int omap_32k_timer_set_next_event(
unsigned long delta,
115 struct clock_event_device *
dev)
117 omap_32k_timer_start(delta);
122 static void omap_32k_timer_set_mode(
enum clock_event_mode
mode,
123 struct clock_event_device *
evt)
125 omap_32k_timer_stop();
128 case CLOCK_EVT_MODE_PERIODIC:
131 case CLOCK_EVT_MODE_ONESHOT:
132 case CLOCK_EVT_MODE_UNUSED:
133 case CLOCK_EVT_MODE_SHUTDOWN:
135 case CLOCK_EVT_MODE_RESUME:
140 static struct clock_event_device clockevent_32k_timer = {
142 .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
144 .set_next_event = omap_32k_timer_set_next_event,
145 .set_mode = omap_32k_timer_set_mode,
150 struct clock_event_device *evt = &clockevent_32k_timer;
153 evt->event_handler(evt);
158 static struct irqaction omap_32k_timer_irq = {
159 .name =
"32KHz timer",
161 .handler = omap_32k_timer_interrupt,
164 static __init void omap_init_32k_timer(
void)
170 clockevent_32k_timer.shift);
171 clockevent_32k_timer.max_delta_ns =
173 clockevent_32k_timer.min_delta_ns =
191 struct clk *sync32k_ick;
195 pr_err(
"32k_counter: failed to map base addr\n");
200 if (!IS_ERR(sync32k_ick))
207 omap_init_32k_timer();