Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2efda24 authored by Viresh Kumar's avatar Viresh Kumar
Browse files

ARM/gemini/time: Migrate to new 'set-state' interface



Migrate gemini 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.

Acked-by: default avatarHans Ulli Kroll <ulli.kroll@googlemail.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 947d9cf5
Loading
Loading
Loading
Loading
+34 −35
Original line number Diff line number Diff line
@@ -59,49 +59,48 @@ static int gemini_timer_set_next_event(unsigned long cycles,
	return 0;
}

static void gemini_timer_set_mode(enum clock_event_mode mode,
				  struct clock_event_device *evt)
static int gemini_timer_shutdown(struct clock_event_device *evt)
{
	u32 period = DIV_ROUND_CLOSEST(tick_rate, HZ);
	u32 cr;

	switch (mode) {
        case CLOCK_EVT_MODE_PERIODIC:
		/* Start the timer */
		writel(period,
		       TIMER_COUNT(IO_ADDRESS(GEMINI_TIMER2_BASE)));
		writel(period,
		       TIMER_LOAD(IO_ADDRESS(GEMINI_TIMER2_BASE)));
		cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
		cr |= TIMER_2_CR_ENABLE;
		cr |= TIMER_2_CR_INT;
		writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
		break;
	case CLOCK_EVT_MODE_ONESHOT:
	case CLOCK_EVT_MODE_UNUSED:
        case CLOCK_EVT_MODE_SHUTDOWN:
	case CLOCK_EVT_MODE_RESUME:
	/*
		 * Disable also for oneshot: the set_next() call will
		 * arm the timer instead.
	 * Disable also for oneshot: the set_next() call will arm the timer
	 * instead.
	 */
	cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
	cr &= ~TIMER_2_CR_ENABLE;
	cr &= ~TIMER_2_CR_INT;
	writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
		break;
	default:
                break;
	return 0;
}

static int gemini_timer_set_periodic(struct clock_event_device *evt)
{
	u32 period = DIV_ROUND_CLOSEST(tick_rate, HZ);
	u32 cr;

	/* Start the timer */
	writel(period, TIMER_COUNT(IO_ADDRESS(GEMINI_TIMER2_BASE)));
	writel(period, TIMER_LOAD(IO_ADDRESS(GEMINI_TIMER2_BASE)));
	cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
	cr |= TIMER_2_CR_ENABLE;
	cr |= TIMER_2_CR_INT;
	writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
	return 0;
}

/* Use TIMER2 as clock event */
static struct clock_event_device gemini_clockevent = {
	.name			= "TIMER2",
	.rating		= 300, /* Reasonably fast and accurate clock event */
	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
	/* Reasonably fast and accurate clock event */
	.rating			= 300,
	.features		= CLOCK_EVT_FEAT_PERIODIC |
				  CLOCK_EVT_FEAT_ONESHOT,
	.set_next_event		= gemini_timer_set_next_event,
	.set_mode	= gemini_timer_set_mode,
	.set_state_shutdown	= gemini_timer_shutdown,
	.set_state_periodic	= gemini_timer_set_periodic,
	.set_state_oneshot	= gemini_timer_shutdown,
	.tick_resume		= gemini_timer_shutdown,
};

/*