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 | |
| 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')
| -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 | } | ||
