diff options
| -rw-r--r-- | kernel/irq/autoprobe.c | 4 | ||||
| -rw-r--r-- | kernel/irq/chip.c | 17 | ||||
| -rw-r--r-- | kernel/irq/internals.h | 2 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 2 |
4 files changed, 14 insertions, 11 deletions
diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c index 342d8f44e40..0119b9d467a 100644 --- a/kernel/irq/autoprobe.c +++ b/kernel/irq/autoprobe.c | |||
| @@ -53,7 +53,7 @@ unsigned long probe_irq_on(void) | |||
| 53 | if (desc->irq_data.chip->irq_set_type) | 53 | if (desc->irq_data.chip->irq_set_type) |
| 54 | desc->irq_data.chip->irq_set_type(&desc->irq_data, | 54 | desc->irq_data.chip->irq_set_type(&desc->irq_data, |
| 55 | IRQ_TYPE_PROBE); | 55 | IRQ_TYPE_PROBE); |
| 56 | irq_startup(desc); | 56 | irq_startup(desc, false); |
| 57 | } | 57 | } |
| 58 | raw_spin_unlock_irq(&desc->lock); | 58 | raw_spin_unlock_irq(&desc->lock); |
| 59 | } | 59 | } |
| @@ -70,7 +70,7 @@ unsigned long probe_irq_on(void) | |||
| 70 | raw_spin_lock_irq(&desc->lock); | 70 | raw_spin_lock_irq(&desc->lock); |
| 71 | if (!desc->action && irq_settings_can_probe(desc)) { | 71 | if (!desc->action && irq_settings_can_probe(desc)) { |
| 72 | desc->istate |= IRQS_AUTODETECT | IRQS_WAITING; | 72 | desc->istate |= IRQS_AUTODETECT | IRQS_WAITING; |
| 73 | if (irq_startup(desc)) | 73 | if (irq_startup(desc, false)) |
| 74 | desc->istate |= IRQS_PENDING; | 74 | desc->istate |= IRQS_PENDING; |
| 75 | } | 75 | } |
| 76 | raw_spin_unlock_irq(&desc->lock); | 76 | raw_spin_unlock_irq(&desc->lock); |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 3322a34d9ee..ca14f5dcabd 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -157,19 +157,22 @@ static void irq_state_set_masked(struct irq_desc *desc) | |||
| 157 | irqd_set(&desc->irq_data, IRQD_IRQ_MASKED); | 157 | irqd_set(&desc->irq_data, IRQD_IRQ_MASKED); |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | int irq_startup(struct irq_desc *desc) | 160 | int irq_startup(struct irq_desc *desc, bool resend) |
| 161 | { | 161 | { |
| 162 | int ret = 0; | ||
| 163 | |||
| 162 | irq_state_clr_disabled(desc); | 164 | irq_state_clr_disabled(desc); |
| 163 | desc->depth = 0; | 165 | desc->depth = 0; |
| 164 | 166 | ||
| 165 | if (desc->irq_data.chip->irq_startup) { | 167 | if (desc->irq_data.chip->irq_startup) { |
| 166 | int ret = desc->irq_data.chip->irq_startup(&desc->irq_data); | 168 | ret = desc->irq_data.chip->irq_startup(&desc->irq_data); |
| 167 | irq_state_clr_masked(desc); | 169 | irq_state_clr_masked(desc); |
| 168 | return ret; | 170 | } else { |
| 171 | irq_enable(desc); | ||
| 169 | } | 172 | } |
| 170 | 173 | if (resend) | |
| 171 | irq_enable(desc); | 174 | check_irq_resend(desc, desc->irq_data.irq); |
| 172 | return 0; | 175 | return ret; |
| 173 | } | 176 | } |
| 174 | 177 | ||
| 175 | void irq_shutdown(struct irq_desc *desc) | 178 | void irq_shutdown(struct irq_desc *desc) |
| @@ -596,7 +599,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, | |||
| 596 | irq_settings_set_noprobe(desc); | 599 | irq_settings_set_noprobe(desc); |
| 597 | irq_settings_set_norequest(desc); | 600 | irq_settings_set_norequest(desc); |
| 598 | irq_settings_set_nothread(desc); | 601 | irq_settings_set_nothread(desc); |
| 599 | irq_startup(desc); | 602 | irq_startup(desc, true); |
| 600 | } | 603 | } |
| 601 | out: | 604 | out: |
| 602 | irq_put_desc_busunlock(desc, flags); | 605 | irq_put_desc_busunlock(desc, flags); |
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index 6546431447d..62efdc44b64 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
| @@ -67,7 +67,7 @@ extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
| 67 | extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp); | 67 | extern void __disable_irq(struct irq_desc *desc, unsigned int irq, bool susp); |
| 68 | extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); | 68 | extern void __enable_irq(struct irq_desc *desc, unsigned int irq, bool resume); |
| 69 | 69 | ||
| 70 | extern int irq_startup(struct irq_desc *desc); | 70 | extern int irq_startup(struct irq_desc *desc, bool resend); |
| 71 | extern void irq_shutdown(struct irq_desc *desc); | 71 | extern void irq_shutdown(struct irq_desc *desc); |
| 72 | extern void irq_enable(struct irq_desc *desc); | 72 | extern void irq_enable(struct irq_desc *desc); |
| 73 | extern void irq_disable(struct irq_desc *desc); | 73 | extern void irq_disable(struct irq_desc *desc); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index a1aadab09aa..def3406fb43 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -1018,7 +1018,7 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new) | |||
| 1018 | desc->istate |= IRQS_ONESHOT; | 1018 | desc->istate |= IRQS_ONESHOT; |
| 1019 | 1019 | ||
| 1020 | if (irq_settings_can_autoenable(desc)) | 1020 | if (irq_settings_can_autoenable(desc)) |
| 1021 | irq_startup(desc); | 1021 | irq_startup(desc, true); |
| 1022 | else | 1022 | else |
| 1023 | /* Undo nested disables: */ | 1023 | /* Undo nested disables: */ |
| 1024 | desc->depth = 1; | 1024 | desc->depth = 1; |
