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

Commit ab7798ff authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

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: default avatarThomas Gleixner <tglx@linutronix.de>
parent 08f1b807
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@
#include <asm/ptrace.h>
#include <asm/ptrace.h>
#include <asm/irq_regs.h>
#include <asm/irq_regs.h>


struct seq_file;
struct irq_desc;
struct irq_desc;
struct irq_data;
struct irq_data;
typedef	void (*irq_flow_handler_t)(unsigned int irq,
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)
 * @irq_set_wake:	enable/disable power-management wake-on of an IRQ
 * @irq_set_wake:	enable/disable power-management wake-on of an IRQ
 * @irq_bus_lock:	function to lock access to slow bus (i2c) chips
 * @irq_bus_lock:	function to lock access to slow bus (i2c) chips
 * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
 * @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
 * @irq_print_chip:	optional to print special chip info in show_interrupts
 * @flags:		chip specific flags
 * @flags:		chip specific flags
 *
 *
 * @release:		release function solely used by UML
 * @release:		release function solely used by UML
@@ -317,6 +319,8 @@ struct irq_chip {
	void		(*irq_bus_lock)(struct irq_data *data);
	void		(*irq_bus_lock)(struct irq_data *data);
	void		(*irq_bus_sync_unlock)(struct irq_data *data);
	void		(*irq_bus_sync_unlock)(struct irq_data *data);


	void		(*irq_print_chip)(struct irq_data *data, struct seq_file *p);

	unsigned long	flags;
	unsigned long	flags;


	/* Currently used only by UML, might disappear one day.*/
	/* Currently used only by UML, might disappear one day.*/
+4 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,10 @@ config GENERIC_IRQ_PROBE
config GENERIC_IRQ_SHOW
config GENERIC_IRQ_SHOW
       bool
       bool


# Print level/edge extra information
config GENERIC_IRQ_SHOW_LEVEL
       bool

# Support for delayed migration from interrupt context
# Support for delayed migration from interrupt context
config GENERIC_PENDING_IRQ
config GENERIC_PENDING_IRQ
	bool
	bool
+14 −1
Original line number Original line Diff line number Diff line
@@ -404,7 +404,20 @@ int show_interrupts(struct seq_file *p, void *v)
	seq_printf(p, "%*d: ", prec, i);
	seq_printf(p, "%*d: ", prec, i);
	for_each_online_cpu(j)
	for_each_online_cpu(j)
		seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));
		seq_printf(p, "%10u ", kstat_irqs_cpu(i, j));

	if (desc->irq_data.chip) {
		if (desc->irq_data.chip->irq_print_chip)
			desc->irq_data.chip->irq_print_chip(&desc->irq_data, p);
		else if (desc->irq_data.chip->name)
			seq_printf(p, " %8s", desc->irq_data.chip->name);
			seq_printf(p, " %8s", desc->irq_data.chip->name);
		else
			seq_printf(p, " %8s", "-");
	} else {
		seq_printf(p, " %8s", "None");
	}
#ifdef CONFIG_GENIRC_IRQ_SHOW_LEVEL
	seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge");
#endif
	if (desc->name)
	if (desc->name)
		seq_printf(p, "-%-8s", desc->name);
		seq_printf(p, "-%-8s", desc->name);