2010-05-18 22:51:00 +00:00
/*
* Copyright ( C ) 2001 Dave Engebretsen IBM Corporation
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include <asm/prom.h>
# include "pseries.h"
void request_event_sources_irqs ( struct device_node * np ,
irq_handler_t handler ,
const char * name )
{
int i , index , count = 0 ;
2013-09-15 16:39:11 +01:00
struct of_phandle_args oirq ;
2010-05-18 22:51:00 +00:00
const u32 * opicprop ;
unsigned int opicplen ;
unsigned int virqs [ 16 ] ;
/* Check for obsolete "open-pic-interrupt" property. If present, then
* map those interrupts using the default interrupt host and default
* trigger
*/
opicprop = of_get_property ( np , " open-pic-interrupt " , & opicplen ) ;
if ( opicprop ) {
opicplen / = sizeof ( u32 ) ;
for ( i = 0 ; i < opicplen ; i + + ) {
if ( count > 15 )
break ;
virqs [ count ] = irq_create_mapping ( NULL , * ( opicprop + + ) ) ;
2010-05-26 20:56:04 +00:00
if ( virqs [ count ] = = NO_IRQ ) {
pr_err ( " event-sources: Unable to allocate "
" interrupt number for %s \n " ,
np - > full_name ) ;
WARN_ON ( 1 ) ;
}
2010-05-18 22:51:00 +00:00
else
count + + ;
}
}
/* Else use normal interrupt tree parsing */
else {
/* First try to do a proper OF tree parsing */
2013-09-19 11:22:36 -05:00
for ( index = 0 ; of_irq_parse_one ( np , index , & oirq ) = = 0 ;
2010-05-18 22:51:00 +00:00
index + + ) {
if ( count > 15 )
break ;
2013-09-15 16:55:53 +01:00
virqs [ count ] = irq_create_of_mapping ( & oirq ) ;
2010-05-26 20:56:04 +00:00
if ( virqs [ count ] = = NO_IRQ ) {
pr_err ( " event-sources: Unable to allocate "
" interrupt number for %s \n " ,
np - > full_name ) ;
WARN_ON ( 1 ) ;
}
2010-05-18 22:51:00 +00:00
else
count + + ;
}
}
/* Now request them */
for ( i = 0 ; i < count ; i + + ) {
if ( request_irq ( virqs [ i ] , handler , 0 , name , NULL ) ) {
2010-05-26 20:56:04 +00:00
pr_err ( " event-sources: Unable to request interrupt "
" %d for %s \n " , virqs [ i ] , np - > full_name ) ;
WARN_ON ( 1 ) ;
2010-05-18 22:51:00 +00:00
return ;
}
}
}