diff options
-rw-r--r-- | include/linux/irq.h | 2 | ||||
-rw-r--r-- | kernel/irq/pm.c | 22 |
2 files changed, 20 insertions, 4 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index ff62d0145b8f..1d3577f30d45 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -330,10 +330,12 @@ struct irq_chip { | |||
330 | * | 330 | * |
331 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() | 331 | * IRQCHIP_SET_TYPE_MASKED: Mask before calling chip.irq_set_type() |
332 | * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled | 332 | * IRQCHIP_EOI_IF_HANDLED: Only issue irq_eoi() when irq was handled |
333 | * IRQCHIP_MASK_ON_SUSPEND: Mask non wake irqs in the suspend path | ||
333 | */ | 334 | */ |
334 | enum { | 335 | enum { |
335 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), | 336 | IRQCHIP_SET_TYPE_MASKED = (1 << 0), |
336 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), | 337 | IRQCHIP_EOI_IF_HANDLED = (1 << 1), |
338 | IRQCHIP_MASK_ON_SUSPEND = (1 << 2), | ||
337 | }; | 339 | }; |
338 | 340 | ||
339 | /* This include will go away once we isolated irq_desc usage to core code */ | 341 | /* This include will go away once we isolated irq_desc usage to core code */ |
diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c index 1329f0eff49e..f76fc00c9877 100644 --- a/kernel/irq/pm.c +++ b/kernel/irq/pm.c | |||
@@ -68,10 +68,24 @@ int check_wakeup_irqs(void) | |||
68 | struct irq_desc *desc; | 68 | struct irq_desc *desc; |
69 | int irq; | 69 | int irq; |
70 | 70 | ||
71 | for_each_irq_desc(irq, desc) | 71 | for_each_irq_desc(irq, desc) { |
72 | if (irqd_is_wakeup_set(&desc->irq_data) && | 72 | if (irqd_is_wakeup_set(&desc->irq_data)) { |
73 | (desc->istate & IRQS_PENDING)) | 73 | if (desc->istate & IRQS_PENDING) |
74 | return -EBUSY; | 74 | return -EBUSY; |
75 | continue; | ||
76 | } | ||
77 | /* | ||
78 | * Check the non wakeup interrupts whether they need | ||
79 | * to be masked before finally going into suspend | ||
80 | * state. That's for hardware which has no wakeup | ||
81 | * source configuration facility. The chip | ||
82 | * implementation indicates that with | ||
83 | * IRQCHIP_MASK_ON_SUSPEND. | ||
84 | */ | ||
85 | if (desc->istate & IRQS_SUSPENDED && | ||
86 | irq_desc_get_chip(desc)->flags & IRQCHIP_MASK_ON_SUSPEND) | ||
87 | mask_irq(desc); | ||
88 | } | ||
75 | 89 | ||
76 | return 0; | 90 | return 0; |
77 | } | 91 | } |