2009-05-22 14:16:39 +10:00
/*
* intc2 . c - - support for the 2 nd INTC controller of the 5249
*
* ( 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>
2011-02-06 23:39:14 +00:00
static void intc2_irq_gpio_mask ( struct irq_data * d )
2009-05-22 14:16:39 +10:00
{
u32 imr ;
2012-09-14 23:57:39 +10:00
imr = readl ( MCFSIM2_GPIOINTENABLE ) ;
2012-09-19 13:52:12 +10:00
imr & = ~ ( 0x1 < < ( d - > irq - MCF_IRQ_GPIO0 ) ) ;
2012-09-14 23:57:39 +10:00
writel ( imr , MCFSIM2_GPIOINTENABLE ) ;
2009-05-22 14:16:39 +10:00
}
2011-02-06 23:39:14 +00:00
static void intc2_irq_gpio_unmask ( struct irq_data * d )
2009-05-22 14:16:39 +10:00
{
u32 imr ;
2012-09-14 23:57:39 +10:00
imr = readl ( MCFSIM2_GPIOINTENABLE ) ;
2012-09-19 13:52:12 +10:00
imr | = ( 0x1 < < ( d - > irq - MCF_IRQ_GPIO0 ) ) ;
2012-09-14 23:57:39 +10:00
writel ( imr , MCFSIM2_GPIOINTENABLE ) ;
2009-05-22 14:16:39 +10:00
}
2011-02-06 23:39:14 +00:00
static void intc2_irq_gpio_ack ( struct irq_data * d )
2009-05-22 14:16:39 +10:00
{
2012-09-19 13:52:12 +10:00
writel ( 0x1 < < ( d - > irq - MCF_IRQ_GPIO0 ) , MCFSIM2_GPIOINTCLEAR ) ;
2009-05-22 14:16:39 +10:00
}
static struct irq_chip intc2_irq_gpio_chip = {
. name = " CF-INTC2 " ,
2011-02-06 23:39:14 +00:00
. irq_mask = intc2_irq_gpio_mask ,
. irq_unmask = intc2_irq_gpio_unmask ,
. irq_ack = intc2_irq_gpio_ack ,
2009-05-22 14:16:39 +10:00
} ;
static int __init mcf_intc2_init ( void )
{
int irq ;
/* GPIO interrupt sources */
2012-09-19 13:52:12 +10:00
for ( irq = MCF_IRQ_GPIO0 ; ( irq < = MCF_IRQ_GPIO7 ) ; irq + + ) {
2011-03-28 13:31:17 +02:00
irq_set_chip ( irq , & intc2_irq_gpio_chip ) ;
irq_set_handler ( irq , handle_edge_irq ) ;
2011-02-09 13:43:58 +10:00
}
2009-05-22 14:16:39 +10:00
return 0 ;
}
arch_initcall ( mcf_intc2_init ) ;