diff options
| author | Ingo Molnar <mingo@kernel.org> | 2015-09-13 12:25:35 +0300 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-09-13 12:25:35 +0300 | 
| commit | d2bb1d42b95fa88f092623bbb8ed533f316b6a3c (patch) | |
| tree | fb796db809a266906fa358f24f1c07ced4df33f0 /drivers/clocksource/timer-atmel-pit.c | |
| parent | 3bd7617596df560e2cb22ad97888cb42dae39d02 (diff) | |
| parent | 6ff33f3902c3b1c5d0db6b1e2c70b6d76fba357f (diff) | |
| download | linux-d2bb1d42b95fa88f092623bbb8ed533f316b6a3c.tar.xz | |
Merge tag 'v4.3-rc1' into perf/core, to refresh the tree
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/clocksource/timer-atmel-pit.c')
| -rw-r--r-- | drivers/clocksource/timer-atmel-pit.c | 45 | 
1 files changed, 20 insertions, 25 deletions
diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c index c0304ff608b0..d911c5dca8f1 100644 --- a/drivers/clocksource/timer-atmel-pit.c +++ b/drivers/clocksource/timer-atmel-pit.c @@ -90,33 +90,27 @@ static cycle_t read_pit_clk(struct clocksource *cs)  	return elapsed;  } +static int pit_clkevt_shutdown(struct clock_event_device *dev) +{ +	struct pit_data *data = clkevt_to_pit_data(dev); + +	/* disable irq, leaving the clocksource active */ +	pit_write(data->base, AT91_PIT_MR, (data->cycle - 1) | AT91_PIT_PITEN); +	return 0; +} +  /*   * Clockevent device:  interrupts every 1/HZ (== pit_cycles * MCK/16)   */ -static void -pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) +static int pit_clkevt_set_periodic(struct clock_event_device *dev)  {  	struct pit_data *data = clkevt_to_pit_data(dev); -	switch (mode) { -	case CLOCK_EVT_MODE_PERIODIC: -		/* update clocksource counter */ -		data->cnt += data->cycle * PIT_PICNT(pit_read(data->base, AT91_PIT_PIVR)); -		pit_write(data->base, AT91_PIT_MR, -			  (data->cycle - 1) | AT91_PIT_PITEN | AT91_PIT_PITIEN); -		break; -	case CLOCK_EVT_MODE_ONESHOT: -		BUG(); -		/* FALLTHROUGH */ -	case CLOCK_EVT_MODE_SHUTDOWN: -	case CLOCK_EVT_MODE_UNUSED: -		/* disable irq, leaving the clocksource active */ -		pit_write(data->base, AT91_PIT_MR, -			  (data->cycle - 1) | AT91_PIT_PITEN); -		break; -	case CLOCK_EVT_MODE_RESUME: -		break; -	} +	/* update clocksource counter */ +	data->cnt += data->cycle * PIT_PICNT(pit_read(data->base, AT91_PIT_PIVR)); +	pit_write(data->base, AT91_PIT_MR, +		  (data->cycle - 1) | AT91_PIT_PITEN | AT91_PIT_PITIEN); +	return 0;  }  static void at91sam926x_pit_suspend(struct clock_event_device *cedev) @@ -162,7 +156,7 @@ static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id)  	WARN_ON_ONCE(!irqs_disabled());  	/* The PIT interrupt may be disabled, and is shared */ -	if ((data->clkevt.mode == CLOCK_EVT_MODE_PERIODIC) && +	if (clockevent_state_periodic(&data->clkevt) &&  	    (pit_read(data->base, AT91_PIT_SR) & AT91_PIT_PITS)) {  		unsigned nr_ticks; @@ -208,8 +202,8 @@ static void __init at91sam926x_pit_common_init(struct pit_data *data)  	data->clksrc.mask = CLOCKSOURCE_MASK(bits);  	data->clksrc.name = "pit";  	data->clksrc.rating = 175; -	data->clksrc.read = read_pit_clk, -	data->clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS, +	data->clksrc.read = read_pit_clk; +	data->clksrc.flags = CLOCK_SOURCE_IS_CONTINUOUS;  	clocksource_register_hz(&data->clksrc, pit_rate);  	/* Set up irq handler */ @@ -227,7 +221,8 @@ static void __init at91sam926x_pit_common_init(struct pit_data *data)  	data->clkevt.rating = 100;  	data->clkevt.cpumask = cpumask_of(0); -	data->clkevt.set_mode = pit_clkevt_mode; +	data->clkevt.set_state_shutdown = pit_clkevt_shutdown; +	data->clkevt.set_state_periodic = pit_clkevt_set_periodic;  	data->clkevt.resume = at91sam926x_pit_resume;  	data->clkevt.suspend = at91sam926x_pit_suspend;  	clockevents_register_device(&data->clkevt);  | 
