/*1* Toshiba RBTX4927 specific interrupt handlers2*3* Author: MontaVista Software, Inc.4* [email protected]5*6* Copyright 2001-2002 MontaVista Software Inc.7*8* This program is free software; you can redistribute it and/or modify it9* under the terms of the GNU General Public License as published by the10* Free Software Foundation; either version 2 of the License, or (at your11* option) any later version.12*13* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED14* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF15* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.16* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,17* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,18* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS19* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND20* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR21* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE22* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.23*24* You should have received a copy of the GNU General Public License along25* with this program; if not, write to the Free Software Foundation, Inc.,26* 675 Mass Ave, Cambridge, MA 02139, USA.27*/28/*29* I8259A_IRQ_BASE+0030* I8259A_IRQ_BASE+01 PS2/Keyboard31* I8259A_IRQ_BASE+02 Cascade RBTX4927-ISA (irqs 8-15)32* I8259A_IRQ_BASE+0333* I8259A_IRQ_BASE+0434* I8259A_IRQ_BASE+0535* I8259A_IRQ_BASE+0636* I8259A_IRQ_BASE+0737* I8259A_IRQ_BASE+0838* I8259A_IRQ_BASE+0939* I8259A_IRQ_BASE+1040* I8259A_IRQ_BASE+1141* I8259A_IRQ_BASE+12 PS2/Mouse (not supported at this time)42* I8259A_IRQ_BASE+1343* I8259A_IRQ_BASE+14 IDE44* I8259A_IRQ_BASE+1545*46* MIPS_CPU_IRQ_BASE+00 Software 047* MIPS_CPU_IRQ_BASE+01 Software 148* MIPS_CPU_IRQ_BASE+02 Cascade TX4927-CP049* MIPS_CPU_IRQ_BASE+03 Multiplexed -- do not use50* MIPS_CPU_IRQ_BASE+04 Multiplexed -- do not use51* MIPS_CPU_IRQ_BASE+05 Multiplexed -- do not use52* MIPS_CPU_IRQ_BASE+06 Multiplexed -- do not use53* MIPS_CPU_IRQ_BASE+07 CPU TIMER54*55* TXX9_IRQ_BASE+0056* TXX9_IRQ_BASE+0157* TXX9_IRQ_BASE+0258* TXX9_IRQ_BASE+03 Cascade RBTX4927-IOC59* TXX9_IRQ_BASE+0460* TXX9_IRQ_BASE+05 RBTX4927 RTL-8019AS ethernet61* TXX9_IRQ_BASE+0662* TXX9_IRQ_BASE+0763* TXX9_IRQ_BASE+08 TX4927 SerialIO Channel 064* TXX9_IRQ_BASE+09 TX4927 SerialIO Channel 165* TXX9_IRQ_BASE+1066* TXX9_IRQ_BASE+1167* TXX9_IRQ_BASE+1268* TXX9_IRQ_BASE+1369* TXX9_IRQ_BASE+1470* TXX9_IRQ_BASE+1571* TXX9_IRQ_BASE+16 TX4927 PCI PCI-C72* TXX9_IRQ_BASE+1773* TXX9_IRQ_BASE+1874* TXX9_IRQ_BASE+1975* TXX9_IRQ_BASE+2076* TXX9_IRQ_BASE+2177* TXX9_IRQ_BASE+22 TX4927 PCI PCI-ERR78* TXX9_IRQ_BASE+23 TX4927 PCI PCI-PMA (not used)79* TXX9_IRQ_BASE+2480* TXX9_IRQ_BASE+2581* TXX9_IRQ_BASE+2682* TXX9_IRQ_BASE+2783* TXX9_IRQ_BASE+2884* TXX9_IRQ_BASE+2985* TXX9_IRQ_BASE+3086* TXX9_IRQ_BASE+3187*88* RBTX4927_IRQ_IOC+00 FPCIB0 PCI-D (SouthBridge)89* RBTX4927_IRQ_IOC+01 FPCIB0 PCI-C (SouthBridge)90* RBTX4927_IRQ_IOC+02 FPCIB0 PCI-B (SouthBridge/IDE/pin=1,INTR)91* RBTX4927_IRQ_IOC+03 FPCIB0 PCI-A (SouthBridge/USB/pin=4)92* RBTX4927_IRQ_IOC+0493* RBTX4927_IRQ_IOC+0594* RBTX4927_IRQ_IOC+0695* RBTX4927_IRQ_IOC+0796*97* NOTES:98* SouthBridge/INTR is mapped to SouthBridge/A=PCI-B/#5899* SouthBridge/ISA/pin=0 no pci irq used by this device100* SouthBridge/IDE/pin=1 no pci irq used by this device, using INTR101* via ISA IRQ14102* SouthBridge/USB/pin=4 using pci irq SouthBridge/D=PCI-A=#59103* SouthBridge/PMC/pin=0 no pci irq used by this device104* SuperIO/PS2/Keyboard, using INTR via ISA IRQ1105* SuperIO/PS2/Mouse, using INTR via ISA IRQ12 (mouse not currently supported)106* JP7 is not bus master -- do NOT use -- only 4 pci bus master's107* allowed -- SouthBridge, JP4, JP5, JP6108*/109110#include <linux/init.h>111#include <linux/types.h>112#include <linux/interrupt.h>113#include <linux/irq.h>114#include <asm/io.h>115#include <asm/mipsregs.h>116#include <asm/txx9/generic.h>117#include <asm/txx9/rbtx4927.h>118119static int toshiba_rbtx4927_irq_nested(int sw_irq)120{121u8 level3;122123level3 = readb(rbtx4927_imstat_addr) & 0x1f;124if (unlikely(!level3))125return -1;126return RBTX4927_IRQ_IOC + __fls8(level3);127}128129static void toshiba_rbtx4927_irq_ioc_enable(struct irq_data *d)130{131unsigned char v;132133v = readb(rbtx4927_imask_addr);134v |= (1 << (d->irq - RBTX4927_IRQ_IOC));135writeb(v, rbtx4927_imask_addr);136}137138static void toshiba_rbtx4927_irq_ioc_disable(struct irq_data *d)139{140unsigned char v;141142v = readb(rbtx4927_imask_addr);143v &= ~(1 << (d->irq - RBTX4927_IRQ_IOC));144writeb(v, rbtx4927_imask_addr);145mmiowb();146}147148#define TOSHIBA_RBTX4927_IOC_NAME "RBTX4927-IOC"149static struct irq_chip toshiba_rbtx4927_irq_ioc_type = {150.name = TOSHIBA_RBTX4927_IOC_NAME,151.irq_mask = toshiba_rbtx4927_irq_ioc_disable,152.irq_unmask = toshiba_rbtx4927_irq_ioc_enable,153};154155static void __init toshiba_rbtx4927_irq_ioc_init(void)156{157int i;158159/* mask all IOC interrupts */160writeb(0, rbtx4927_imask_addr);161/* clear SoftInt interrupts */162writeb(0, rbtx4927_softint_addr);163164for (i = RBTX4927_IRQ_IOC;165i < RBTX4927_IRQ_IOC + RBTX4927_NR_IRQ_IOC; i++)166irq_set_chip_and_handler(i, &toshiba_rbtx4927_irq_ioc_type,167handle_level_irq);168irq_set_chained_handler(RBTX4927_IRQ_IOCINT, handle_simple_irq);169}170171static int rbtx4927_irq_dispatch(int pending)172{173int irq;174175if (pending & STATUSF_IP7) /* cpu timer */176irq = MIPS_CPU_IRQ_BASE + 7;177else if (pending & STATUSF_IP2) { /* tx4927 pic */178irq = txx9_irq();179if (irq == RBTX4927_IRQ_IOCINT)180irq = toshiba_rbtx4927_irq_nested(irq);181} else if (pending & STATUSF_IP0) /* user line 0 */182irq = MIPS_CPU_IRQ_BASE + 0;183else if (pending & STATUSF_IP1) /* user line 1 */184irq = MIPS_CPU_IRQ_BASE + 1;185else186irq = -1;187return irq;188}189190void __init rbtx4927_irq_setup(void)191{192txx9_irq_dispatch = rbtx4927_irq_dispatch;193tx4927_irq_init();194toshiba_rbtx4927_irq_ioc_init();195/* Onboard 10M Ether: High Active */196irq_set_irq_type(RBTX4927_RTL_8019_IRQ, IRQF_TRIGGER_HIGH);197}198199200