diff --git a/Documentation/DocBook/genericirq.tmpl b/Documentation/DocBook/genericirq.tmpl
index fb10fd08c05cd00a49a4276f06842299e092b4a7..b3422341d65c7ae07c14b743c328cae15c529d17 100644
--- a/Documentation/DocBook/genericirq.tmpl
+++ b/Documentation/DocBook/genericirq.tmpl
@@ -191,8 +191,8 @@
Whenever an interrupt triggers, the lowlevel arch code calls into
the generic interrupt code by calling desc->handle_irq().
- This highlevel IRQ handling function only uses desc->chip primitives
- referenced by the assigned chip descriptor structure.
+ This highlevel IRQ handling function only uses desc->irq_data.chip
+ primitives referenced by the assigned chip descriptor structure.
@@ -206,11 +206,11 @@
enable_irq()
disable_irq_nosync() (SMP only)
synchronize_irq() (SMP only)
- set_irq_type()
- set_irq_wake()
- set_irq_data()
- set_irq_chip()
- set_irq_chip_data()
+ irq_set_irq_type()
+ irq_set_irq_wake()
+ irq_set_handler_data()
+ irq_set_chip()
+ irq_set_chip_data()
See the autogenerated function documentation for details.
@@ -225,6 +225,8 @@
handle_fasteoi_irq
handle_simple_irq
handle_percpu_irq
+ handle_edge_eoi_irq
+ handle_bad_irq
The interrupt flow handlers (either predefined or architecture
specific) are assigned to specific interrupts by the architecture
@@ -241,13 +243,13 @@
default_enable(struct irq_data *data)
{
- desc->chip->irq_unmask(data);
+ desc->irq_data.chip->irq_unmask(data);
}
default_disable(struct irq_data *data)
{
if (!delay_disable(data))
- desc->chip->irq_mask(data);
+ desc->irq_data.chip->irq_mask(data);
}
default_ack(struct irq_data *data)
@@ -284,9 +286,9 @@ noop(struct irq_data *data))
The following control flow is implemented (simplified excerpt):
-desc->chip->irq_mask();
-handle_IRQ_event(desc->action);
-desc->chip->irq_unmask();
+desc->irq_data.chip->irq_mask_ack();
+handle_irq_event(desc->action);
+desc->irq_data.chip->irq_unmask();
@@ -300,8 +302,8 @@ desc->chip->irq_unmask();
The following control flow is implemented (simplified excerpt):
-handle_IRQ_event(desc->action);
-desc->chip->irq_eoi();
+handle_irq_event(desc->action);
+desc->irq_data.chip->irq_eoi();
@@ -315,17 +317,17 @@ desc->chip->irq_eoi();
The following control flow is implemented (simplified excerpt):
if (desc->status & running) {
- desc->chip->irq_mask();
+ desc->irq_data.chip->irq_mask_ack();
desc->status |= pending | masked;
return;
}
-desc->chip->irq_ack();
+desc->irq_data.chip->irq_ack();
desc->status |= running;
do {
if (desc->status & masked)
- desc->chip->irq_unmask();
+ desc->irq_data.chip->irq_unmask();
desc->status &= ~pending;
- handle_IRQ_event(desc->action);
+ handle_irq_event(desc->action);
} while (status & pending);
desc->status &= ~running;
@@ -344,7 +346,7 @@ desc->status &= ~running;
The following control flow is implemented (simplified excerpt):
-handle_IRQ_event(desc->action);
+handle_irq_event(desc->action);
@@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
The following control flow is implemented (simplified excerpt):
-handle_IRQ_event(desc->action);
-if (desc->chip->irq_eoi)
- desc->chip->irq_eoi();
+if (desc->irq_data.chip->irq_ack)
+ desc->irq_data.chip->irq_ack();
+handle_irq_event(desc->action);
+if (desc->irq_data.chip->irq_eoi)
+ desc->irq_data.chip->irq_eoi();
+
+ EOI Edge IRQ flow handler
+
+ handle_edge_eoi_irq provides an abnomination of the edge
+ handler which is solely used to tame a badly wreckaged
+ irq controller on powerpc/cell.
+
+
+
+ Bad IRQ flow handler
+
+ handle_bad_irq is used for spurious interrupts which
+ have no real handler assigned..
+
+
Quirks and optimizations
@@ -410,6 +429,7 @@ if (desc->chip->irq_eoi)
irq_mask_ack() - Optional, recommended for performance
irq_mask()
irq_unmask()
+ irq_eoi() - Optional, required for eoi flow handlers
irq_retrigger() - Optional
irq_set_type() - Optional
irq_set_wake() - Optional
@@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
__do_IRQ entry point
- The original implementation __do_IRQ() is an alternative entry
- point for all types of interrupts.
+ The original implementation __do_IRQ() was an alternative entry
+ point for all types of interrupts. It not longer exists.
This handler turned out to be not suitable for all
interrupt hardware and was therefore reimplemented with split
- functionality for egde/level/simple/percpu interrupts. This is not
+ functionality for edge/level/simple/percpu interrupts. This is not
only a functional optimization. It also shortens code paths for
interrupts.
-
- To make use of the split implementation, replace the call to
- __do_IRQ by a call to desc->handle_irq() and associate
- the appropriate handler function to desc->handle_irq().
- In most cases the generic handler implementations should
- be sufficient.
-
Locking on SMP
The locking of chip registers is up to the architecture that
- defines the chip primitives. There is a chip->lock field that can be used
- for serialization, but the generic layer does not touch it. The per-irq
- structure is protected via desc->lock, by the generic layer.
+ defines the chip primitives. The per-irq structure is
+ protected via desc->lock, by the generic layer.