1 /* 2 * Copyright (C) 2001 Dave Engebretsen IBM Corporation 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 */ 18 19 #include <asm/prom.h> 20 21 #include "pseries.h" 22 23 void request_event_sources_irqs(struct device_node *np, 24 irq_handler_t handler, 25 const char *name) 26 { 27 int i, index, count = 0; 28 struct of_irq oirq; 29 const u32 *opicprop; 30 unsigned int opicplen; 31 unsigned int virqs[16]; 32 33 /* Check for obsolete "open-pic-interrupt" property. If present, then 34 * map those interrupts using the default interrupt host and default 35 * trigger 36 */ 37 opicprop = of_get_property(np, "open-pic-interrupt", &opicplen); 38 if (opicprop) { 39 opicplen /= sizeof(u32); 40 for (i = 0; i < opicplen; i++) { 41 if (count > 15) 42 break; 43 virqs[count] = irq_create_mapping(NULL, *(opicprop++)); 44 if (virqs[count] == NO_IRQ) 45 printk(KERN_ERR "Unable to allocate interrupt " 46 "number for %s\n", np->full_name); 47 else 48 count++; 49 50 } 51 } 52 /* Else use normal interrupt tree parsing */ 53 else { 54 /* First try to do a proper OF tree parsing */ 55 for (index = 0; of_irq_map_one(np, index, &oirq) == 0; 56 index++) { 57 if (count > 15) 58 break; 59 virqs[count] = irq_create_of_mapping(oirq.controller, 60 oirq.specifier, 61 oirq.size); 62 if (virqs[count] == NO_IRQ) 63 printk(KERN_ERR "Unable to allocate interrupt " 64 "number for %s\n", np->full_name); 65 else 66 count++; 67 } 68 } 69 70 /* Now request them */ 71 for (i = 0; i < count; i++) { 72 if (request_irq(virqs[i], handler, 0, name, NULL)) { 73 printk(KERN_ERR "Unable to request interrupt %d for " 74 "%s\n", virqs[i], np->full_name); 75 return; 76 } 77 } 78 } 79 80