x86: devicetree: Configure IOAPIC pin only once
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Wed, 27 Apr 2011 14:30:52 +0000 (16:30 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 28 Apr 2011 09:38:30 +0000 (11:38 +0200)
commit20443598d9bdfe3563f901e27fd482a3f5d3d231
treeccab9d3d7a94e6f5ce700edf2ae3889668bdf3b4
parent39b68976ac653cfdc7f872a293e8b7928de2dcc6
x86: devicetree: Configure IOAPIC pin only once

We use io_apic_setup_irq_pin() in order to configure pin's interrupt
number polarity and type. This is done on every irq_create_of_mapping()
which happens for instance during pci enable calls. Level typed
interrupts are masked by default, edge are unmasked.

On the first ->xlate() call the level interrupt is configured and
masked. The driver calls request_irq() and the line is unmasked. Lets
assume the interrupt line is shared with another device and we call
pci_enable_device() for this device. The ->xlate() configures the pin
again and it is masked. request_irq() does not unmask the line because
it _is_ already unmasked according to its internal state. So the
interrupt will never be unmasked again.

This patch is based on an earlier work by Torben Hohn and solves the
problem by configuring the pin only once. Since all devices must agree
on the same type and polarity there is no point in configuring the pin
more than once.

[ tglx: Split out the ce4100 part into a separate patch ]

Cc: Torben Hohn <torbenh@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: http://lkml.kernel.org/r/%3C20110427143052.GA15211%40linutronix.de%3E
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/include/asm/io_apic.h
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/devicetree.c