18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 38c2ecf20Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 48c2ecf20Sopenharmony_ci * for more details. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 1992 Linus Torvalds 78c2ecf20Sopenharmony_ci * Copyright (C) 1994 - 2000 Ralf Baechle 88c2ecf20Sopenharmony_ci * Copyright (C) 2006 Thomas Bogendoerfer 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci#include <linux/delay.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 138c2ecf20Sopenharmony_ci#include <linux/irq.h> 148c2ecf20Sopenharmony_ci#include <linux/kernel.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include <asm/i8259.h> 178c2ecf20Sopenharmony_ci#include <asm/io.h> 188c2ecf20Sopenharmony_ci#include <asm/sni.h> 198c2ecf20Sopenharmony_ci#include <asm/irq.h> 208c2ecf20Sopenharmony_ci#include <asm/irq_cpu.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_civoid (*sni_hwint)(void); 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciasmlinkage void plat_irq_dispatch(void) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci sni_hwint(); 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci/* ISA irq handler */ 308c2ecf20Sopenharmony_ciirqreturn_t sni_isa_irq_handler(int dummy, void *p) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci int irq; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci irq = i8259_irq(); 358c2ecf20Sopenharmony_ci if (unlikely(irq < 0)) 368c2ecf20Sopenharmony_ci return IRQ_NONE; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci generic_handle_irq(irq); 398c2ecf20Sopenharmony_ci return IRQ_HANDLED; 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/* 438c2ecf20Sopenharmony_ci * On systems with i8259-style interrupt controllers we assume for 448c2ecf20Sopenharmony_ci * driver compatibility reasons interrupts 0 - 15 to be the i8295 458c2ecf20Sopenharmony_ci * interrupts even if the hardware uses a different interrupt numbering. 468c2ecf20Sopenharmony_ci */ 478c2ecf20Sopenharmony_civoid __init arch_init_irq(void) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci init_i8259_irqs(); /* Integrated i8259 */ 508c2ecf20Sopenharmony_ci switch (sni_brd_type) { 518c2ecf20Sopenharmony_ci case SNI_BRD_10: 528c2ecf20Sopenharmony_ci case SNI_BRD_10NEW: 538c2ecf20Sopenharmony_ci case SNI_BRD_TOWER_OASIC: 548c2ecf20Sopenharmony_ci case SNI_BRD_MINITOWER: 558c2ecf20Sopenharmony_ci sni_a20r_irq_init(); 568c2ecf20Sopenharmony_ci break; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci case SNI_BRD_PCI_TOWER: 598c2ecf20Sopenharmony_ci sni_pcit_irq_init(); 608c2ecf20Sopenharmony_ci break; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci case SNI_BRD_PCI_TOWER_CPLUS: 638c2ecf20Sopenharmony_ci sni_pcit_cplus_irq_init(); 648c2ecf20Sopenharmony_ci break; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci case SNI_BRD_RM200: 678c2ecf20Sopenharmony_ci sni_rm200_irq_init(); 688c2ecf20Sopenharmony_ci break; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci case SNI_BRD_PCI_MTOWER: 718c2ecf20Sopenharmony_ci case SNI_BRD_PCI_DESKTOP: 728c2ecf20Sopenharmony_ci case SNI_BRD_PCI_MTOWER_CPLUS: 738c2ecf20Sopenharmony_ci sni_pcimt_irq_init(); 748c2ecf20Sopenharmony_ci break; 758c2ecf20Sopenharmony_ci } 768c2ecf20Sopenharmony_ci} 77