📄 irq.c
字号:
/* * linux/arch/mips/tx4938/toshiba_rbtx4938/irq.c * * Toshiba RBTX4938 specific interrupt handlers * Copyright (C) 2000-2001 Toshiba Corporation * * 2003-2005 (c) MontaVista Software, Inc. This file is licensed under the * terms of the GNU General Public License version 2. This program is * licensed "as is" without any warranty of any kind, whether express * or implied. * * Support for TX4938 in 2.6 - Manish Lachwani (mlachwani@mvista.com) *//*IRQ Device16 TX4938-CP0/00 Software 017 TX4938-CP0/01 Software 118 TX4938-CP0/02 Cascade TX4938-CP019 TX4938-CP0/03 Multiplexed -- do not use20 TX4938-CP0/04 Multiplexed -- do not use21 TX4938-CP0/05 Multiplexed -- do not use22 TX4938-CP0/06 Multiplexed -- do not use23 TX4938-CP0/07 CPU TIMER24 TX4938-PIC/0025 TX4938-PIC/0126 TX4938-PIC/02 Cascade RBTX4938-IOC27 TX4938-PIC/03 RBTX4938 RTL-8019AS Ethernet28 TX4938-PIC/0429 TX4938-PIC/05 TX4938 ETH130 TX4938-PIC/06 TX4938 ETH031 TX4938-PIC/0732 TX4938-PIC/08 TX4938 SIO 033 TX4938-PIC/09 TX4938 SIO 134 TX4938-PIC/10 TX4938 DMA035 TX4938-PIC/11 TX4938 DMA136 TX4938-PIC/12 TX4938 DMA237 TX4938-PIC/13 TX4938 DMA338 TX4938-PIC/1439 TX4938-PIC/1540 TX4938-PIC/16 TX4938 PCIC41 TX4938-PIC/17 TX4938 TMR042 TX4938-PIC/18 TX4938 TMR143 TX4938-PIC/19 TX4938 TMR244 TX4938-PIC/2045 TX4938-PIC/2146 TX4938-PIC/22 TX4938 PCIERR47 TX4938-PIC/2348 TX4938-PIC/2449 TX4938-PIC/2550 TX4938-PIC/2651 TX4938-PIC/2752 TX4938-PIC/2853 TX4938-PIC/2954 TX4938-PIC/3055 TX4938-PIC/31 TX4938 SPI56 RBTX4938-IOC/00 PCI-D57 RBTX4938-IOC/01 PCI-C58 RBTX4938-IOC/02 PCI-B59 RBTX4938-IOC/03 PCI-A60 RBTX4938-IOC/04 RTC61 RBTX4938-IOC/05 ATA62 RBTX4938-IOC/06 MODEM63 RBTX4938-IOC/07 SWINT*/#include <linux/init.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/mm.h>#include <linux/swap.h>#include <linux/ioport.h>#include <linux/sched.h>#include <linux/interrupt.h>#include <linux/pci.h>#include <linux/timex.h>#include <asm/bootinfo.h>#include <asm/page.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/processor.h>#include <asm/reboot.h>#include <asm/time.h>#include <asm/wbflush.h>#include <linux/bootmem.h>#include <asm/tx4938/rbtx4938.h>static void toshiba_rbtx4938_irq_ioc_enable(unsigned int irq);static void toshiba_rbtx4938_irq_ioc_disable(unsigned int irq);#define TOSHIBA_RBTX4938_IOC_NAME "RBTX4938-IOC"static struct irq_chip toshiba_rbtx4938_irq_ioc_type = { .name = TOSHIBA_RBTX4938_IOC_NAME, .ack = toshiba_rbtx4938_irq_ioc_disable, .mask = toshiba_rbtx4938_irq_ioc_disable, .mask_ack = toshiba_rbtx4938_irq_ioc_disable, .unmask = toshiba_rbtx4938_irq_ioc_enable,};#define TOSHIBA_RBTX4938_IOC_INTR_ENAB 0xb7f02000#define TOSHIBA_RBTX4938_IOC_INTR_STAT 0xb7f0200ainttoshiba_rbtx4938_irq_nested(int sw_irq){ u8 level3; level3 = reg_rd08(TOSHIBA_RBTX4938_IOC_INTR_STAT) & 0xff; if (level3) { /* must use fls so onboard ATA has priority */ sw_irq = TOSHIBA_RBTX4938_IRQ_IOC_BEG + fls(level3) - 1; } wbflush(); return sw_irq;}static struct irqaction toshiba_rbtx4938_irq_ioc_action = { .handler = no_action, .flags = 0, .mask = CPU_MASK_NONE, .name = TOSHIBA_RBTX4938_IOC_NAME,};/**********************************************************************************//* Functions for ioc *//**********************************************************************************/static void __inittoshiba_rbtx4938_irq_ioc_init(void){ int i; for (i = TOSHIBA_RBTX4938_IRQ_IOC_BEG; i <= TOSHIBA_RBTX4938_IRQ_IOC_END; i++) set_irq_chip_and_handler(i, &toshiba_rbtx4938_irq_ioc_type, handle_level_irq); setup_irq(RBTX4938_IRQ_IOCINT, &toshiba_rbtx4938_irq_ioc_action);}static voidtoshiba_rbtx4938_irq_ioc_enable(unsigned int irq){ volatile unsigned char v; v = TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB); v |= (1 << (irq - TOSHIBA_RBTX4938_IRQ_IOC_BEG)); TX4938_WR08(TOSHIBA_RBTX4938_IOC_INTR_ENAB, v); mmiowb(); TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);}static voidtoshiba_rbtx4938_irq_ioc_disable(unsigned int irq){ volatile unsigned char v; v = TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB); v &= ~(1 << (irq - TOSHIBA_RBTX4938_IRQ_IOC_BEG)); TX4938_WR08(TOSHIBA_RBTX4938_IOC_INTR_ENAB, v); mmiowb(); TX4938_RD08(TOSHIBA_RBTX4938_IOC_INTR_ENAB);}void __init arch_init_irq(void){ extern void tx4938_irq_init(void); /* Now, interrupt control disabled, */ /* all IRC interrupts are masked, */ /* all IRC interrupt mode are Low Active. */ /* mask all IOC interrupts */ *rbtx4938_imask_ptr = 0; /* clear SoftInt interrupts */ *rbtx4938_softint_ptr = 0; tx4938_irq_init(); toshiba_rbtx4938_irq_ioc_init(); /* Onboard 10M Ether: High Active */ set_irq_type(RBTX4938_IRQ_ETHER, IRQF_TRIGGER_HIGH); wbflush();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -