diff options
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r-- | kernel/irq/chip.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 1a239a83f925..43c62ca68c11 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -194,11 +194,14 @@ EXPORT_SYMBOL_GPL(set_irq_nested_thread); | |||
194 | 194 | ||
195 | int irq_startup(struct irq_desc *desc) | 195 | int irq_startup(struct irq_desc *desc) |
196 | { | 196 | { |
197 | desc->status &= ~(IRQ_MASKED | IRQ_DISABLED); | 197 | desc->status &= ~IRQ_DISABLED; |
198 | desc->depth = 0; | 198 | desc->depth = 0; |
199 | 199 | ||
200 | if (desc->irq_data.chip->irq_startup) | 200 | if (desc->irq_data.chip->irq_startup) { |
201 | return desc->irq_data.chip->irq_startup(&desc->irq_data); | 201 | int ret = desc->irq_data.chip->irq_startup(&desc->irq_data); |
202 | desc->status &= ~IRQ_MASKED; | ||
203 | return ret; | ||
204 | } | ||
202 | 205 | ||
203 | irq_enable(desc); | 206 | irq_enable(desc); |
204 | return 0; | 207 | return 0; |
@@ -206,7 +209,7 @@ int irq_startup(struct irq_desc *desc) | |||
206 | 209 | ||
207 | void irq_shutdown(struct irq_desc *desc) | 210 | void irq_shutdown(struct irq_desc *desc) |
208 | { | 211 | { |
209 | desc->status |= IRQ_MASKED | IRQ_DISABLED; | 212 | desc->status |= IRQ_DISABLED; |
210 | desc->depth = 1; | 213 | desc->depth = 1; |
211 | if (desc->irq_data.chip->irq_shutdown) | 214 | if (desc->irq_data.chip->irq_shutdown) |
212 | desc->irq_data.chip->irq_shutdown(&desc->irq_data); | 215 | desc->irq_data.chip->irq_shutdown(&desc->irq_data); |
@@ -214,10 +217,12 @@ void irq_shutdown(struct irq_desc *desc) | |||
214 | desc->irq_data.chip->irq_disable(&desc->irq_data); | 217 | desc->irq_data.chip->irq_disable(&desc->irq_data); |
215 | else | 218 | else |
216 | desc->irq_data.chip->irq_mask(&desc->irq_data); | 219 | desc->irq_data.chip->irq_mask(&desc->irq_data); |
220 | desc->status |= IRQ_MASKED; | ||
217 | } | 221 | } |
218 | 222 | ||
219 | void irq_enable(struct irq_desc *desc) | 223 | void irq_enable(struct irq_desc *desc) |
220 | { | 224 | { |
225 | desc->status &= ~IRQ_DISABLED; | ||
221 | if (desc->irq_data.chip->irq_enable) | 226 | if (desc->irq_data.chip->irq_enable) |
222 | desc->irq_data.chip->irq_enable(&desc->irq_data); | 227 | desc->irq_data.chip->irq_enable(&desc->irq_data); |
223 | else | 228 | else |
@@ -227,6 +232,7 @@ void irq_enable(struct irq_desc *desc) | |||
227 | 232 | ||
228 | void irq_disable(struct irq_desc *desc) | 233 | void irq_disable(struct irq_desc *desc) |
229 | { | 234 | { |
235 | desc->status |= IRQ_DISABLED; | ||
230 | if (desc->irq_data.chip->irq_disable) { | 236 | if (desc->irq_data.chip->irq_disable) { |
231 | desc->irq_data.chip->irq_disable(&desc->irq_data); | 237 | desc->irq_data.chip->irq_disable(&desc->irq_data); |
232 | desc->status |= IRQ_MASKED; | 238 | desc->status |= IRQ_MASKED; |