Add set_next_event() and let the clock event code take care of
the rest.
Note that we're still reprogramming timer in periodic mode,
but this is OK as in the worst case we'll just get another
interrupt before timer is programmed again.
Signed-off-by: Tony Lindgren <tony@atomide.com>
+static int omap_32k_timer_set_next_event(unsigned long delta,
+ struct clock_event_device *dev)
+{
+ omap_32k_timer_start(delta);
+
+ return 0;
+}
+
static void omap_32k_timer_set_mode(enum clock_event_mode mode,
struct clock_event_device *evt)
{
static void omap_32k_timer_set_mode(enum clock_event_mode mode,
struct clock_event_device *evt)
{
switch (mode) {
case CLOCK_EVT_MODE_PERIODIC:
switch (mode) {
case CLOCK_EVT_MODE_PERIODIC:
+ case CLOCK_EVT_MODE_ONESHOT:
omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD);
break;
omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD);
break;
- case CLOCK_EVT_MODE_ONESHOT:
case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN:
break;
case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN:
break;
static struct clock_event_device clockevent_32k_timer = {
.name = "32k-timer",
static struct clock_event_device clockevent_32k_timer = {
.name = "32k-timer",
- .features = CLOCK_EVT_FEAT_PERIODIC,
+ .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+ .set_next_event = omap_32k_timer_set_next_event,
.set_mode = omap_32k_timer_set_mode,
};
.set_mode = omap_32k_timer_set_mode,
};