2007-10-23 23:14:42 +04:00
/*
2008-03-27 21:51:41 +03:00
* arch / arm / mach - orion5x / irq . c
2007-10-23 23:14:42 +04:00
*
* Core IRQ functions for Marvell Orion System On Chip
*
* Maintainer : Tzachi Perelstein < tzachi @ marvell . com >
*
* This file is licensed under the terms of the GNU General Public
2008-03-27 21:51:41 +03:00
* License version 2. This program is licensed " as is " without any
2007-10-23 23:14:42 +04:00
* warranty of any kind , whether express or implied .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/irq.h>
2008-09-06 15:10:45 +04:00
# include <linux/io.h>
2007-10-23 23:14:42 +04:00
# include <asm/gpio.h>
2008-08-05 19:14:15 +04:00
# include <mach/orion5x.h>
2008-08-09 15:44:58 +04:00
# include <plat/irq.h>
2007-10-23 23:14:42 +04:00
# include "common.h"
2008-10-20 03:51:03 +04:00
static void gpio_irq_handler ( unsigned int irq , struct irq_desc * desc )
2007-10-23 23:14:42 +04:00
{
2008-03-27 21:51:41 +03:00
BUG_ON ( irq < IRQ_ORION5X_GPIO_0_7 | | irq > IRQ_ORION5X_GPIO_24_31 ) ;
2007-11-15 11:57:48 +03:00
2008-10-20 03:51:03 +04:00
orion_gpio_irq_handler ( ( irq - IRQ_ORION5X_GPIO_0_7 ) < < 3 ) ;
2007-10-23 23:14:42 +04:00
}
2008-10-20 03:51:03 +04:00
void __init orion5x_init_irq ( void )
2007-10-23 23:14:42 +04:00
{
int i ;
2008-10-20 03:51:03 +04:00
orion_irq_init ( 0 , ( void __iomem * ) MAIN_IRQ_MASK ) ;
2007-10-23 23:14:42 +04:00
/*
* Mask and clear GPIO IRQ interrupts
*/
2008-10-20 03:51:03 +04:00
writel ( 0x0 , GPIO_LEVEL_MASK ( 0 ) ) ;
writel ( 0x0 , GPIO_EDGE_MASK ( 0 ) ) ;
writel ( 0x0 , GPIO_EDGE_CAUSE ( 0 ) ) ;
2007-10-23 23:14:42 +04:00
/*
2007-11-15 11:57:48 +03:00
* Register chained level handlers for GPIO IRQs by default .
* User can use set_type ( ) if he wants to use edge types handlers .
2007-10-23 23:14:42 +04:00
*/
2008-03-27 21:51:41 +03:00
for ( i = IRQ_ORION5X_GPIO_START ; i < NR_IRQS ; i + + ) {
2008-10-20 03:51:03 +04:00
set_irq_chip ( i , & orion_gpio_irq_level_chip ) ;
2007-10-23 23:14:42 +04:00
set_irq_handler ( i , handle_level_irq ) ;
2008-10-20 03:51:03 +04:00
irq_desc [ i ] . status | = IRQ_LEVEL ;
2007-10-23 23:14:42 +04:00
set_irq_flags ( i , IRQF_VALID ) ;
}
2008-10-20 03:51:03 +04:00
set_irq_chained_handler ( IRQ_ORION5X_GPIO_0_7 , gpio_irq_handler ) ;
set_irq_chained_handler ( IRQ_ORION5X_GPIO_8_15 , gpio_irq_handler ) ;
set_irq_chained_handler ( IRQ_ORION5X_GPIO_16_23 , gpio_irq_handler ) ;
set_irq_chained_handler ( IRQ_ORION5X_GPIO_24_31 , gpio_irq_handler ) ;
2007-10-23 23:14:42 +04:00
}