···11+/*22+ * GT641xx IRQ routines.33+ *44+ * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License as published by88+ * the Free Software Foundation; either version 2 of the License, or99+ * (at your option) any later version.1010+ *1111+ * This program is distributed in the hope that it will be useful,1212+ * but WITHOUT ANY WARRANTY; without even the implied warranty of1313+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1414+ * GNU General Public License for more details.1515+ *1616+ * You should have received a copy of the GNU General Public License1717+ * along with this program; if not, write to the Free Software1818+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA1919+ */2020+#include <linux/hardirq.h>2121+#include <linux/init.h>2222+#include <linux/irq.h>2323+#include <linux/spinlock.h>2424+#include <linux/types.h>2525+2626+#include <asm/gt64120.h>2727+2828+#define GT641XX_IRQ_TO_BIT(irq) (1U << (irq - GT641XX_IRQ_BASE))2929+3030+static DEFINE_SPINLOCK(gt641xx_irq_lock);3131+3232+static void ack_gt641xx_irq(unsigned int irq)3333+{3434+ unsigned long flags;3535+ u32 cause;3636+3737+ spin_lock_irqsave(>641xx_irq_lock, flags);3838+ cause = GT_READ(GT_INTRCAUSE_OFS);3939+ cause &= ~GT641XX_IRQ_TO_BIT(irq);4040+ GT_WRITE(GT_INTRCAUSE_OFS, cause);4141+ spin_unlock_irqrestore(>641xx_irq_lock, flags);4242+}4343+4444+static void mask_gt641xx_irq(unsigned int irq)4545+{4646+ unsigned long flags;4747+ u32 mask;4848+4949+ spin_lock_irqsave(>641xx_irq_lock, flags);5050+ mask = GT_READ(GT_INTRMASK_OFS);5151+ mask &= ~GT641XX_IRQ_TO_BIT(irq);5252+ GT_WRITE(GT_INTRMASK_OFS, mask);5353+ spin_unlock_irqrestore(>641xx_irq_lock, flags);5454+}5555+5656+static void mask_ack_gt641xx_irq(unsigned int irq)5757+{5858+ unsigned long flags;5959+ u32 cause, mask;6060+6161+ spin_lock_irqsave(>641xx_irq_lock, flags);6262+ mask = GT_READ(GT_INTRMASK_OFS);6363+ mask &= ~GT641XX_IRQ_TO_BIT(irq);6464+ GT_WRITE(GT_INTRMASK_OFS, mask);6565+6666+ cause = GT_READ(GT_INTRCAUSE_OFS);6767+ cause &= ~GT641XX_IRQ_TO_BIT(irq);6868+ GT_WRITE(GT_INTRCAUSE_OFS, cause);6969+ spin_unlock_irqrestore(>641xx_irq_lock, flags);7070+}7171+7272+static void unmask_gt641xx_irq(unsigned int irq)7373+{7474+ unsigned long flags;7575+ u32 mask;7676+7777+ spin_lock_irqsave(>641xx_irq_lock, flags);7878+ mask = GT_READ(GT_INTRMASK_OFS);7979+ mask |= GT641XX_IRQ_TO_BIT(irq);8080+ GT_WRITE(GT_INTRMASK_OFS, mask);8181+ spin_unlock_irqrestore(>641xx_irq_lock, flags);8282+}8383+8484+static struct irq_chip gt641xx_irq_chip = {8585+ .name = "GT641xx",8686+ .ack = ack_gt641xx_irq,8787+ .mask = mask_gt641xx_irq,8888+ .mask_ack = mask_ack_gt641xx_irq,8989+ .unmask = unmask_gt641xx_irq,9090+};9191+9292+void gt641xx_irq_dispatch(void)9393+{9494+ u32 cause, mask;9595+ int i;9696+9797+ cause = GT_READ(GT_INTRCAUSE_OFS);9898+ mask = GT_READ(GT_INTRMASK_OFS);9999+ cause &= mask;100100+101101+ /*102102+ * bit0 : logical or of all the interrupt bits.103103+ * bit30: logical or of bits[29:26,20:1].104104+ * bit31: logical or of bits[25:1].105105+ */106106+ for (i = 1; i < 30; i++) {107107+ if (cause & (1U << i)) {108108+ do_IRQ(GT641XX_IRQ_BASE + i);109109+ return;110110+ }111111+ }112112+113113+ atomic_inc(&irq_err_count);114114+}115115+116116+void __init gt641xx_irq_init(void)117117+{118118+ int i;119119+120120+ GT_WRITE(GT_INTRMASK_OFS, 0);121121+ GT_WRITE(GT_INTRCAUSE_OFS, 0);122122+123123+ /*124124+ * bit0 : logical or of all the interrupt bits.125125+ * bit30: logical or of bits[29:26,20:1].126126+ * bit31: logical or of bits[25:1].127127+ */128128+ for (i = 1; i < 30; i++)129129+ set_irq_chip_and_handler(GT641XX_IRQ_BASE + i,130130+ >641xx_irq_chip, handle_level_irq);131131+}
···11+/*22+ * Galileo/Marvell GT641xx IRQ definitions.33+ *44+ * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License as published by88+ * the Free Software Foundation; either version 2 of the License, or99+ * (at your option) any later version.1010+ *1111+ * This program is distributed in the hope that it will be useful,1212+ * but WITHOUT ANY WARRANTY; without even the implied warranty of1313+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the1414+ * GNU General Public License for more details.1515+ *1616+ * You should have received a copy of the GNU General Public License1717+ * along with this program; if not, write to the Free Software1818+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA1919+ */2020+#ifndef _ASM_IRQ_GT641XX_H2121+#define _ASM_IRQ_GT641XX_H2222+2323+#ifndef GT641XX_IRQ_BASE2424+#define GT641XX_IRQ_BASE 82525+#endif2626+2727+#define GT641XX_MEMORY_OUT_OF_RANGE_IRQ (GT641XX_IRQ_BASE + 1)2828+#define GT641XX_DMA_OUT_OF_RANGE_IRQ (GT641XX_IRQ_BASE + 2)2929+#define GT641XX_CPU_ACCESS_OUT_OF_RANGE_IRQ (GT641XX_IRQ_BASE + 3)3030+#define GT641XX_DMA0_IRQ (GT641XX_IRQ_BASE + 4)3131+#define GT641XX_DMA1_IRQ (GT641XX_IRQ_BASE + 5)3232+#define GT641XX_DMA2_IRQ (GT641XX_IRQ_BASE + 6)3333+#define GT641XX_DMA3_IRQ (GT641XX_IRQ_BASE + 7)3434+#define GT641XX_TIMER0_IRQ (GT641XX_IRQ_BASE + 8)3535+#define GT641XX_TIMER1_IRQ (GT641XX_IRQ_BASE + 9)3636+#define GT641XX_TIMER2_IRQ (GT641XX_IRQ_BASE + 10)3737+#define GT641XX_TIMER3_IRQ (GT641XX_IRQ_BASE + 11)3838+#define GT641XX_PCI_0_MASTER_READ_ERROR_IRQ (GT641XX_IRQ_BASE + 12)3939+#define GT641XX_PCI_0_SLAVE_WRITE_ERROR_IRQ (GT641XX_IRQ_BASE + 13)4040+#define GT641XX_PCI_0_MASTER_WRITE_ERROR_IRQ (GT641XX_IRQ_BASE + 14)4141+#define GT641XX_PCI_0_SLAVE_READ_ERROR_IRQ (GT641XX_IRQ_BASE + 15)4242+#define GT641XX_PCI_0_ADDRESS_ERROR_IRQ (GT641XX_IRQ_BASE + 16)4343+#define GT641XX_MEMORY_ERROR_IRQ (GT641XX_IRQ_BASE + 17)4444+#define GT641XX_PCI_0_MASTER_ABORT_IRQ (GT641XX_IRQ_BASE + 18)4545+#define GT641XX_PCI_0_TARGET_ABORT_IRQ (GT641XX_IRQ_BASE + 19)4646+#define GT641XX_PCI_0_RETRY_TIMEOUT_IRQ (GT641XX_IRQ_BASE + 20)4747+#define GT641XX_CPU_INT0_IRQ (GT641XX_IRQ_BASE + 21)4848+#define GT641XX_CPU_INT1_IRQ (GT641XX_IRQ_BASE + 22)4949+#define GT641XX_CPU_INT2_IRQ (GT641XX_IRQ_BASE + 23)5050+#define GT641XX_CPU_INT3_IRQ (GT641XX_IRQ_BASE + 24)5151+#define GT641XX_CPU_INT4_IRQ (GT641XX_IRQ_BASE + 25)5252+#define GT641XX_PCI_INT0_IRQ (GT641XX_IRQ_BASE + 26)5353+#define GT641XX_PCI_INT1_IRQ (GT641XX_IRQ_BASE + 27)5454+#define GT641XX_PCI_INT2_IRQ (GT641XX_IRQ_BASE + 28)5555+#define GT641XX_PCI_INT3_IRQ (GT641XX_IRQ_BASE + 29)5656+5757+extern void gt641xx_irq_dispatch(void);5858+extern void gt641xx_irq_init(void);5959+6060+#endif /* _ASM_IRQ_GT641XX_H */
-26
include/asm-mips/mach-cobalt/cobalt.h
···1212#ifndef __ASM_COBALT_H1313#define __ASM_COBALT_H14141515-#include <irq.h>1616-1717-/*1818- * i8259 legacy interrupts used on Cobalt:1919- *2020- * 8 - RTC2121- * 9 - PCI2222- * 14 - IDE02323- * 15 - IDE12424- */2525-#define COBALT_QUBE_SLOT_IRQ 92626-2727-/*2828- * CPU IRQs are 16 ... 232929- */3030-#define COBALT_CPU_IRQ MIPS_CPU_IRQ_BASE3131-3232-#define COBALT_GALILEO_IRQ (COBALT_CPU_IRQ + 2)3333-#define COBALT_RAQ_SCSI_IRQ (COBALT_CPU_IRQ + 3)3434-#define COBALT_ETH0_IRQ (COBALT_CPU_IRQ + 3)3535-#define COBALT_QUBE1_ETH0_IRQ (COBALT_CPU_IRQ + 4)3636-#define COBALT_ETH1_IRQ (COBALT_CPU_IRQ + 4)3737-#define COBALT_SERIAL_IRQ (COBALT_CPU_IRQ + 5)3838-#define COBALT_SCSI_IRQ (COBALT_CPU_IRQ + 5)3939-#define COBALT_VIA_IRQ (COBALT_CPU_IRQ + 6) /* Chained to VIA ISA bridge */4040-4115/*4216 * PCI configuration space manifest constants. These are wired into4317 * the board layout according to the PCI spec to enable the software
+58
include/asm-mips/mach-cobalt/irq.h
···11+/*22+ * Cobalt IRQ definitions.33+ *44+ * This file is subject to the terms and conditions of the GNU General Public55+ * License. See the file "COPYING" in the main directory of this archive66+ * for more details.77+ *88+ * Copyright (C) 1997 Cobalt Microserver99+ * Copyright (C) 1997, 2003 Ralf Baechle1010+ * Copyright (C) 2001-2003 Liam Davies (ldavies@agile.tv)1111+ * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>1212+ */1313+#ifndef _ASM_COBALT_IRQ_H1414+#define _ASM_COBALT_IRQ_H1515+1616+/*1717+ * i8259 interrupts used on Cobalt:1818+ *1919+ * 8 - RTC2020+ * 9 - PCI slot2121+ * 14 - IDE02222+ * 15 - IDE1(no connector on board)2323+ */2424+#define I8259A_IRQ_BASE 02525+2626+#define PCISLOT_IRQ (I8259A_IRQ_BASE + 9)2727+2828+/*2929+ * CPU interrupts used on Cobalt:3030+ *3131+ * 0 - Software interrupt 0 (unused)3232+ * 1 - Software interrupt 0 (unused)3333+ * 2 - cascade GT641113434+ * 3 - ethernet or SCSI host controller3535+ * 4 - ethernet3636+ * 5 - 16550 UART3737+ * 6 - cascade i82593838+ * 7 - CP0 counter (unused)3939+ */4040+#define MIPS_CPU_IRQ_BASE 164141+4242+#define GT641XX_CASCADE_IRQ (MIPS_CPU_IRQ_BASE + 2)4343+#define RAQ2_SCSI_IRQ (MIPS_CPU_IRQ_BASE + 3)4444+#define ETH0_IRQ (MIPS_CPU_IRQ_BASE + 3)4545+#define QUBE1_ETH0_IRQ (MIPS_CPU_IRQ_BASE + 4)4646+#define ETH1_IRQ (MIPS_CPU_IRQ_BASE + 4)4747+#define SERIAL_IRQ (MIPS_CPU_IRQ_BASE + 5)4848+#define SCSI_IRQ (MIPS_CPU_IRQ_BASE + 5)4949+#define I8259_CASCADE_IRQ (MIPS_CPU_IRQ_BASE + 6)5050+5151+5252+#define GT641XX_IRQ_BASE 245353+5454+#include <asm/irq_gt641xx.h>5555+5656+#define NR_IRQS (GT641XX_PCI_INT3_IRQ + 1)5757+5858+#endif /* _ASM_COBALT_IRQ_H */