2005-04-16 15:20:36 -07:00
/*
* linux / arch / m32r / kernel / irq . c
*
* Copyright ( c ) 2003 , 2004 Hitoshi Yamamoto
* Copyright ( c ) 2004 Hirokazu Takata < takata at linux - m32r . org >
*/
/*
* linux / arch / i386 / kernel / irq . c
*
* Copyright ( C ) 1992 , 1998 Linus Torvalds , Ingo Molnar
*
* This file contains the lowest level m32r - specific interrupt
* entry and irq statistics code . All the remaining irq logic is
* done by the generic kernel / irq / code and in the
* m32r - specific irq controller code .
*/
# include <linux/kernel_stat.h>
# include <linux/interrupt.h>
# include <linux/seq_file.h>
# include <linux/module.h>
# include <asm/uaccess.h>
/*
* Generic , controller - independent functions :
*/
int show_interrupts ( struct seq_file * p , void * v )
{
int i = * ( loff_t * ) v , j ;
struct irqaction * action ;
unsigned long flags ;
if ( i = = 0 ) {
seq_printf ( p , " " ) ;
2006-03-23 03:01:05 -08:00
for_each_online_cpu ( j )
seq_printf ( p , " CPU%d " , j ) ;
2005-04-16 15:20:36 -07:00
seq_putc ( p , ' \n ' ) ;
}
if ( i < NR_IRQS ) {
2009-11-17 16:46:45 +01:00
raw_spin_lock_irqsave ( & irq_desc [ i ] . lock , flags ) ;
2005-04-16 15:20:36 -07:00
action = irq_desc [ i ] . action ;
if ( ! action )
goto skip ;
seq_printf ( p , " %3d: " , i ) ;
# ifndef CONFIG_SMP
seq_printf ( p , " %10u " , kstat_irqs ( i ) ) ;
# else
2006-03-23 03:01:05 -08:00
for_each_online_cpu ( j )
2009-01-11 00:29:15 -08:00
seq_printf ( p , " %10u " , kstat_irqs_cpu ( i , j ) ) ;
2005-04-16 15:20:36 -07:00
# endif
2010-09-23 18:40:07 +02:00
seq_printf ( p , " %14s " , irq_desc [ i ] . chip - > name ) ;
2005-04-16 15:20:36 -07:00
seq_printf ( p , " %s " , action - > name ) ;
for ( action = action - > next ; action ; action = action - > next )
seq_printf ( p , " , %s " , action - > name ) ;
seq_putc ( p , ' \n ' ) ;
skip :
2009-11-17 16:46:45 +01:00
raw_spin_unlock_irqrestore ( & irq_desc [ i ] . lock , flags ) ;
2005-04-16 15:20:36 -07:00
}
return 0 ;
}
/*
2007-10-20 01:14:39 +02:00
* do_IRQ handles all normal device IRQs ( the special
2005-04-16 15:20:36 -07:00
* SMP cross - CPU interrupts have their own specific
* handlers ) .
*/
asmlinkage unsigned int do_IRQ ( int irq , struct pt_regs * regs )
{
2006-10-07 16:29:18 +01:00
struct pt_regs * old_regs ;
old_regs = set_irq_regs ( regs ) ;
2005-04-16 15:20:36 -07:00
irq_enter ( ) ;
# ifdef CONFIG_DEBUG_STACKOVERFLOW
/* FIXME M32R */
# endif
2006-10-07 16:29:18 +01:00
__do_IRQ ( irq ) ;
2005-04-16 15:20:36 -07:00
irq_exit ( ) ;
2006-10-07 16:29:18 +01:00
set_irq_regs ( old_regs ) ;
2005-04-16 15:20:36 -07:00
return 1 ;
}