diff options
-rw-r--r-- | include/linux/irq.h | 8 | ||||
-rw-r--r-- | kernel/irq/chip.c | 5 | ||||
-rw-r--r-- | kernel/irq/irqdesc.c | 1 |
3 files changed, 12 insertions, 2 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 5d876c9b3a3d..8649b0fb9daf 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -174,6 +174,8 @@ struct irq_data { | |||
174 | * from suspend | 174 | * from suspend |
175 | * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process | 175 | * IRDQ_MOVE_PCNTXT - Interrupt can be moved in process |
176 | * context | 176 | * context |
177 | * IRQD_IRQ_DISABLED - Some chip function need to know the | ||
178 | * disabled state. | ||
177 | */ | 179 | */ |
178 | enum { | 180 | enum { |
179 | IRQD_TRIGGER_MASK = 0xf, | 181 | IRQD_TRIGGER_MASK = 0xf, |
@@ -184,6 +186,7 @@ enum { | |||
184 | IRQD_LEVEL = (1 << 13), | 186 | IRQD_LEVEL = (1 << 13), |
185 | IRQD_WAKEUP_STATE = (1 << 14), | 187 | IRQD_WAKEUP_STATE = (1 << 14), |
186 | IRQD_MOVE_PCNTXT = (1 << 15), | 188 | IRQD_MOVE_PCNTXT = (1 << 15), |
189 | IRQD_IRQ_DISABLED = (1 << 16), | ||
187 | }; | 190 | }; |
188 | 191 | ||
189 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) | 192 | static inline bool irqd_is_setaffinity_pending(struct irq_data *d) |
@@ -235,6 +238,11 @@ static inline bool irqd_can_move_in_process_context(struct irq_data *d) | |||
235 | return d->state_use_accessors & IRQD_MOVE_PCNTXT; | 238 | return d->state_use_accessors & IRQD_MOVE_PCNTXT; |
236 | } | 239 | } |
237 | 240 | ||
241 | static inline bool irqd_irq_disabled(struct irq_data *d) | ||
242 | { | ||
243 | return d->state_use_accessors & IRQD_IRQ_DISABLED; | ||
244 | } | ||
245 | |||
238 | /** | 246 | /** |
239 | * struct irq_chip - hardware interrupt chip descriptor | 247 | * struct irq_chip - hardware interrupt chip descriptor |
240 | * | 248 | * |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index c35d74c08b50..0a890bdd9c63 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -141,12 +141,14 @@ EXPORT_SYMBOL_GPL(irq_get_irq_data); | |||
141 | static void irq_state_clr_disabled(struct irq_desc *desc) | 141 | static void irq_state_clr_disabled(struct irq_desc *desc) |
142 | { | 142 | { |
143 | desc->istate &= ~IRQS_DISABLED; | 143 | desc->istate &= ~IRQS_DISABLED; |
144 | irqd_clear(&desc->irq_data, IRQD_IRQ_DISABLED); | ||
144 | irq_compat_clr_disabled(desc); | 145 | irq_compat_clr_disabled(desc); |
145 | } | 146 | } |
146 | 147 | ||
147 | static void irq_state_set_disabled(struct irq_desc *desc) | 148 | static void irq_state_set_disabled(struct irq_desc *desc) |
148 | { | 149 | { |
149 | desc->istate |= IRQS_DISABLED; | 150 | desc->istate |= IRQS_DISABLED; |
151 | irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED); | ||
150 | irq_compat_set_disabled(desc); | 152 | irq_compat_set_disabled(desc); |
151 | } | 153 | } |
152 | 154 | ||
@@ -648,8 +650,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
648 | if (handle == handle_bad_irq) { | 650 | if (handle == handle_bad_irq) { |
649 | if (desc->irq_data.chip != &no_irq_chip) | 651 | if (desc->irq_data.chip != &no_irq_chip) |
650 | mask_ack_irq(desc); | 652 | mask_ack_irq(desc); |
651 | irq_compat_set_disabled(desc); | 653 | irq_state_set_disabled(desc); |
652 | desc->istate |= IRQS_DISABLED; | ||
653 | desc->depth = 1; | 654 | desc->depth = 1; |
654 | } | 655 | } |
655 | desc->handle_irq = handle; | 656 | desc->handle_irq = handle; |
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c index 6fb014f172f7..96c3268a509d 100644 --- a/kernel/irq/irqdesc.c +++ b/kernel/irq/irqdesc.c | |||
@@ -80,6 +80,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node) | |||
80 | desc->irq_data.handler_data = NULL; | 80 | desc->irq_data.handler_data = NULL; |
81 | desc->irq_data.msi_desc = NULL; | 81 | desc->irq_data.msi_desc = NULL; |
82 | irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS); | 82 | irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS); |
83 | irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED); | ||
83 | desc->istate = IRQS_DISABLED; | 84 | desc->istate = IRQS_DISABLED; |
84 | desc->handle_irq = handle_bad_irq; | 85 | desc->handle_irq = handle_bad_irq; |
85 | desc->depth = 1; | 86 | desc->depth = 1; |