? ccio-rm.diff
? remove-irq-regions-smp.diff
? remove-irq-regions.diff
Index: arch/parisc/kernel/irq.c
===================================================================
RCS file: /var/cvs/linux-2.6/arch/parisc/kernel/irq.c,v
retrieving revision 1.33
diff -u -p -r1.33 irq.c
--- arch/parisc/kernel/irq.c	9 Jan 2005 01:14:03 -0000	1.33
+++ arch/parisc/kernel/irq.c	9 Jan 2005 22:40:59 -0000
@@ -54,7 +54,7 @@ extern irqreturn_t ipi_interrupt(int, vo
 #define DBG_IRQ(irq, x)	do { } while (0)
 #endif /* DEBUG_IRQ */
 
-#define EIEM_MASK(irq)       (1UL<<(MAX_CPU_IRQ-IRQ_OFFSET(irq)))
+#define EIEM_MASK(irq)       (1UL<<(CPU_IRQ_MAX - irq))
 
 /* Bits in EIEM correlate with cpu_irq_action[].
 ** Numbered *Big Endian*! (ie bit 0 is MSB)
@@ -205,7 +205,7 @@ int txn_alloc_irq(void)
 	int irq;
 
 	/* never return irq 0 cause that's the interval timer */
-	for (irq = TIMER_IRQ + 1; irq <= TIMER_IRQ + MAX_CPU_IRQ; irq++) {
+	for (irq = CPU_IRQ_BASE + 1; irq <= CPU_IRQ_MAX; irq++) {
 		if (cpu_claim_irq(irq, NULL, NULL) < 0)
 			continue;
 		return irq;
@@ -259,12 +259,11 @@ unsigned int txn_alloc_data(int virt_irq
 	** if this one won't work. Another reason to index virtual
 	** irq's into a table which can manage CPU/IRQ bit separately.
 	*/
-	if (IRQ_OFFSET(virt_irq) > (1 << (bits_wide -1)))
-	{
+	if ((virt_irq - CPU_IRQ_BASE) > (1 << (bits_wide - 1))) {
 		panic("Sorry -- didn't allocate valid IRQ for this device\n");
 	}
 
-	return (IRQ_OFFSET(virt_irq));
+	return virt_irq - CPU_IRQ_BASE;
 }
 
 /* ONLY called from entry.S:intr_extint() */
@@ -291,7 +290,7 @@ void do_cpu_irq_mask(struct pt_regs *reg
 	 *    processing can occur.
 	 */
 	for (;;) {
-		unsigned long bit = (1UL<<MAX_CPU_IRQ);
+		unsigned long bit = (1UL << (BITS_PER_LONG - 1));
 		unsigned int irq;
 		eirr_val = mfctl(23) & cpu_eiem;
 		if (!eirr_val || !i--)
@@ -319,63 +318,6 @@ void do_cpu_irq_mask(struct pt_regs *reg
 }
 
 
-static inline int find_free_region(void)
-{
-	int irqreg;
-
-	for (irqreg = 1; irqreg < NR_IRQ_REGS; irqreg++) {
-		if (irq_desc[IRQ_FROM_REGION(irqreg)].handler == &no_irq_type)
-			return irqreg;
-	}
-
-	return 0;
-}
-
-
-/**
- * alloc_irq_region - allocate/init a new IRQ region
- * @count: number of IRQs in this region.
- * @type: function table with enable/disable/etc.. entries.
- * @dev: private data to associate with the new IRQ region.
- *
- * Every IRQ must become a MMIO write to the CPU's EIRR in
- * order to get CPU service. The IRQ region represents the
- * number of unique events the region handler can (or must)
- * identify. For PARISC CPU, that's the width of the EIR Register.
- * IRQ regions virtualize IRQs (eg EISA or PCI host bus controllers)
- * for line based devices.
- */
-int alloc_irq_region(int count, struct hw_interrupt_type *type, void *dev)
-{
-	int i, irqbase;
-	int index = find_free_region();
-	if (index == 0) {
-		printk(KERN_ERR "Maximum number of irq regions exceeded. "
-				"Increase NR_IRQ_REGS!\n");
-		return -1;
-	}
-
-	if (!type->disable || !type->enable)
-		return -1;
-
-	if (count > IRQ_PER_REGION)
-		return -1;
-
-	if (count < IRQ_PER_REGION) {
-	    DBG_IRQ(0, ("alloc_irq_region() using minimum of %d irq lines for %s (%d)\n",
-			IRQ_PER_REGION, name, count));
-	    count = IRQ_PER_REGION;
-	}
-
-	irqbase = IRQ_FROM_REGION(index);
-	for (i = 0; i < count; i++) {
-		irq_desc[irqbase + i].handler = type;
-		irq_desc[irqbase + i].handler_data = dev;
-	}
-
-	return irqbase;
-}
-
 static struct irqaction timer_action = {
 	.handler = timer_interrupt,
 	.name = "timer",
@@ -388,12 +330,11 @@ static struct irqaction ipi_action = {
 };
 #endif
 
-static void claim_cpu_region(void)
+static void claim_cpu_irqs(void)
 {
 	int i;
-	int irqbase = IRQ_FROM_REGION(CPU_IRQ_REGION);
-	for (i = 0; i < IRQ_PER_REGION; i++) {
-		irq_desc[irqbase + i].handler = &cpu_interrupt_type;
+	for (i = CPU_IRQ_BASE; i <= CPU_IRQ_MAX; i++) {
+		irq_desc[i].handler = &cpu_interrupt_type;
 	}
 
 	irq_desc[TIMER_IRQ].action = &timer_action;
@@ -408,7 +349,7 @@ void __init init_IRQ(void)
 {
 	local_irq_disable();	/* PARANOID - should already be disabled */
 	mtctl(~0UL, 23);	/* EIRR : clear all pending external intr */
-	claim_cpu_region();
+	claim_cpu_irqs();
 #ifdef CONFIG_SMP
 	if (!cpu_eiem)
 		cpu_eiem = EIEM_MASK(IPI_IRQ) | EIEM_MASK(TIMER_IRQ);
Index: arch/parisc/kernel/smp.c
===================================================================
RCS file: /var/cvs/linux-2.6/arch/parisc/kernel/smp.c,v
retrieving revision 1.15
diff -u -p -r1.15 smp.c
--- arch/parisc/kernel/smp.c	21 Oct 2004 18:58:24 -0000	1.15
+++ arch/parisc/kernel/smp.c	9 Jan 2005 22:40:59 -0000
@@ -277,7 +277,7 @@ ipi_send(int cpu, enum ipi_message_type 
 
 	spin_lock_irqsave(&(p->lock),flags);
 	p->pending_ipi |= 1 << op;
-	__raw_writel(IRQ_OFFSET(IPI_IRQ), cpu_data[cpu].hpa);
+	gsc_writel(IPI_IRQ - CPU_IRQ_BASE, cpu_data[cpu].hpa);
 	spin_unlock_irqrestore(&(p->lock),flags);
 }
 
@@ -534,7 +534,7 @@ int __init smp_boot_one_cpu(int cpuid)
 	** EIR{0}). MEM_RENDEZ is valid only when it is nonzero and the 
 	** contents of memory are valid."
 	*/
-	__raw_writel(IRQ_OFFSET(TIMER_IRQ), cpu_data[cpuid].hpa);
+	gsc_writel(TIMER_IRQ - CPU_IRQ_BASE, cpu_data[cpuid].hpa);
 	mb();
 
 	/* 
Index: drivers/parisc/asp.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/asp.c,v
retrieving revision 1.10
diff -u -p -r1.10 asp.c
--- drivers/parisc/asp.c	4 Jan 2005 16:51:29 -0000	1.10
+++ drivers/parisc/asp.c	9 Jan 2005 22:41:00 -0000
@@ -30,9 +30,9 @@
 
 #define VIPER_INT_WORD  0xFFFBF088      /* addr of viper interrupt word */
 
-static int asp_choose_irq(struct parisc_device *dev)
+static void asp_choose_irq(struct parisc_device *dev, void *ctrl)
 {
-	int irq = -1;
+	int irq;
 
 	switch (dev->id.sversion) {
 	case 0x71:	irq =  9; break; /* SCSI */
@@ -47,8 +47,10 @@ static int asp_choose_irq(struct parisc_
 	case 0x7c:	irq =  3; break; /* FW SCSI */
 	case 0x7d:	irq =  4; break; /* FDDI */
 	case 0x7f:	irq = 13; break; /* Audio (Outfield) */
+	default:	return;		 /* Unknown */
 	}
-	return irq;
+
+	gsc_asic_assign_irq(ctrl, irq, &dev->irq);
 }
 
 /* There are two register ranges we're interested in.  Interrupt /
@@ -101,9 +103,9 @@ asp_init_chip(struct parisc_device *dev)
 	if (ret)
 		goto out;
 
-	fixup_child_irqs(dev, asp->irqbase, asp_choose_irq);
+	gsc_fixup_irqs(dev, asp, asp_choose_irq);
 	/* Mongoose is a sibling of Asp, not a child... */
-	fixup_child_irqs(parisc_parent(dev), asp->irqbase, asp_choose_irq);
+	gsc_fixup_irqs(parisc_parent(dev), asp, asp_choose_irq);
 
 	/* initialize the chassis LEDs */ 
 #ifdef CONFIG_CHASSIS_LCD_LED	
Index: drivers/parisc/dino.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/dino.c,v
retrieving revision 1.28
diff -u -p -r1.28 dino.c
--- drivers/parisc/dino.c	6 Jan 2005 17:44:02 -0000	1.28
+++ drivers/parisc/dino.c	9 Jan 2005 22:41:00 -0000
@@ -147,9 +147,8 @@ struct dino_device
 	unsigned long		txn_addr; /* EIR addr to generate interrupt */ 
 	u32			txn_data; /* EIR data assign to each dino */ 
 	int			irq;      /* Virtual IRQ dino uses */
-	int			irqbase;  /* Global interrupt base */
-
-	u32 			imr; /* IRQ's which are enabled */ 
+	u32 			imr;	  /* IRQ's which are enabled */ 
+	int			global_irq[12]; /* map IMR bit to global irq */
 #ifdef DINO_DEBUG
 	unsigned int		dino_irr0; /* save most recent IRQ line stat */
 #endif
@@ -296,7 +295,7 @@ struct pci_port_ops dino_port_ops = {
 static void dino_disable_irq(unsigned int irq)
 {
 	struct dino_device *dino_dev = irq_desc[irq].handler_data;
-	int local_irq = IRQ_OFFSET(irq);
+	int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq);
 
 	DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, irq_dev, irq);
 
@@ -308,7 +307,7 @@ static void dino_disable_irq(unsigned in
 static void dino_enable_irq(unsigned int irq)
 {
 	struct dino_device *dino_dev = irq_desc[irq].handler_data;
-	int local_irq = IRQ_OFFSET(irq);
+	int local_irq = gsc_find_local_irq(irq, dino_dev->global_irq, irq);
 	u32 tmp;
 
 	DBG(KERN_WARNING "%s(0x%p, %d)\n", __FUNCTION__, irq_dev, irq);
@@ -349,7 +348,7 @@ static unsigned int dino_startup_irq(uns
 }
 
 static struct hw_interrupt_type dino_interrupt_type = {
-	.typename	= "Dino",
+	.typename	= "GSC-PCI",
 	.startup	= dino_startup_irq,
 	.shutdown	= dino_disable_irq,
 	.enable		= dino_enable_irq, 
@@ -384,7 +383,7 @@ dino_isr(int irq, void *intr_dev, struct
 ilr_again:
 	do {
 		int local_irq = __ffs(mask);
-		int irq = dino_dev->irqbase + local_irq;
+		int irq = dino_dev->global_irq[local_irq];
 		DBG(KERN_DEBUG "%s(%d, %p) mask 0x%x\n",
 			__FUNCTION__, irq, intr_dev, mask);
 		__do_IRQ(irq, regs);
@@ -409,17 +408,29 @@ ilr_again:
 	return IRQ_HANDLED;
 }
 
-static int dino_choose_irq(struct parisc_device *dev)
+static void dino_assign_irq(struct dino_device *dino, int local_irq, int *irqp)
+{
+	int irq = gsc_assign_irq(&dino_interrupt_type, dino);
+	if (irq == NO_IRQ)
+		return;
+
+	*irqp = irq;
+	dino->global_irq[local_irq] = irq;
+}
+
+static void dino_choose_irq(struct parisc_device *dev, void *ctrl)
 {
-	int irq = -1;
+	int irq;
+	struct dino_device *dino = ctrl;
 
 	switch (dev->id.sversion) {
 		case 0x00084:	irq =  8; break; /* PS/2 */
 		case 0x0008c:	irq = 10; break; /* RS232 */
 		case 0x00096:	irq =  8; break; /* PS/2 */
+		default:	return;		 /* Unknown */
 	}
 
-	return irq;
+	dino_assign_irq(dino, irq, &dev->irq);
 }
 
 static void __init
@@ -642,11 +653,13 @@ dino_fixup_bus(struct pci_bus *bus)
 			
 			dino_cfg_read(dev->bus, dev->devfn, 
 				      PCI_INTERRUPT_PIN, 1, &irq_pin);
-			dev->irq = (irq_pin + PCI_SLOT(dev->devfn) - 1) % 4 ;
+			irq_pin = (irq_pin + PCI_SLOT(dev->devfn) - 1) % 4 ;
+			printk(KERN_WARNING "Device %s has undefined IRQ, "
+					"setting to %d\n", dev->slot_name,
+					irq_pin);
 			dino_cfg_write(dev->bus, dev->devfn, 
-				       PCI_INTERRUPT_LINE, 1, dev->irq);
-			dev->irq += dino_dev->irqbase;
-			printk(KERN_WARNING "Device %s has undefined IRQ, setting to %d\n", dev->slot_name, irq_pin);
+				       PCI_INTERRUPT_LINE, 1, irq_pin);
+			dino_assign_irq(dino_dev, irq_pin, &dev->irq);
 #else
 			dev->irq = 65535;
 			printk(KERN_WARNING "Device %s has unassigned IRQ\n", dev->slot_name);	
@@ -654,7 +667,7 @@ dino_fixup_bus(struct pci_bus *bus)
 		} else {
 
 			/* Adjust INT_LINE for that busses region */
-			dev->irq += dino_dev->irqbase;
+			dino_assign_irq(dino_dev, dev->irq, &dev->irq);
 		}
 	}
 }
@@ -829,23 +842,11 @@ static int __init dino_common_init(struc
 		return 1;
 	}
 
-	/*
-	** Tell generic interrupt support we have 11 bits which need
-	** be checked in the interrupt handler.
-	*/
-	dino_dev->irqbase = alloc_irq_region(DINO_IRQS, &dino_interrupt_type,
-						dino_dev);
-
-	if (dino_dev->irqbase == -1) {
-		printk(KERN_WARNING "%s: alloc_irq_region() failed\n", name);
-		return 1;
-	}
-
 	/* Support the serial port which is sometimes attached on built-in
 	 * Dino / Cujo chips.
 	 */
 
-	fixup_child_irqs(dev, dino_dev->irqbase, dino_choose_irq);
+	gsc_fixup_irqs(dev, dino_dev, dino_choose_irq);
 
 	/*
 	** This enables DINO to generate interrupts when it sees
Index: drivers/parisc/gsc.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/gsc.c,v
retrieving revision 1.15
diff -u -p -r1.15 gsc.c
--- drivers/parisc/gsc.c	6 Jan 2005 17:44:02 -0000	1.15
+++ drivers/parisc/gsc.c	9 Jan 2005 22:41:00 -0000
@@ -56,7 +56,7 @@ int gsc_claim_irq(struct gsc_irq *i, int
 {
 	int c = irq;
 
-	irq += IRQ_FROM_REGION(CPU_IRQ_REGION); /* virtualize the IRQ first */
+	irq += CPU_IRQ_BASE; /* virtualize the IRQ first */
 
 	irq = txn_claim_irq(irq);
 	if (irq < 0) {
@@ -79,7 +79,6 @@ irqreturn_t gsc_asic_intr(int gsc_asic_i
 {
 	unsigned long irr;
 	struct gsc_asic *gsc_asic = dev;
-	unsigned int irqbase = gsc_asic->irqbase;
 
 	irr = gsc_readl(gsc_asic->hpa + OFFSET_IRR);
 	if (irr == 0)
@@ -89,7 +88,7 @@ irqreturn_t gsc_asic_intr(int gsc_asic_i
 
 	do {
 		int local_irq = __ffs(irr);
-		unsigned int irq = irqbase + local_irq;
+		unsigned int irq = gsc_asic->global_irq[local_irq];
 		__do_IRQ(irq, regs);
 		irr &= ~(1 << local_irq);
 	} while (irr);
@@ -97,10 +96,22 @@ irqreturn_t gsc_asic_intr(int gsc_asic_i
 	return IRQ_HANDLED;
 }
 
+int gsc_find_local_irq(unsigned int irq, int *global_irqs, int limit)
+{
+	int local_irq;
+
+	for (local_irq = 0; local_irq < limit; local_irq++) {
+		if (global_irqs[local_irq] == irq)
+			return local_irq;
+	}
+
+	return NO_IRQ;
+}
+
 static void gsc_asic_disable_irq(unsigned int irq)
 {
 	struct gsc_asic *irq_dev = irq_desc[irq].handler_data;
-	int local_irq = IRQ_OFFSET(irq);
+	int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32);
 	u32 imr;
 
 	DEBPRINTK(KERN_DEBUG "%s(%d) %s: IMR 0x%x\n", __FUNCTION__, irq,
@@ -115,7 +126,7 @@ static void gsc_asic_disable_irq(unsigne
 static void gsc_asic_enable_irq(unsigned int irq)
 {
 	struct gsc_asic *irq_dev = irq_desc[irq].handler_data;
-	int local_irq = IRQ_OFFSET(irq);
+	int local_irq = gsc_find_local_irq(irq, irq_dev->global_irq, 32);
 	u32 imr;
 
 	DEBPRINTK(KERN_DEBUG "%s(%d) %s: IMR 0x%x\n", __FUNCTION__, irq,
@@ -137,7 +148,7 @@ static unsigned int gsc_asic_startup_irq
 	return 0;
 }
 
-struct hw_interrupt_type gsc_asic_interrupt_type = {
+static struct hw_interrupt_type gsc_asic_interrupt_type = {
 	.typename =	"GSC-ASIC",
 	.startup =	gsc_asic_startup_irq,
 	.shutdown =	gsc_asic_disable_irq,
@@ -147,25 +158,41 @@ struct hw_interrupt_type gsc_asic_interr
 	.end =		no_end_irq,
 };
 
+int gsc_assign_irq(struct hw_interrupt_type *type, void *data)
+{
+	static int irq = GSC_IRQ_BASE;
+
+	if (irq > GSC_IRQ_MAX)
+		return NO_IRQ;
 
-void fixup_child_irqs(struct parisc_device *parent, int base,
-			int (*choose_irq)(struct parisc_device *))
+	irq_desc[irq].handler = type;
+	irq_desc[irq].handler_data = data;
+	return irq++;
+}
+
+void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp)
+{
+	int irq = gsc_assign_irq(&gsc_asic_interrupt_type, asic);
+	if (irq == NO_IRQ)
+		return;
+
+	*irqp = irq;
+	asic->global_irq[local_irq] = irq;
+}
+
+void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
+			void (*choose_irq)(struct parisc_device *, void *))
 {
 	struct device *dev;
 
 	list_for_each_entry(dev, &parent->dev.children, node) {
 		struct parisc_device *padev = to_parisc_device(dev);
-		int local_irq;
 
 		/* work-around for 715/64 and others which have parent 
-		   at path [5] and childs at path [5/0/x] */
+		   at path [5] and children at path [5/0/x] */
 		if (padev->id.hw_type == HPHW_FAULTY)
-			return fixup_child_irqs(padev, base, choose_irq);
-
-		local_irq = choose_irq(padev);
-		if (local_irq > 0) {
-			padev->irq = base + local_irq;
-		}
+			return gsc_fixup_irqs(padev, ctrl, choose_irq);
+		choose_irq(padev, ctrl);
 	}
 }
 
@@ -175,9 +202,6 @@ int gsc_common_setup(struct parisc_devic
 
 	gsc_asic->gsc = parent;
 
-	/* the IRQs we simulate */
-	gsc_asic->irqbase = alloc_irq_region(32, &gsc_asic_interrupt_type,
-						 gsc_asic);
 	/* allocate resource region */
 	res = request_mem_region(gsc_asic->hpa, 0x100000, gsc_asic->name);
 	if (res) {
Index: drivers/parisc/gsc.h
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/gsc.h,v
retrieving revision 1.5
diff -u -p -r1.5 gsc.h
--- drivers/parisc/gsc.h	4 Jan 2005 16:51:29 -0000	1.5
+++ drivers/parisc/gsc.h	9 Jan 2005 22:41:00 -0000
@@ -34,12 +34,16 @@ struct gsc_asic {
 	int parent_irq;
 	int eim;
 	int irqbase;
+	int global_irq[32];
 };
 
 int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic);
 int gsc_alloc_irq(struct gsc_irq *dev);			/* dev needs an irq */
 int gsc_claim_irq(struct gsc_irq *dev, int irq);	/* dev needs this irq */
-void fixup_child_irqs(struct parisc_device *parent, int base,
-		int (*choose)(struct parisc_device *parent));
+int gsc_assign_irq(struct hw_interrupt_type *type, void *data);
+int gsc_find_local_irq(unsigned int irq, int *global_irq, int limit);
+void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
+		void (*choose)(struct parisc_device *child, void *ctrl));
+void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp);
 
 irqreturn_t gsc_asic_intr(int irq, void *dev, struct pt_regs *regs);
Index: drivers/parisc/lasi.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/lasi.c,v
retrieving revision 1.10
diff -u -p -r1.10 lasi.c
--- drivers/parisc/lasi.c	4 Jan 2005 16:51:29 -0000	1.10
+++ drivers/parisc/lasi.c	9 Jan 2005 22:41:00 -0000
@@ -35,13 +35,10 @@
 #define LASI_IO_CONF	0x7FFFE	/* LASI primary configuration register */
 #define LASI_IO_CONF2	0x7FFFF	/* LASI secondary configuration register */
 
-static int lasi_choose_irq(struct parisc_device *dev)
+static void lasi_choose_irq(struct parisc_device *dev, void *ctrl)
 {
 	int irq;
 
-	/*
-	** "irq" bits below are numbered relative to most significant bit.
-	*/
 	switch (dev->id.sversion) {
 		case 0x74:	irq =  7; break; /* Centronics */
 		case 0x7B:	irq = 13; break; /* Audio */
@@ -52,12 +49,12 @@ static int lasi_choose_irq(struct parisc
 		case 0x87:	irq = 18; break; /* ISDN */
 		case 0x8A:	irq =  8; break; /* LAN */
 		case 0x8C:	irq =  5; break; /* RS232 */
-		case 0x8D:	irq = (dev->hw_path == 13) ? 16 : 17;
-						break; /* Telephone */
-		default: 	irq = -1; break; /* unknown */
+		case 0x8D:	irq = (dev->hw_path == 13) ? 16 : 17; break;
+						 /* Telephone */
+		default: 	return;		 /* unknown */
 	}
 
-	return irq;
+	gsc_asic_assign_irq(ctrl, irq, &dev->irq);
 }
 
 static void __init
@@ -221,7 +218,7 @@ lasi_init_chip(struct parisc_device *dev
 		return ret;
 	}    
 
-	fixup_child_irqs(dev, lasi->irqbase, lasi_choose_irq);
+	gsc_fixup_irqs(dev, lasi, lasi_choose_irq);
 
 	/* initialize the power off function */
 	/* FIXME: Record the LASI HPA for the power off function.  This should
Index: drivers/parisc/wax.c
===================================================================
RCS file: /var/cvs/linux-2.6/drivers/parisc/wax.c,v
retrieving revision 1.10
diff -u -p -r1.10 wax.c
--- drivers/parisc/wax.c	4 Jan 2005 16:51:29 -0000	1.10
+++ drivers/parisc/wax.c	9 Jan 2005 22:41:00 -0000
@@ -28,17 +28,18 @@
 #define WAX_GSC_IRQ	7	/* Hardcoded Interrupt for GSC */
 #define WAX_GSC_NMI_IRQ	29
 
-static int wax_choose_irq(struct parisc_device *dev)
+static void wax_choose_irq(struct parisc_device *dev, void *ctrl)
 {
-	int irq = -1;
+	int irq;
 
 	switch (dev->id.sversion) {
 		case 0x73:	irq =  1; break; /* HIL */
 		case 0x8c:	irq =  6; break; /* RS232 */
 		case 0x90:	irq = 10; break; /* WAX EISA BA */
+		default:	return;		 /* Unknown */
 	}
 
-	return irq;
+	gsc_asic_assign_irq(ctrl, irq, &dev->irq);
 }
 
 static void __init
@@ -116,11 +117,11 @@ wax_init_chip(struct parisc_device *dev)
 		return ret;
 	}
 
-	fixup_child_irqs(dev, wax->irqbase, wax_choose_irq);
+	gsc_fixup_irqs(dev, wax, wax_choose_irq);
 	/* On 715-class machines, Wax EISA is a sibling of Wax, not a child. */
 	parent = parisc_parent(dev);
 	if (parent->id.hw_type != HPHW_IOA) {
-		fixup_child_irqs(parent, wax->irqbase, wax_choose_irq);
+		gsc_fixup_irqs(parent, wax, wax_choose_irq);
 	}
 
 	return ret;
Index: include/asm-parisc/irq.h
===================================================================
RCS file: /var/cvs/linux-2.6/include/asm-parisc/irq.h,v
retrieving revision 1.15
diff -u -p -r1.15 irq.h
--- include/asm-parisc/irq.h	8 Jan 2005 06:21:29 -0000	1.15
+++ include/asm-parisc/irq.h	9 Jan 2005 22:41:01 -0000
@@ -1,58 +1,37 @@
 /*
- *	linux/include/asm-parisc/irq.h
+ * include/asm-parisc/irq.h
  *
- *	(C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar,
- *		Copyright 1999 SuSE GmbH
- *
- *	IRQ/IPI changes taken from work by Thomas Radke
- *	<tomsoft@informatik.tu-chemnitz.de>
+ * Copyright 2005 Matthew Wilcox <matthew@wil.cx>
  */
 
 #ifndef _ASM_PARISC_IRQ_H
 #define _ASM_PARISC_IRQ_H
 
 #include <linux/config.h>
-#include <asm/ptrace.h>
-
-#define NO_IRQ	(-1)
-
-#define CPU_IRQ_REGION		1
-#define TIMER_IRQ		(IRQ_FROM_REGION(CPU_IRQ_REGION) | 0)
-#define	IPI_IRQ			(IRQ_FROM_REGION(CPU_IRQ_REGION) | 1)
+#include <asm/types.h>
 
-/* This should be 31 for PA1.1 binaries and 63 for PA-2.0 wide mode */
-#define MAX_CPU_IRQ		(BITS_PER_LONG - 1)
+#define NO_IRQ		(-1)
 
-#if BITS_PER_LONG == 32
-#  define IRQ_REGION_SHIFT 	5
+#ifdef CONFIG_GSC
+#define GSC_IRQ_BASE	16
+#define GSC_IRQ_MAX	63
+#define CPU_IRQ_BASE	64
 #else
-#  define IRQ_REGION_SHIFT 	6
+#define CPU_IRQ_BASE	16
 #endif
 
-#define IRQ_PER_REGION		(1 << IRQ_REGION_SHIFT)
-#define NR_IRQ_REGS		16
-#define NR_IRQS			(NR_IRQ_REGS * IRQ_PER_REGION)
-
-#define IRQ_REGION(irq) 	((irq) >> IRQ_REGION_SHIFT)
-#define IRQ_OFFSET(irq)		((irq) & ((1<<IRQ_REGION_SHIFT)-1))
-#define	IRQ_FROM_REGION(reg)	((reg) << IRQ_REGION_SHIFT)
+#define TIMER_IRQ	(CPU_IRQ_BASE + 0)
+#define	IPI_IRQ		(CPU_IRQ_BASE + 1)
+#define CPU_IRQ_MAX	(CPU_IRQ_BASE + (BITS_PER_LONG - 1))
 
-#define EISA_IRQ_REGION		0 /* region 0 needs to be reserved for EISA */
-#define EISA_MAX_IRQS		16 /* max. (E)ISA irq line */
+#define NR_IRQS		(CPU_IRQ_MAX + 1)
 
 static __inline__ int irq_canonicalize(int irq)
 {
-#ifdef CONFIG_EISA
 	return (irq == 2) ? 9 : irq;
-#else
-	return irq;
-#endif
 }
 
 struct hw_interrupt_type;
-
-extern int alloc_irq_region(int count,
-		struct hw_interrupt_type *type, void *dev);
 
 /*
  * Some useful "we don't have to do anything here" handlers.  Should

