Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a60cfa9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'irq-core-for-linus' of...

Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (96 commits)
  apic, x86: Use BIOS settings for IBS and MCE threshold interrupt LVT offsets
  apic, x86: Check if EILVT APIC registers are available (AMD only)
  x86: ioapic: Call free_irte only if interrupt remapping enabled
  arm: Use ARCH_IRQ_INIT_FLAGS
  genirq, ARM: Fix boot on ARM platforms
  genirq: Fix CONFIG_GENIRQ_NO_DEPRECATED=y build
  x86: Switch sparse_irq allocations to GFP_KERNEL
  genirq: Switch sparse_irq allocator to GFP_KERNEL
  genirq: Make sparse_lock a mutex
  x86: lguest: Use new irq allocator
  genirq: Remove the now unused sparse irq leftovers
  genirq: Sanitize dynamic irq handling
  genirq: Remove arch_init_chip_data()
  x86: xen: Sanitise sparse_irq handling
  x86: Use sane enumeration
  x86: uv: Clean up the direct access to irq_desc
  x86: Make io_apic.c local functions static
  genirq: Remove irq_2_iommu
  x86: Speed up the irq_remapped check in hot pathes
  intr_remap: Simplify the code further
  ...

Fix up trivial conflicts in arch/x86/Kconfig
parents 62bea97f 27afdf20
Loading
Loading
Loading
Loading
+52 −32
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@
  </authorgroup>

  <copyright>
   <year>2005-2006</year>
   <year>2005-2010</year>
   <holder>Thomas Gleixner</holder>
  </copyright>
  <copyright>
@@ -100,6 +100,10 @@
	  <listitem><para>Edge type</para></listitem>
	  <listitem><para>Simple type</para></listitem>
	</itemizedlist>
	During the implementation we identified another type:
	<itemizedlist>
	  <listitem><para>Fast EOI type</para></listitem>
	</itemizedlist>
	In the SMP world of the __do_IRQ() super-handler another type
	was identified:
	<itemizedlist>
@@ -153,6 +157,7 @@
	is still available. This leads to a kind of duality for the time
	being. Over time the new model should be used in more and more
	architectures, as it enables smaller and cleaner IRQ subsystems.
	It's deprecated for three years now and about to be removed.
	</para>
  </chapter>
  <chapter id="bugs">
@@ -217,6 +222,7 @@
	  <itemizedlist>
	  <listitem><para>handle_level_irq</para></listitem>
	  <listitem><para>handle_edge_irq</para></listitem>
	  <listitem><para>handle_fasteoi_irq</para></listitem>
	  <listitem><para>handle_simple_irq</para></listitem>
	  <listitem><para>handle_percpu_irq</para></listitem>
	  </itemizedlist>
@@ -233,33 +239,33 @@
		are used by the default flow implementations.
		The following helper functions are implemented (simplified excerpt):
		<programlisting>
default_enable(irq)
default_enable(struct irq_data *data)
{
	desc->chip->unmask(irq);
	desc->chip->irq_unmask(data);
}

default_disable(irq)
default_disable(struct irq_data *data)
{
	if (!delay_disable(irq))
		desc->chip->mask(irq);
	if (!delay_disable(data))
		desc->chip->irq_mask(data);
}

default_ack(irq)
default_ack(struct irq_data *data)
{
	chip->ack(irq);
	chip->irq_ack(data);
}

default_mask_ack(irq)
default_mask_ack(struct irq_data *data)
{
	if (chip->mask_ack) {
		chip->mask_ack(irq);
	if (chip->irq_mask_ack) {
		chip->irq_mask_ack(data);
	} else {
		chip->mask(irq);
		chip->ack(irq);
		chip->irq_mask(data);
		chip->irq_ack(data);
	}
}

noop(irq)
noop(struct irq_data *data))
{
}

@@ -278,9 +284,24 @@ noop(irq)
		<para>
		The following control flow is implemented (simplified excerpt):
		<programlisting>
desc->chip->start();
desc->chip->irq_mask();
handle_IRQ_event(desc->action);
desc->chip->irq_unmask();
		</programlisting>
		</para>
	    </sect3>
	    <sect3 id="Default_FASTEOI_IRQ_flow_handler">
		<title>Default Fast EOI IRQ flow handler</title>
		<para>
		handle_fasteoi_irq provides a generic implementation
		for interrupts, which only need an EOI at the end of
		the handler
		</para>
		<para>
		The following control flow is implemented (simplified excerpt):
		<programlisting>
handle_IRQ_event(desc->action);
desc->chip->end();
desc->chip->irq_eoi();
		</programlisting>
		</para>
	    </sect3>
@@ -294,20 +315,19 @@ desc->chip->end();
		The following control flow is implemented (simplified excerpt):
		<programlisting>
if (desc->status &amp; running) {
	desc->chip->hold();
	desc->chip->irq_mask();
	desc->status |= pending | masked;
	return;
}
desc->chip->start();
desc->chip->irq_ack();
desc->status |= running;
do {
	if (desc->status &amp; masked)
		desc->chip->enable();
		desc->chip->irq_unmask();
	desc->status &amp;= ~pending;
	handle_IRQ_event(desc->action);
} while (status &amp; pending);
desc->status &amp;= ~running;
desc->chip->end();
		</programlisting>
		</para>
   	    </sect3>
@@ -342,9 +362,9 @@ handle_IRQ_event(desc->action);
		<para>
		The following control flow is implemented (simplified excerpt):
		<programlisting>
desc->chip->start();
handle_IRQ_event(desc->action);
desc->chip->end();
if (desc->chip->irq_eoi)
        desc->chip->irq_eoi();
		</programlisting>
		</para>
   	    </sect3>
@@ -375,8 +395,7 @@ desc->chip->end();
	mechanism. (It's necessary to enable CONFIG_HARDIRQS_SW_RESEND when
	you want to use the delayed interrupt disable feature and your
	hardware is not capable of retriggering	an interrupt.)
	The delayed interrupt disable can be runtime enabled, per interrupt,
	by setting the IRQ_DELAYED_DISABLE flag in the irq_desc status field.
	The delayed interrupt disable is not configurable.
	</para>
	</sect2>
    </sect1>
@@ -387,13 +406,13 @@ desc->chip->end();
	contains all the direct chip relevant functions, which
	can be utilized by the irq flow implementations.
	  <itemizedlist>
	  <listitem><para>ack()</para></listitem>
	  <listitem><para>mask_ack() - Optional, recommended for performance</para></listitem>
	  <listitem><para>mask()</para></listitem>
	  <listitem><para>unmask()</para></listitem>
	  <listitem><para>retrigger() - Optional</para></listitem>
	  <listitem><para>set_type() - Optional</para></listitem>
	  <listitem><para>set_wake() - Optional</para></listitem>
	  <listitem><para>irq_ack()</para></listitem>
	  <listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem>
	  <listitem><para>irq_mask()</para></listitem>
	  <listitem><para>irq_unmask()</para></listitem>
	  <listitem><para>irq_retrigger() - Optional</para></listitem>
	  <listitem><para>irq_set_type() - Optional</para></listitem>
	  <listitem><para>irq_set_wake() - Optional</para></listitem>
	  </itemizedlist>
	These primitives are strictly intended to mean what they say: ack means
	ACK, masking means masking of an IRQ line, etc. It is up to the flow
@@ -458,6 +477,7 @@ desc->chip->end();
     <para>
     This chapter contains the autogenerated documentation of the internal functions.
     </para>
!Ikernel/irq/irqdesc.c
!Ikernel/irq/handle.c
!Ikernel/irq/chip.c
  </chapter>
+6 −0
Original line number Diff line number Diff line
@@ -3241,6 +3241,12 @@ F: drivers/net/irda/
F:	include/net/irda/
F:	net/irda/

IRQ SUBSYSTEM
M:	Thomas Gleixner <tglx@linutronix.de>
S:	Maintained
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
F:	kernel/irq/

ISAPNP
M:	Jaroslav Kysela <perex@perex.cz>
S:	Maintained
+2 −0
Original line number Diff line number Diff line
@@ -24,4 +24,6 @@ void set_irq_flags(unsigned int irq, unsigned int flags);
#define IRQF_PROBE	(1 << 1)
#define IRQF_NOAUTOEN	(1 << 2)

#define ARCH_IRQ_INIT_FLAGS	(IRQ_NOREQUEST | IRQ_NOPROBE)

#endif
+1 −9
Original line number Diff line number Diff line
@@ -154,14 +154,6 @@ void set_irq_flags(unsigned int irq, unsigned int iflags)

void __init init_IRQ(void)
{
	struct irq_desc *desc;
	int irq;

	for (irq = 0; irq < nr_irqs; irq++) {
		desc = irq_to_desc_alloc_node(irq, 0);
		desc->status |= IRQ_NOREQUEST | IRQ_NOPROBE;
	}

	init_arch_irq();
}

@@ -169,7 +161,7 @@ void __init init_IRQ(void)
int __init arch_probe_nr_irqs(void)
{
	nr_irqs = arch_nr_irqs ? arch_nr_irqs : NR_IRQS;
	return 0;
	return nr_irqs;
}
#endif

+3 −3
Original line number Diff line number Diff line
@@ -67,21 +67,21 @@ static void bcmring_unmask_irq2(unsigned int irq)
}

static struct irq_chip bcmring_irq0_chip = {
	.typename = "ARM-INTC0",
	.name = "ARM-INTC0",
	.ack = bcmring_mask_irq0,
	.mask = bcmring_mask_irq0,	/* mask a specific interrupt, blocking its delivery. */
	.unmask = bcmring_unmask_irq0,	/* unmaks an interrupt */
};

static struct irq_chip bcmring_irq1_chip = {
	.typename = "ARM-INTC1",
	.name = "ARM-INTC1",
	.ack = bcmring_mask_irq1,
	.mask = bcmring_mask_irq1,
	.unmask = bcmring_unmask_irq1,
};

static struct irq_chip bcmring_irq2_chip = {
	.typename = "ARM-SINTC",
	.name = "ARM-SINTC",
	.ack = bcmring_mask_irq2,
	.mask = bcmring_mask_irq2,
	.unmask = bcmring_unmask_irq2,
Loading