diff options
Diffstat (limited to 'arch/avr32/kernel/time.c')
| -rw-r--r-- | arch/avr32/kernel/time.c | 65 | 
1 files changed, 33 insertions, 32 deletions
diff --git a/arch/avr32/kernel/time.c b/arch/avr32/kernel/time.c index d0f771be9e96..a124c55733db 100644 --- a/arch/avr32/kernel/time.c +++ b/arch/avr32/kernel/time.c @@ -18,6 +18,7 @@  #include <mach/pm.h> +static bool disable_cpu_idle_poll;  static cycle_t read_cycle_count(struct clocksource *cs)  { @@ -80,45 +81,45 @@ 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: +	pr_debug("%s: %s\n", __func__, evdev->name); +	sysreg_write(COMPARE, 0); + +	if (disable_cpu_idle_poll) { +		disable_cpu_idle_poll = false;  		/* -		 * If we're using the COUNT and COMPARE registers we -		 * need to force idle poll. +		 * Only disable idle poll if we have forced that +		 * in a previous call.  		 */ -		cpu_idle_poll_ctrl(true); -		break; -	case CLOCK_EVT_MODE_UNUSED: -	case CLOCK_EVT_MODE_SHUTDOWN: -		sysreg_write(COMPARE, 0); -		pr_debug("%s: stop\n", evdev->name); -		if (evdev->mode == CLOCK_EVT_MODE_ONESHOT || -		    evdev->mode == CLOCK_EVT_MODE_RESUME) { -			/* -			 * Only disable idle poll if we have forced that -			 * in a previous call. -			 */ -			cpu_idle_poll_ctrl(false); -		} -		break; -	default: -		BUG(); +		cpu_idle_poll_ctrl(false);  	} +	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 = { -	.name		= "avr32_comparator", -	.features	= CLOCK_EVT_FEAT_ONESHOT, -	.shift		= 16, -	.rating		= 50, -	.set_next_event	= comparator_next_event, -	.set_mode	= comparator_mode, +	.name			= "avr32_comparator", +	.features		= CLOCK_EVT_FEAT_ONESHOT, +	.shift			= 16, +	.rating			= 50, +	.set_next_event		= comparator_next_event, +	.set_state_shutdown	= comparator_shutdown, +	.set_state_oneshot	= comparator_set_oneshot, +	.tick_resume		= comparator_set_oneshot,  };  void read_persistent_clock(struct timespec *ts)  |