aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenedikt Spranger <b.spranger@linutronix.de>2010-03-06 11:47:10 -0500
committerThomas Gleixner <tglx@linutronix.de>2010-05-02 14:13:54 -0400
commitb16bd4fb3290b5d380c2a67cc4c5109d65cee1d7 (patch)
tree3cc373178341371366bdadf4279b444541366d1b
parent360c3e7265901a0231f40121a6ff3fc78172334f (diff)
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.c2
-rw-r--r--arch/arm/mach-at91/at91sam926x_time.c6
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)
109 last_crtr = read_CRTR(); 109 last_crtr = read_CRTR();
110 switch (mode) { 110 switch (mode) {
111 case CLOCK_EVT_MODE_PERIODIC: 111 case CLOCK_EVT_MODE_PERIODIC:
112 setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq);
112 /* PIT for periodic irqs; fixed rate of 1/HZ */ 113 /* PIT for periodic irqs; fixed rate of 1/HZ */
113 irqmask = AT91_ST_PITS; 114 irqmask = AT91_ST_PITS;
114 at91_sys_write(AT91_ST_PIMR, LATCH); 115 at91_sys_write(AT91_ST_PIMR, LATCH);
@@ -122,6 +123,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev)
122 break; 123 break;
123 case CLOCK_EVT_MODE_SHUTDOWN: 124 case CLOCK_EVT_MODE_SHUTDOWN:
124 case CLOCK_EVT_MODE_UNUSED: 125 case CLOCK_EVT_MODE_UNUSED:
126 remove_irq(AT91_ID_SYS, &at91rm9200_timer_irq);
125 case CLOCK_EVT_MODE_RESUME: 127 case CLOCK_EVT_MODE_RESUME:
126 irqmask = 0; 128 irqmask = 0;
127 break; 129 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 = {
55 .flags = CLOCK_SOURCE_IS_CONTINUOUS, 55 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
56}; 56};
57 57
58 58static struct irqaction at91sam926x_pit_irq;
59/* 59/*
60 * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16) 60 * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16)
61 */ 61 */
@@ -66,6 +66,9 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev)
66 66
67 switch (mode) { 67 switch (mode) {
68 case CLOCK_EVT_MODE_PERIODIC: 68 case CLOCK_EVT_MODE_PERIODIC:
69 /* Set up irq handler */
70 setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq);
71
69 /* update clocksource counter, then enable the IRQ */ 72 /* update clocksource counter, then enable the IRQ */
70 raw_local_irq_save(flags); 73 raw_local_irq_save(flags);
71 pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); 74 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)
80 case CLOCK_EVT_MODE_UNUSED: 83 case CLOCK_EVT_MODE_UNUSED:
81 /* disable irq, leaving the clocksource active */ 84 /* disable irq, leaving the clocksource active */
82 at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); 85 at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN);
86 remove_irq(AT91_ID_SYS, &at91sam926x_pit_irq);
83 break; 87 break;
84 case CLOCK_EVT_MODE_RESUME: 88 case CLOCK_EVT_MODE_RESUME:
85 break; 89 break;