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 5d876c9b3a3..8649b0fb9da 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 c35d74c08b5..0a890bdd9c6 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 6fb014f172f..96c3268a509 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; |
