Commit ab7798ffcf98b11a9525cf65bacdae3fd58d357f
1 parent
08f1b80735
Exists in
master
and in
20 other branches
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>
Showing 3 changed files with 22 additions and 1 deletions Side-by-side Diff
include/linux/irq.h
... | ... | @@ -28,6 +28,7 @@ |
28 | 28 | #include <asm/ptrace.h> |
29 | 29 | #include <asm/irq_regs.h> |
30 | 30 | |
31 | +struct seq_file; | |
31 | 32 | struct irq_desc; |
32 | 33 | struct irq_data; |
33 | 34 | typedef void (*irq_flow_handler_t)(unsigned int irq, |
... | ... | @@ -270,6 +271,7 @@ |
270 | 271 | * @irq_set_wake: enable/disable power-management wake-on of an IRQ |
271 | 272 | * @irq_bus_lock: function to lock access to slow bus (i2c) chips |
272 | 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 | 275 | * @flags: chip specific flags |
274 | 276 | * |
275 | 277 | * @release: release function solely used by UML |
... | ... | @@ -316,6 +318,8 @@ |
316 | 318 | |
317 | 319 | void (*irq_bus_lock)(struct irq_data *data); |
318 | 320 | void (*irq_bus_sync_unlock)(struct irq_data *data); |
321 | + | |
322 | + void (*irq_print_chip)(struct irq_data *data, struct seq_file *p); | |
319 | 323 | |
320 | 324 | unsigned long flags; |
321 | 325 |
kernel/irq/Kconfig
kernel/irq/proc.c
... | ... | @@ -404,7 +404,20 @@ |
404 | 404 | seq_printf(p, "%*d: ", prec, i); |
405 | 405 | for_each_online_cpu(j) |
406 | 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 | 421 | if (desc->name) |
409 | 422 | seq_printf(p, "-%-8s", desc->name); |
410 | 423 |