diff options
| -rw-r--r-- | include/linux/interrupt.h | 3 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 11 | ||||
| -rw-r--r-- | kernel/irq/pm.c | 3 |
3 files changed, 12 insertions, 5 deletions
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 55e0d4253e49..d746da19c6a2 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | * Used by threaded interrupts which need to keep the | 55 | * Used by threaded interrupts which need to keep the |
| 56 | * irq line disabled until the threaded handler has been run. | 56 | * irq line disabled until the threaded handler has been run. |
| 57 | * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend | 57 | * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend |
| 58 | * | 58 | * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set |
| 59 | */ | 59 | */ |
| 60 | #define IRQF_DISABLED 0x00000020 | 60 | #define IRQF_DISABLED 0x00000020 |
| 61 | #define IRQF_SAMPLE_RANDOM 0x00000040 | 61 | #define IRQF_SAMPLE_RANDOM 0x00000040 |
| @@ -67,6 +67,7 @@ | |||
| 67 | #define IRQF_IRQPOLL 0x00001000 | 67 | #define IRQF_IRQPOLL 0x00001000 |
| 68 | #define IRQF_ONESHOT 0x00002000 | 68 | #define IRQF_ONESHOT 0x00002000 |
| 69 | #define IRQF_NO_SUSPEND 0x00004000 | 69 | #define IRQF_NO_SUSPEND 0x00004000 |
| 70 | #define IRQF_FORCE_RESUME 0x00008000 | ||
| 70 | 71 | ||
| 71 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND) | 72 | #define IRQF_TIMER (__IRQF_TIMER | IRQF_NO_SUSPEND) |
| 72 | 73 | ||
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 0caa59f747dd..b4198ee8cfdf 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -282,8 +282,17 @@ EXPORT_SYMBOL(disable_irq); | |||
| 282 | 282 | ||
| 283 | void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) | 283 | void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume) |
| 284 | { | 284 | { |
| 285 | if (resume) | 285 | if (resume) { |
| 286 | if (!(desc->status & IRQ_SUSPENDED)) { | ||
| 287 | if (!desc->action) | ||
| 288 | return; | ||
| 289 | if (!(desc->action->flags & IRQF_FORCE_RESUME)) | ||
| 290 | return; | ||
| 291 | /* Pretend that it got disabled ! */ | ||
| 292 | desc->depth++; | ||
| 293 | } | ||
| 286 | desc->status &= ~IRQ_SUSPENDED; | 294 | desc->status &= ~IRQ_SUSPENDED; |
| 295 | } | ||
| 287 | 296 | ||
| 288 | switch (desc->depth) { | 297 | switch (desc->depth) { |
| 289 | case 0: | 298 | case 0: |
diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c index 0d4005d85b03..d6bfb89cce91 100644 --- a/kernel/irq/pm.c +++ b/kernel/irq/pm.c | |||
| @@ -53,9 +53,6 @@ void resume_device_irqs(void) | |||
| 53 | for_each_irq_desc(irq, desc) { | 53 | for_each_irq_desc(irq, desc) { |
| 54 | unsigned long flags; | 54 | unsigned long flags; |
| 55 | 55 | ||
| 56 | if (!(desc->status & IRQ_SUSPENDED)) | ||
| 57 | continue; | ||
| 58 | |||
| 59 | raw_spin_lock_irqsave(&desc->lock, flags); | 56 | raw_spin_lock_irqsave(&desc->lock, flags); |
| 60 | __enable_irq(desc, irq, true); | 57 | __enable_irq(desc, irq, true); |
| 61 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 58 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
