diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-03-25 11:48:50 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-03-25 12:04:20 -0400 |
commit | ab7798ffcf98b11a9525cf65bacdae3fd58d357f (patch) | |
tree | 834ed73e8ab309895934bcf8bfe9e531ec10b32b | |
parent | 08f1b807355c8d355885a71e7fd462fe9d499411 (diff) |
genirq: Expand generic show_interrupts()
Some archs want to print extra information for certain irq_chips which
is per irq and not per chip. Allow them to provide a chip callback to
print the chip name and the extra information.
PowerPC wants to print the LEVEL/EDGE type information. Make it configurable.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/linux/irq.h | 4 | ||||
-rw-r--r-- | kernel/irq/Kconfig | 4 | ||||
-rw-r--r-- | kernel/irq/proc.c | 15 |
3 files changed, 22 insertions, 1 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index 1d3577f30d45..5d876c9b3a3d 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/ptrace.h> | 28 | #include <asm/ptrace.h> |
29 | #include <asm/irq_regs.h> | 29 | #include <asm/irq_regs.h> |
30 | 30 | ||
31 | struct seq_file; | ||
31 | struct irq_desc; | 32 | struct irq_desc; |
32 | struct irq_data; | 33 | struct irq_data; |
33 | typedef void (*irq_flow_handler_t)(unsigned int irq, | 34 | typedef void (*irq_flow_handler_t)(unsigned int irq, |
@@ -270,6 +271,7 @@ static inline bool irqd_can_move_in_process_context(struct irq_data *d) | |||
270 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ | 271 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ |
271 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips | 272 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips |
272 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips | 273 | * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips |
274 | * @irq_print_chip: optional to print special chip info in show_interrupts | ||
273 | * @flags: chip specific flags | 275 | * @flags: chip specific flags |
274 | * | 276 | * |
275 | * @release: release function solely used by UML | 277 | * @release: release function solely used by UML |
@@ -317,6 +319,8 @@ struct irq_chip { | |||
317 | void (*irq_bus_lock)(struct irq_data *data); | 319 | void (*irq_bus_lock)(struct irq_data *data); |
318 | void (*irq_bus_sync_unlock)(struct irq_data *data); | 320 | void (*irq_bus_sync_unlock)(struct irq_data *data); |
319 | 321 | ||
322 | void (*irq_print_chip)(struct irq_data *data, struct seq_file *p); | ||
323 | |||
320 | unsigned long flags; | 324 | unsigned long flags; |
321 | 325 | ||
322 | /* Currently used only by UML, might disappear one day.*/ | 326 | /* Currently used only by UML, might disappear one day.*/ |
diff --git a/kernel/irq/Kconfig b/kernel/irq/Kconfig index 09bef82d74cb..00f2c037267a 100644 --- a/kernel/irq/Kconfig +++ b/kernel/irq/Kconfig | |||
@@ -31,6 +31,10 @@ config GENERIC_IRQ_PROBE | |||
31 | config GENERIC_IRQ_SHOW | 31 | config GENERIC_IRQ_SHOW |
32 | bool | 32 | bool |
33 | 33 | ||
34 | # Print level/edge extra information | ||
35 | config GENERIC_IRQ_SHOW_LEVEL | ||
36 | bool | ||
37 | |||
34 | # Support for delayed migration from interrupt context | 38 | # Support for delayed migration from interrupt context |
35 | config GENERIC_PENDING_IRQ | 39 | config GENERIC_PENDING_IRQ |
36 | bool | 40 | bool |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index 760248de109d..626d092eed9a 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
@@ -404,7 +404,20 @@ int show_interrupts(struct seq_file *p, void *v) | |||
404 | seq_printf(p, "%*d: ", prec, i); | 404 | seq_printf(p, "%*d: ", prec, i); |
405 | for_each_online_cpu(j) | 405 | for_each_online_cpu(j) |
406 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); | 406 | seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); |
407 | seq_printf(p, " %8s", desc->irq_data.chip->name); | 407 | |
408 | if (desc->irq_data.chip) { | ||
409 | if (desc->irq_data.chip->irq_print_chip) | ||
410 | desc->irq_data.chip->irq_print_chip(&desc->irq_data, p); | ||
411 | else if (desc->irq_data.chip->name) | ||
412 | seq_printf(p, " %8s", desc->irq_data.chip->name); | ||
413 | else | ||
414 | seq_printf(p, " %8s", "-"); | ||
415 | } else { | ||
416 | seq_printf(p, " %8s", "None"); | ||
417 | } | ||
418 | #ifdef CONFIG_GENIRC_IRQ_SHOW_LEVEL | ||
419 | seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge"); | ||
420 | #endif | ||
408 | if (desc->name) | 421 | if (desc->name) |
409 | seq_printf(p, "-%-8s", desc->name); | 422 | seq_printf(p, "-%-8s", desc->name); |
410 | 423 | ||