2005-04-17 02:20:36 +04:00
/*
2007-08-01 16:09:31 +04:00
* linux / arch / m32r / platforms / oaks32r / setup . c
2005-04-17 02:20:36 +04:00
*
* Setup routines for OAKS32R Board
*
2005-07-08 04:59:32 +04:00
* Copyright ( c ) 2002 - 2005 Hiroyuki Kondo , Hirokazu Takata ,
* Hitoshi Yamamoto , Mamoru Sakugawa
2005-04-17 02:20:36 +04:00
*/
# include <linux/irq.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <asm/m32r.h>
# include <asm/io.h>
# define irq2port(x) (M32R_ICU_CR1_PORTL + ((x - 1) * sizeof(unsigned long)))
icu_data_t icu_data [ NR_IRQS ] ;
static void disable_oaks32r_irq ( unsigned int irq )
{
unsigned long port , data ;
port = irq2port ( irq ) ;
data = icu_data [ irq ] . icucr | M32R_ICUCR_ILEVEL7 ;
outl ( data , port ) ;
}
static void enable_oaks32r_irq ( unsigned int irq )
{
unsigned long port , data ;
port = irq2port ( irq ) ;
data = icu_data [ irq ] . icucr | M32R_ICUCR_IEN | M32R_ICUCR_ILEVEL6 ;
outl ( data , port ) ;
}
2011-01-19 20:44:10 +03:00
static void mask_oaks32r ( struct irq_data * data )
2005-04-17 02:20:36 +04:00
{
2011-01-19 20:44:10 +03:00
disable_oaks32r_irq ( data - > irq ) ;
2005-04-17 02:20:36 +04:00
}
2011-01-19 20:44:10 +03:00
static void unmask_oaks32r ( struct irq_data * data )
2005-04-17 02:20:36 +04:00
{
2011-01-19 20:44:10 +03:00
enable_oaks32r_irq ( data - > irq ) ;
2005-04-17 02:20:36 +04:00
}
2011-01-19 20:44:10 +03:00
static void shutdown_oaks32r ( struct irq_data * data )
2005-04-17 02:20:36 +04:00
{
unsigned long port ;
2011-01-19 20:44:10 +03:00
port = irq2port ( data - > irq ) ;
2005-04-17 02:20:36 +04:00
outl ( M32R_ICUCR_ILEVEL7 , port ) ;
}
2009-06-17 02:33:26 +04:00
static struct irq_chip oaks32r_irq_type =
2005-04-17 02:20:36 +04:00
{
2011-01-19 20:44:10 +03:00
. name = " OAKS32R-IRQ " ,
. irq_shutdown = shutdown_oaks32r ,
. irq_mask = mask_oaks32r ,
. irq_unmask = unmask_oaks32r ,
2005-04-17 02:20:36 +04:00
} ;
void __init init_IRQ ( void )
{
static int once = 0 ;
if ( once )
return ;
else
once + + ;
# ifdef CONFIG_NE2000
/* INT3 : LAN controller (RTL8019AS) */
2011-03-24 19:32:45 +03:00
irq_set_chip_and_handler ( M32R_IRQ_INT3 , & oaks32r_irq_type ,
2011-01-19 20:44:10 +03:00
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
icu_data [ M32R_IRQ_INT3 ] . icucr = M32R_ICUCR_IEN | M32R_ICUCR_ISMOD10 ;
disable_oaks32r_irq ( M32R_IRQ_INT3 ) ;
# endif /* CONFIG_M32R_NE2000 */
/* MFT2 : system timer */
2011-03-24 19:32:45 +03:00
irq_set_chip_and_handler ( M32R_IRQ_MFT2 , & oaks32r_irq_type ,
2011-01-19 20:44:10 +03:00
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
icu_data [ M32R_IRQ_MFT2 ] . icucr = M32R_ICUCR_IEN ;
disable_oaks32r_irq ( M32R_IRQ_MFT2 ) ;
# ifdef CONFIG_SERIAL_M32R_SIO
/* SIO0_R : uart receive data */
2011-03-24 19:32:45 +03:00
irq_set_chip_and_handler ( M32R_IRQ_SIO0_R , & oaks32r_irq_type ,
2011-01-19 20:44:10 +03:00
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
icu_data [ M32R_IRQ_SIO0_R ] . icucr = 0 ;
disable_oaks32r_irq ( M32R_IRQ_SIO0_R ) ;
/* SIO0_S : uart send data */
2011-03-24 19:32:45 +03:00
irq_set_chip_and_handler ( M32R_IRQ_SIO0_S , & oaks32r_irq_type ,
2011-01-19 20:44:10 +03:00
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
icu_data [ M32R_IRQ_SIO0_S ] . icucr = 0 ;
disable_oaks32r_irq ( M32R_IRQ_SIO0_S ) ;
/* SIO1_R : uart receive data */
2011-03-24 19:32:45 +03:00
irq_set_chip_and_handler ( M32R_IRQ_SIO1_R , & oaks32r_irq_type ,
2011-01-19 20:44:10 +03:00
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
icu_data [ M32R_IRQ_SIO1_R ] . icucr = 0 ;
disable_oaks32r_irq ( M32R_IRQ_SIO1_R ) ;
/* SIO1_S : uart send data */
2011-03-24 19:32:45 +03:00
irq_set_chip_and_handler ( M32R_IRQ_SIO1_S , & oaks32r_irq_type ,
2011-01-19 20:44:10 +03:00
handle_level_irq ) ;
2005-04-17 02:20:36 +04:00
icu_data [ M32R_IRQ_SIO1_S ] . icucr = 0 ;
disable_oaks32r_irq ( M32R_IRQ_SIO1_S ) ;
# endif /* CONFIG_SERIAL_M32R_SIO */
}