diff options
author | Shinya Kuribayashi <skuribay@ruby.dti.ne.jp> | 2009-03-21 09:06:14 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2009-03-30 08:49:43 -0400 |
commit | 8da55bb2586a0867b9cf14f107225f382a47b28f (patch) | |
tree | ad90c9193abd32a6c236c5774ec51ca82a98f2cb /arch/mips/emma | |
parent | fb2826b7f6ecd93c29d2ef69578f087545251b17 (diff) |
MIPS: EMMA2RH: Use handle_edge_irq() handler for GPIO interrupts
EMMA's GPIO interrupts are latched by GPIO interrupt status register.
In this case, we're encouraged to use handle_edge_irq() handler.
The following changes are made along with replacing set_irq_chip() with
set_irq_chip_and_handler_name(,,handle_edge_irq,"edge"):
* Fix emma2rh_gpio_irq_ack not to disable interrupts
With handle_edge_irq(), we're not expected to disable interrupts
when chip->ack is served, so fix it accordingly. We also add a new
emma2rh_gpio_irq_mask_ack() for chip->mask_ack operation, instead.
* Remove emma2rh_gpio_irq_end(), as chip->end is no longer served.
Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi@necel.com>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/emma')
-rw-r--r-- | arch/mips/emma/markeins/irq.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/arch/mips/emma/markeins/irq.c b/arch/mips/emma/markeins/irq.c index 263132d7b3a3..1e6457ca4f44 100644 --- a/arch/mips/emma/markeins/irq.c +++ b/arch/mips/emma/markeins/irq.c | |||
@@ -149,37 +149,28 @@ static void emma2rh_gpio_irq_disable(unsigned int irq) | |||
149 | 149 | ||
150 | static void emma2rh_gpio_irq_ack(unsigned int irq) | 150 | static void emma2rh_gpio_irq_ack(unsigned int irq) |
151 | { | 151 | { |
152 | u32 reg; | ||
153 | |||
154 | irq -= EMMA2RH_GPIO_IRQ_BASE; | 152 | irq -= EMMA2RH_GPIO_IRQ_BASE; |
155 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq)); | 153 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq)); |
156 | |||
157 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | ||
158 | reg &= ~(1 << irq); | ||
159 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | ||
160 | } | 154 | } |
161 | 155 | ||
162 | static void emma2rh_gpio_irq_end(unsigned int irq) | 156 | static void emma2rh_gpio_irq_mask_ack(unsigned int irq) |
163 | { | 157 | { |
164 | u32 reg; | 158 | u32 reg; |
165 | 159 | ||
166 | if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) { | 160 | irq -= EMMA2RH_GPIO_IRQ_BASE; |
167 | 161 | emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq)); | |
168 | irq -= EMMA2RH_GPIO_IRQ_BASE; | ||
169 | 162 | ||
170 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); | 163 | reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK); |
171 | reg |= 1 << irq; | 164 | reg &= ~(1 << irq); |
172 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); | 165 | emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg); |
173 | } | ||
174 | } | 166 | } |
175 | 167 | ||
176 | struct irq_chip emma2rh_gpio_irq_controller = { | 168 | struct irq_chip emma2rh_gpio_irq_controller = { |
177 | .name = "emma2rh_gpio_irq", | 169 | .name = "emma2rh_gpio_irq", |
178 | .ack = emma2rh_gpio_irq_ack, | 170 | .ack = emma2rh_gpio_irq_ack, |
179 | .mask = emma2rh_gpio_irq_disable, | 171 | .mask = emma2rh_gpio_irq_disable, |
180 | .mask_ack = emma2rh_gpio_irq_ack, | 172 | .mask_ack = emma2rh_gpio_irq_mask_ack, |
181 | .unmask = emma2rh_gpio_irq_enable, | 173 | .unmask = emma2rh_gpio_irq_enable, |
182 | .end = emma2rh_gpio_irq_end, | ||
183 | }; | 174 | }; |
184 | 175 | ||
185 | void emma2rh_gpio_irq_init(void) | 176 | void emma2rh_gpio_irq_init(void) |
@@ -187,8 +178,9 @@ void emma2rh_gpio_irq_init(void) | |||
187 | u32 i; | 178 | u32 i; |
188 | 179 | ||
189 | for (i = 0; i < NUM_EMMA2RH_IRQ_GPIO; i++) | 180 | for (i = 0; i < NUM_EMMA2RH_IRQ_GPIO; i++) |
190 | set_irq_chip(EMMA2RH_GPIO_IRQ_BASE + i, | 181 | set_irq_chip_and_handler_name(EMMA2RH_GPIO_IRQ_BASE + i, |
191 | &emma2rh_gpio_irq_controller); | 182 | &emma2rh_gpio_irq_controller, |
183 | handle_edge_irq, "edge"); | ||
192 | } | 184 | } |
193 | 185 | ||
194 | static struct irqaction irq_cascade = { | 186 | static struct irqaction irq_cascade = { |