2009-04-27 09:09:29 +04:00
/*
* intc - simr . c
*
2010-08-19 21:04:58 +04:00
* Interrupt controller code for the ColdFire 5208 , 5207 & 532 x parts .
*
2009-04-27 09:09:29 +04:00
* ( C ) Copyright 2009 , Greg Ungerer < gerg @ snapgear . com >
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file COPYING in the main directory of this archive
* for more details .
*/
# include <linux/types.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/interrupt.h>
# include <linux/irq.h>
# include <linux/io.h>
# include <asm/coldfire.h>
# include <asm/mcfsim.h>
# include <asm/traps.h>
2011-02-07 02:39:14 +03:00
static void intc_irq_mask ( struct irq_data * d )
2009-04-27 09:09:29 +04:00
{
2011-02-07 02:39:14 +03:00
unsigned int irq = d - > irq ;
2009-04-29 06:07:13 +04:00
if ( irq > = MCFINT_VECBASE ) {
if ( irq < MCFINT_VECBASE + 64 )
__raw_writeb ( irq - MCFINT_VECBASE , MCFINTC0_SIMR ) ;
else if ( ( irq < MCFINT_VECBASE + 128 ) & & MCFINTC1_SIMR )
__raw_writeb ( irq - MCFINT_VECBASE - 64 , MCFINTC1_SIMR ) ;
}
2009-04-27 09:09:29 +04:00
}
2011-02-07 02:39:14 +03:00
static void intc_irq_unmask ( struct irq_data * d )
2009-04-27 09:09:29 +04:00
{
2011-02-07 02:39:14 +03:00
unsigned int irq = d - > irq ;
2009-04-29 06:07:13 +04:00
if ( irq > = MCFINT_VECBASE ) {
if ( irq < MCFINT_VECBASE + 64 )
__raw_writeb ( irq - MCFINT_VECBASE , MCFINTC0_CIMR ) ;
else if ( ( irq < MCFINT_VECBASE + 128 ) & & MCFINTC1_CIMR )
__raw_writeb ( irq - MCFINT_VECBASE - 64 , MCFINTC1_CIMR ) ;
}
2009-04-27 09:09:29 +04:00
}
2011-02-07 02:39:14 +03:00
static int intc_irq_set_type ( struct irq_data * d , unsigned int type )
2009-04-27 09:09:29 +04:00
{
2011-02-07 02:39:14 +03:00
unsigned int irq = d - > irq ;
2009-04-29 06:07:13 +04:00
if ( irq > = MCFINT_VECBASE ) {
if ( irq < MCFINT_VECBASE + 64 )
__raw_writeb ( 5 , MCFINTC0_ICR0 + irq - MCFINT_VECBASE ) ;
else if ( ( irq < MCFINT_VECBASE ) & & MCFINTC1_ICR0 )
__raw_writeb ( 5 , MCFINTC1_ICR0 + irq - MCFINT_VECBASE - 64 ) ;
}
2009-04-27 09:09:29 +04:00
return 0 ;
}
static struct irq_chip intc_irq_chip = {
. name = " CF-INTC " ,
2011-02-07 02:39:14 +03:00
. irq_mask = intc_irq_mask ,
. irq_unmask = intc_irq_unmask ,
. irq_set_type = intc_irq_set_type ,
2009-04-27 09:09:29 +04:00
} ;
void __init init_IRQ ( void )
{
int irq ;
init_vectors ( ) ;
2009-05-06 08:28:25 +04:00
/* Mask all interrupt sources */
__raw_writeb ( 0xff , MCFINTC0_SIMR ) ;
if ( MCFINTC1_SIMR )
__raw_writeb ( 0xff , MCFINTC1_SIMR ) ;
2009-04-27 09:09:29 +04:00
for ( irq = 0 ; ( irq < NR_IRQS ) ; irq + + ) {
2010-09-09 11:12:53 +04:00
set_irq_chip ( irq , & intc_irq_chip ) ;
set_irq_type ( irq , IRQ_TYPE_LEVEL_HIGH ) ;
set_irq_handler ( irq , handle_level_irq ) ;
2009-04-27 09:09:29 +04:00
}
}