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

Commit 09adcdf2 authored by Viresh Kumar's avatar Viresh Kumar Committed by Hans-Christian Egtvedt
Browse files

AVR32/time: Migrate to new 'set-state' interface



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

We want to call cpu_idle_poll_ctrl() in shutdown only if we were in
oneshot or resume state earlier. Create another variable to save this
information and check that in shutdown callback.

Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Acked-by: default avatarHans-Christian Egtvedt <egtvedt@samfundet.no>
parent 52721d9d
Loading
Loading
Loading
Loading
+33 −32
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <mach/pm.h>

static bool disable_cpu_idle_poll;

static cycle_t read_cycle_count(struct clocksource *cs)
{
@@ -80,36 +81,34 @@ static int comparator_next_event(unsigned long delta,
	return 0;
}

static void comparator_mode(enum clock_event_mode mode,
		struct clock_event_device *evdev)
static int comparator_shutdown(struct clock_event_device *evdev)
{
	switch (mode) {
	case CLOCK_EVT_MODE_ONESHOT:
		pr_debug("%s: start\n", evdev->name);
		/* FALLTHROUGH */
	case CLOCK_EVT_MODE_RESUME:
		/*
		 * If we're using the COUNT and COMPARE registers we
		 * need to force idle poll.
		 */
		cpu_idle_poll_ctrl(true);
		break;
	case CLOCK_EVT_MODE_UNUSED:
	case CLOCK_EVT_MODE_SHUTDOWN:
	pr_debug("%s: %s\n", __func__, evdev->name);
	sysreg_write(COMPARE, 0);
		pr_debug("%s: stop\n", evdev->name);
		if (evdev->mode == CLOCK_EVT_MODE_ONESHOT ||
		    evdev->mode == CLOCK_EVT_MODE_RESUME) {

	if (disable_cpu_idle_poll) {
		disable_cpu_idle_poll = false;
		/*
		 * Only disable idle poll if we have forced that
		 * in a previous call.
		 */
		cpu_idle_poll_ctrl(false);
	}
		break;
	default:
		BUG();
	return 0;
}

static int comparator_set_oneshot(struct clock_event_device *evdev)
{
	pr_debug("%s: %s\n", __func__, evdev->name);

	disable_cpu_idle_poll = true;
	/*
	 * If we're using the COUNT and COMPARE registers we
	 * need to force idle poll.
	 */
	cpu_idle_poll_ctrl(true);

	return 0;
}

static struct clock_event_device comparator = {
@@ -118,7 +117,9 @@ static struct clock_event_device comparator = {
	.shift			= 16,
	.rating			= 50,
	.set_next_event		= comparator_next_event,
	.set_mode	= comparator_mode,
	.set_state_shutdown	= comparator_shutdown,
	.set_state_oneshot	= comparator_set_oneshot,
	.tick_resume		= comparator_set_oneshot,
};

void read_persistent_clock(struct timespec *ts)