15 #include <linux/kernel.h>
18 #include <linux/module.h>
22 #define DRV_NAME "cs5535-clockevt"
45 static unsigned int cs5535_tick_mode = CLOCK_EVT_MODE_SHUTDOWN;
50 #define MFGPT_DIVISOR 16
52 #define MFGPT_HZ (32768 / MFGPT_DIVISOR)
53 #define MFGPT_PERIODIC (MFGPT_HZ / HZ)
80 static void mfgpt_set_mode(
enum clock_event_mode
mode,
81 struct clock_event_device *
evt)
85 if (mode == CLOCK_EVT_MODE_PERIODIC)
88 cs5535_tick_mode =
mode;
91 static int mfgpt_next_event(
unsigned long delta,
struct clock_event_device *evt)
93 start_timer(cs5535_event_clock, delta);
97 static struct clock_event_device cs5535_clockevent = {
99 .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
100 .set_mode = mfgpt_set_mode,
101 .set_next_event = mfgpt_next_event,
117 if (cs5535_tick_mode == CLOCK_EVT_MODE_SHUTDOWN)
125 if (cs5535_tick_mode == CLOCK_EVT_MODE_PERIODIC)
129 cs5535_clockevent.event_handler(&cs5535_clockevent);
134 .handler = mfgpt_tick,
139 static int __init cs5535_mfgpt_init(
void)
150 cs5535_event_clock =
timer;
153 if (cs5535_mfgpt_setup_irq(timer,
MFGPT_CMP2, &timer_irq)) {
173 cs5535_clockevent.shift);
180 ": Registering MFGPT timer as a clock event, using IRQ %d\n",
187 cs5535_mfgpt_release_irq(cs5535_event_clock,
MFGPT_CMP2, &timer_irq);