diff options
author | Benedikt Spranger <b.spranger@linutronix.de> | 2010-03-06 17:47:10 +0100 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-02 20:13:54 +0200 |
commit | b16bd4fb3290b5d380c2a67cc4c5109d65cee1d7 (patch) | |
tree | 3cc373178341371366bdadf4279b444541366d1b | |
parent | 360c3e7265901a0231f40121a6ff3fc78172334f (diff) | |
download | lwn-b16bd4fb3290b5d380c2a67cc4c5109d65cee1d7.tar.gz lwn-b16bd4fb3290b5d380c2a67cc4c5109d65cee1d7.zip |
AT91: PIT: Remove irq handler when clock event is unused
Setup and remove the interrupt handler in clock event mode selection.
This avoids calling the (shared) interrupt handler when the device is
not used.
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | arch/arm/mach-at91/at91rm9200_time.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam926x_time.c | 6 |
2 files changed, 7 insertions, 1 deletions
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index 309f3511aa20..9ebf6c744444 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c @@ -109,6 +109,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev) last_crtr = read_CRTR(); switch (mode) { case CLOCK_EVT_MODE_PERIODIC: + setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq); /* PIT for periodic irqs; fixed rate of 1/HZ */ irqmask = AT91_ST_PITS; at91_sys_write(AT91_ST_PIMR, LATCH); @@ -122,6 +123,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev) break; case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: + remove_irq(AT91_ID_SYS, &at91rm9200_timer_irq); case CLOCK_EVT_MODE_RESUME: irqmask = 0; break; diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c index 4bd56aee4370..6936e392c058 100644 --- a/arch/arm/mach-at91/at91sam926x_time.c +++ b/arch/arm/mach-at91/at91sam926x_time.c @@ -55,7 +55,7 @@ static struct clocksource pit_clk = { .flags = CLOCK_SOURCE_IS_CONTINUOUS, }; - +static struct irqaction at91sam926x_pit_irq; /* * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16) */ @@ -66,6 +66,9 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) switch (mode) { case CLOCK_EVT_MODE_PERIODIC: + /* Set up irq handler */ + setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq); + /* update clocksource counter, then enable the IRQ */ raw_local_irq_save(flags); pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); @@ -80,6 +83,7 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) case CLOCK_EVT_MODE_UNUSED: /* disable irq, leaving the clocksource active */ at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); + remove_irq(AT91_ID_SYS, &at91sam926x_pit_irq); break; case CLOCK_EVT_MODE_RESUME: break; |