aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/irq/chip.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r--kernel/irq/chip.c14
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
195int irq_startup(struct irq_desc *desc) 195int 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
207void irq_shutdown(struct irq_desc *desc) 210void 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
219void irq_enable(struct irq_desc *desc) 223void 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
228void irq_disable(struct irq_desc *desc) 233void 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;