2005-04-17 02:20:36 +04:00
/*
* IRQ subsystem internal functions and variables :
*/
2010-10-01 18:03:45 +04:00
# include <linux/irqdesc.h>
2005-04-17 02:20:36 +04:00
2011-02-17 19:45:15 +03:00
# ifdef CONFIG_SPARSE_IRQ
# define IRQ_BITMAP_BITS (NR_IRQS + 8196)
# else
# define IRQ_BITMAP_BITS NR_IRQS
# endif
2005-04-17 02:20:36 +04:00
extern int noirqdebug ;
2010-10-01 16:44:58 +04:00
# define irq_data_to_desc(data) container_of(data, struct irq_desc, irq_data)
2006-06-29 13:24:51 +04:00
/* 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 ) ;
2008-10-02 01:46:18 +04:00
extern int __irq_set_trigger ( struct irq_desc * desc , unsigned int irq ,
unsigned long flags ) ;
2009-03-17 00:33:49 +03:00
extern void __disable_irq ( struct irq_desc * desc , unsigned int irq , bool susp ) ;
extern void __enable_irq ( struct irq_desc * desc , unsigned int irq , bool resume ) ;
2008-10-02 01:46:18 +04:00
2009-04-28 05:00:38 +04:00
extern void init_kstat_irqs ( struct irq_desc * desc , int node , int nr ) ;
2009-01-11 09:24:06 +03:00
2010-10-01 18:03:45 +04:00
/* Resending of interrupts :*/
void check_irq_resend ( struct irq_desc * desc , unsigned int irq ) ;
2011-02-07 12:34:30 +03:00
bool irq_wait_for_poll ( struct irq_desc * desc ) ;
2010-10-01 18:03:45 +04:00
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_PROC_FS
2008-08-20 07:50:11 +04:00
extern void register_irq_proc ( unsigned int irq , struct irq_desc * desc ) ;
2010-09-30 04:46:07 +04:00
extern void unregister_irq_proc ( unsigned int irq , struct irq_desc * desc ) ;
2005-04-17 02:20:36 +04:00
extern void register_handler_proc ( unsigned int irq , struct irqaction * action ) ;
extern void unregister_handler_proc ( unsigned int irq , struct irqaction * action ) ;
# else
2008-08-20 07:50:11 +04:00
static inline void register_irq_proc ( unsigned int irq , struct irq_desc * desc ) { }
2010-09-30 04:46:07 +04:00
static inline void unregister_irq_proc ( unsigned int irq , struct irq_desc * desc ) { }
2005-04-17 02:20:36 +04:00
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
2011-02-07 18:02:20 +03:00
extern int irq_select_affinity_usr ( unsigned int irq , struct cpumask * mask ) ;
2008-11-07 15:18:30 +03:00
2009-07-21 13:09:39 +04:00
extern void irq_set_thread_affinity ( struct irq_desc * desc ) ;
2009-04-28 04:59:53 +04:00
2009-08-13 14:17:48 +04:00
/* Inline functions for support of irq chips on slow busses */
2010-09-27 16:44:35 +04:00
static inline void chip_bus_lock ( struct irq_desc * desc )
2009-08-13 14:17:48 +04:00
{
2010-09-27 16:44:35 +04:00
if ( unlikely ( desc - > irq_data . chip - > irq_bus_lock ) )
desc - > irq_data . chip - > irq_bus_lock ( & desc - > irq_data ) ;
2009-08-13 14:17:48 +04:00
}
2010-09-27 16:44:35 +04:00
static inline void chip_bus_sync_unlock ( struct irq_desc * desc )
2009-08-13 14:17:48 +04:00
{
2010-09-27 16:44:35 +04:00
if ( unlikely ( desc - > irq_data . chip - > irq_bus_sync_unlock ) )
desc - > irq_data . chip - > irq_bus_sync_unlock ( & desc - > irq_data ) ;
2009-08-13 14:17:48 +04:00
}
2006-06-29 13:24:58 +04:00
/*
* 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 ) ;
2010-10-01 14:58:38 +04:00
printk ( " ->irq_data.chip(): %p, " , desc - > irq_data . chip ) ;
print_symbol ( " %s \n " , ( unsigned long ) desc - > irq_data . chip ) ;
2006-06-29 13:24:58 +04:00
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