diff options
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r-- | kernel/irq/chip.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index ad8131473774..b4c1bc7c9ca2 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -426,6 +426,49 @@ out_unlock: | |||
426 | } | 426 | } |
427 | EXPORT_SYMBOL_GPL(handle_simple_irq); | 427 | EXPORT_SYMBOL_GPL(handle_simple_irq); |
428 | 428 | ||
429 | /** | ||
430 | * handle_untracked_irq - Simple and software-decoded IRQs. | ||
431 | * @desc: the interrupt description structure for this irq | ||
432 | * | ||
433 | * Untracked interrupts are sent from a demultiplexing interrupt | ||
434 | * handler when the demultiplexer does not know which device it its | ||
435 | * multiplexed irq domain generated the interrupt. IRQ's handled | ||
436 | * through here are not subjected to stats tracking, randomness, or | ||
437 | * spurious interrupt detection. | ||
438 | * | ||
439 | * Note: Like handle_simple_irq, the caller is expected to handle | ||
440 | * the ack, clear, mask and unmask issues if necessary. | ||
441 | */ | ||
442 | void handle_untracked_irq(struct irq_desc *desc) | ||
443 | { | ||
444 | unsigned int flags = 0; | ||
445 | |||
446 | raw_spin_lock(&desc->lock); | ||
447 | |||
448 | if (!irq_may_run(desc)) | ||
449 | goto out_unlock; | ||
450 | |||
451 | desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING); | ||
452 | |||
453 | if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) { | ||
454 | desc->istate |= IRQS_PENDING; | ||
455 | goto out_unlock; | ||
456 | } | ||
457 | |||
458 | desc->istate &= ~IRQS_PENDING; | ||
459 | irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS); | ||
460 | raw_spin_unlock(&desc->lock); | ||
461 | |||
462 | __handle_irq_event_percpu(desc, &flags); | ||
463 | |||
464 | raw_spin_lock(&desc->lock); | ||
465 | irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS); | ||
466 | |||
467 | out_unlock: | ||
468 | raw_spin_unlock(&desc->lock); | ||
469 | } | ||
470 | EXPORT_SYMBOL_GPL(handle_untracked_irq); | ||
471 | |||
429 | /* | 472 | /* |
430 | * Called unconditionally from handle_level_irq() and only for oneshot | 473 | * Called unconditionally from handle_level_irq() and only for oneshot |
431 | * interrupts from handle_fasteoi_irq() | 474 | * interrupts from handle_fasteoi_irq() |