mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
0c5d1eb77a
Genirq hasn't previously recorded the trigger type used by any given IRQ, although some irq_chip support has done so. That data can be useful when troubleshooting. This patch records it in the relevant irq_desc.status bits, and improves consistency between the two driver-visible calls affected: - Make set_irq_type() usage match request_irq() usage: * IRQ_TYPE_NONE should be a NOP; succeed, so irq_chip methods won't have to handle that case any more (many do it wrong). * IRQ_TYPE_PROBE is ignored; any buggy out-of-tree callers might need to switch over to the real IRQ probing code. * emit the same diagnostics (from shared utility code) - Their kerneldoc now reflects usage: * request_irq() flags include IRQF_TRIGGER_* to specify active edge(s)/level ... docs previously omitted that * set_irq_type() is declared in <linux/irq.h> so callers should use the (bit-equivalent) IRQ_TYPE_* symbols there Also: adds a warning about shared IRQs that don't end up using the requested trigger mode; and fix an unrelated "sparse" warning. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Acked-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
68 lines
1.8 KiB
C
68 lines
1.8 KiB
C
/*
|
|
* IRQ subsystem internal functions and variables:
|
|
*/
|
|
|
|
extern int noirqdebug;
|
|
|
|
/* Set default functions for irq_chip structures: */
|
|
extern void irq_chip_set_defaults(struct irq_chip *chip);
|
|
|
|
/* Set default handler: */
|
|
extern void compat_irq_chip_set_default_handler(struct irq_desc *desc);
|
|
|
|
extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
|
|
unsigned long flags);
|
|
|
|
#ifdef CONFIG_PROC_FS
|
|
extern void register_irq_proc(unsigned int irq);
|
|
extern void register_handler_proc(unsigned int irq, struct irqaction *action);
|
|
extern void unregister_handler_proc(unsigned int irq, struct irqaction *action);
|
|
#else
|
|
static inline void register_irq_proc(unsigned int irq) { }
|
|
static inline void register_handler_proc(unsigned int irq,
|
|
struct irqaction *action) { }
|
|
static inline void unregister_handler_proc(unsigned int irq,
|
|
struct irqaction *action) { }
|
|
#endif
|
|
|
|
/*
|
|
* Debugging printout:
|
|
*/
|
|
|
|
#include <linux/kallsyms.h>
|
|
|
|
#define P(f) if (desc->status & f) printk("%14s set\n", #f)
|
|
|
|
static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
|
|
{
|
|
printk("irq %d, desc: %p, depth: %d, count: %d, unhandled: %d\n",
|
|
irq, desc, desc->depth, desc->irq_count, desc->irqs_unhandled);
|
|
printk("->handle_irq(): %p, ", desc->handle_irq);
|
|
print_symbol("%s\n", (unsigned long)desc->handle_irq);
|
|
printk("->chip(): %p, ", desc->chip);
|
|
print_symbol("%s\n", (unsigned long)desc->chip);
|
|
printk("->action(): %p\n", desc->action);
|
|
if (desc->action) {
|
|
printk("->action->handler(): %p, ", desc->action->handler);
|
|
print_symbol("%s\n", (unsigned long)desc->action->handler);
|
|
}
|
|
|
|
P(IRQ_INPROGRESS);
|
|
P(IRQ_DISABLED);
|
|
P(IRQ_PENDING);
|
|
P(IRQ_REPLAY);
|
|
P(IRQ_AUTODETECT);
|
|
P(IRQ_WAITING);
|
|
P(IRQ_LEVEL);
|
|
P(IRQ_MASKED);
|
|
#ifdef CONFIG_IRQ_PER_CPU
|
|
P(IRQ_PER_CPU);
|
|
#endif
|
|
P(IRQ_NOPROBE);
|
|
P(IRQ_NOREQUEST);
|
|
P(IRQ_NOAUTOEN);
|
|
}
|
|
|
|
#undef P
|
|
|