Commit 8ff8fc13 authored by Viresh Kumar's avatar Viresh Kumar Committed by Daniel Lezcano
Browse files

clockevents/drivers/u300: Migrate to new 'set-state' interface



Migrate u300 driver to the new 'set-state' interface provided by
clockevents core, the earlier 'set-mode' interface is marked obsolete
now.

This also enables us to implement callbacks for new states of clockevent
devices, for example: ONESHOT_STOPPED.

Cc: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 7486f5ad
Loading
Loading
Loading
Loading
+77 −78
Original line number Diff line number Diff line
@@ -187,46 +187,24 @@ struct u300_clockevent_data {
	unsigned ticks_per_jiffy;
};

/*
 * The u300_set_mode() function is always called first, if we
 * have oneshot timer active, the oneshot scheduling function
 * u300_set_next_event() is called immediately after.
 */
static void u300_set_mode(enum clock_event_mode mode,
			  struct clock_event_device *evt)
static int u300_shutdown(struct clock_event_device *evt)
{
	struct u300_clockevent_data *cevdata =
		container_of(evt, struct u300_clockevent_data, cevd);

	switch (mode) {
	case CLOCK_EVT_MODE_PERIODIC:
		/* Disable interrupts on GPT1 */
	/* Disable interrupts on GP1 */
	writel(U300_TIMER_APP_GPT1IE_IRQ_DISABLE,
	       u300_timer_base + U300_TIMER_APP_GPT1IE);
		/* Disable GP1 while we're reprogramming it. */
	/* Disable GP1 */
	writel(U300_TIMER_APP_DGPT1_TIMER_DISABLE,
	       u300_timer_base + U300_TIMER_APP_DGPT1);
	return 0;
}

/*
		 * Set the periodic mode to a certain number of ticks per
		 * jiffy.
		 */
		writel(cevdata->ticks_per_jiffy,
		       u300_timer_base + U300_TIMER_APP_GPT1TC);
		/*
		 * Set continuous mode, so the timer keeps triggering
		 * interrupts.
 * If we have oneshot timer active, the oneshot scheduling function
 * u300_set_next_event() is called immediately after.
 */
		writel(U300_TIMER_APP_SGPT1M_MODE_CONTINUOUS,
		       u300_timer_base + U300_TIMER_APP_SGPT1M);
		/* Enable timer interrupts */
		writel(U300_TIMER_APP_GPT1IE_IRQ_ENABLE,
		       u300_timer_base + U300_TIMER_APP_GPT1IE);
		/* Then enable the OS timer again */
		writel(U300_TIMER_APP_EGPT1_TIMER_ENABLE,
		       u300_timer_base + U300_TIMER_APP_EGPT1);
		break;
	case CLOCK_EVT_MODE_ONESHOT:
		/* Just break; here? */
static int u300_set_oneshot(struct clock_event_device *evt)
{
	/* Just return; here? */
	/*
	 * The actual event will be programmed by the next event hook,
	 * so we just set a dummy value somewhere at the end of the
@@ -252,20 +230,39 @@ static void u300_set_mode(enum clock_event_mode mode,
	/* Enable timer */
	writel(U300_TIMER_APP_EGPT1_TIMER_ENABLE,
	       u300_timer_base + U300_TIMER_APP_EGPT1);
		break;
	case CLOCK_EVT_MODE_UNUSED:
	case CLOCK_EVT_MODE_SHUTDOWN:
		/* Disable interrupts on GP1 */
	return 0;
}

static int u300_set_periodic(struct clock_event_device *evt)
{
	struct u300_clockevent_data *cevdata =
		container_of(evt, struct u300_clockevent_data, cevd);

	/* Disable interrupts on GPT1 */
	writel(U300_TIMER_APP_GPT1IE_IRQ_DISABLE,
	       u300_timer_base + U300_TIMER_APP_GPT1IE);
		/* Disable GP1 */
	/* Disable GP1 while we're reprogramming it. */
	writel(U300_TIMER_APP_DGPT1_TIMER_DISABLE,
	       u300_timer_base + U300_TIMER_APP_DGPT1);
		break;
	case CLOCK_EVT_MODE_RESUME:
		/* Ignore this call */
		break;
	}
	/*
	 * Set the periodic mode to a certain number of ticks per
	 * jiffy.
	 */
	writel(cevdata->ticks_per_jiffy,
	       u300_timer_base + U300_TIMER_APP_GPT1TC);
	/*
	 * Set continuous mode, so the timer keeps triggering
	 * interrupts.
	 */
	writel(U300_TIMER_APP_SGPT1M_MODE_CONTINUOUS,
	       u300_timer_base + U300_TIMER_APP_SGPT1M);
	/* Enable timer interrupts */
	writel(U300_TIMER_APP_GPT1IE_IRQ_ENABLE,
	       u300_timer_base + U300_TIMER_APP_GPT1IE);
	/* Then enable the OS timer again */
	writel(U300_TIMER_APP_EGPT1_TIMER_ENABLE,
	       u300_timer_base + U300_TIMER_APP_EGPT1);
	return 0;
}

/*
@@ -315,7 +312,9 @@ static struct u300_clockevent_data u300_clockevent_data = {
		.features		= CLOCK_EVT_FEAT_PERIODIC |
					  CLOCK_EVT_FEAT_ONESHOT,
		.set_next_event		= u300_set_next_event,
		.set_mode	= u300_set_mode,
		.set_state_shutdown	= u300_shutdown,
		.set_state_periodic	= u300_set_periodic,
		.set_state_oneshot	= u300_set_oneshot,
	},
};