diff options
author | David Daney <ddaney@caviumnetworks.com> | 2011-03-25 15:38:49 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-03-27 11:45:58 -0400 |
commit | 0fdb4b259ed3e91b687ac26848202f5e7c217e62 (patch) | |
tree | 52503c0c5c35f95ab88a9867fc46c43fc7d9c200 /kernel/irq/chip.c | |
parent | 801a0e9ae36e9b487092e31699d28c0b9a21ad52 (diff) |
genirq: Add chip hooks for taking CPUs on/off line.
[ tglx: Removed the enabled argument as this is now available in
irq_data ]
Signed-off-by: David Daney <ddaney@caviumnetworks.com>
Cc: linux-mips@linux-mips.org
Cc: ralf@linux-mips.org
LKML-Reference: <1301081931-11240-3-git-send-email-ddaney@caviumnetworks.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel/irq/chip.c')
-rw-r--r-- | kernel/irq/chip.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 0a890bdd9c63..44b16a1ecd9a 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -696,3 +696,61 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set) | |||
696 | 696 | ||
697 | irq_put_desc_unlock(desc, flags); | 697 | irq_put_desc_unlock(desc, flags); |
698 | } | 698 | } |
699 | |||
700 | /** | ||
701 | * irq_cpu_online - Invoke all irq_cpu_online functions. | ||
702 | * | ||
703 | * Iterate through all irqs and invoke the chip.irq_cpu_online() | ||
704 | * for each. | ||
705 | */ | ||
706 | void irq_cpu_online(void) | ||
707 | { | ||
708 | struct irq_desc *desc; | ||
709 | struct irq_chip *chip; | ||
710 | unsigned long flags; | ||
711 | unsigned int irq; | ||
712 | |||
713 | for_each_active_irq(irq) { | ||
714 | desc = irq_to_desc(irq); | ||
715 | if (!desc) | ||
716 | continue; | ||
717 | |||
718 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
719 | |||
720 | chip = irq_data_get_irq_chip(&desc->irq_data); | ||
721 | |||
722 | if (chip && chip->irq_cpu_online) | ||
723 | chip->irq_cpu_online(&desc->irq_data); | ||
724 | |||
725 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
726 | } | ||
727 | } | ||
728 | |||
729 | /** | ||
730 | * irq_cpu_offline - Invoke all irq_cpu_offline functions. | ||
731 | * | ||
732 | * Iterate through all irqs and invoke the chip.irq_cpu_offline() | ||
733 | * for each. | ||
734 | */ | ||
735 | void irq_cpu_offline(void) | ||
736 | { | ||
737 | struct irq_desc *desc; | ||
738 | struct irq_chip *chip; | ||
739 | unsigned long flags; | ||
740 | unsigned int irq; | ||
741 | |||
742 | for_each_active_irq(irq) { | ||
743 | desc = irq_to_desc(irq); | ||
744 | if (!desc) | ||
745 | continue; | ||
746 | |||
747 | raw_spin_lock_irqsave(&desc->lock, flags); | ||
748 | |||
749 | chip = irq_data_get_irq_chip(&desc->irq_data); | ||
750 | |||
751 | if (chip && chip->irq_cpu_offline) | ||
752 | chip->irq_cpu_offline(&desc->irq_data); | ||
753 | |||
754 | raw_spin_unlock_irqrestore(&desc->lock, flags); | ||
755 | } | ||
756 | } | ||