Module Name:    src
Committed By:   matt
Date:           Sat Dec 31 04:30:53 UTC 2011

Modified Files:
        src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_gpio_pci.c rmixlreg.h

Log Message:
Deal with the movement of some GPIO registers on the XPL3xx.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/sys/arch/mips/rmi/rmixl_gpio_pci.c
cvs rdiff -u -r1.1.2.16 -r1.1.2.17 src/sys/arch/mips/rmi/rmixlreg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/mips/rmi/rmixl_gpio_pci.c
diff -u src/sys/arch/mips/rmi/rmixl_gpio_pci.c:1.1.2.2 src/sys/arch/mips/rmi/rmixl_gpio_pci.c:1.1.2.3
--- src/sys/arch/mips/rmi/rmixl_gpio_pci.c:1.1.2.2	Sat Dec 31 03:33:13 2011
+++ src/sys/arch/mips/rmi/rmixl_gpio_pci.c	Sat Dec 31 04:30:52 2011
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: rmixl_gpio_pci.c,v 1.1.2.2 2011/12/31 03:33:13 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: rmixl_gpio_pci.c,v 1.1.2.3 2011/12/31 04:30:52 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -151,9 +151,9 @@ static struct xlgpio_softc xlgpio_sc = {
 				[2] = RMIXLP_GPIO_INTEN(2, 0),
 				[3] = RMIXLP_GPIO_INTEN(3, 0),
 			},
-			.gg_r_intpol = RMIXLP_GPIO_INTPOL(0),
-			.gg_r_inttype = RMIXLP_GPIO_INTTYPE(0),
-			.gg_r_intstat = RMIXLP_GPIO_INTSTAT(0),
+			.gg_r_intpol = RMIXLP_GPIO_8XX_INTPOL(0),
+			.gg_r_inttype = RMIXLP_GPIO_8XX_INTTYPE(0),
+			.gg_r_intstat = RMIXLP_GPIO_8XX_INTSTAT(0),
 		},
 		[1] = {
 			.gg_pins = xlgpio_sc.sc_pins + PINGROUP,
@@ -166,9 +166,9 @@ static struct xlgpio_softc xlgpio_sc = {
 				[2] = RMIXLP_GPIO_INTEN(2, 1),
 				[3] = RMIXLP_GPIO_INTEN(3, 1),
 			},
-			.gg_r_intpol = RMIXLP_GPIO_INTPOL(1),
-			.gg_r_inttype = RMIXLP_GPIO_INTTYPE(1),
-			.gg_r_intstat = RMIXLP_GPIO_INTSTAT(1),
+			.gg_r_intpol = RMIXLP_GPIO_8XX_INTPOL(1),
+			.gg_r_inttype = RMIXLP_GPIO_8XX_INTTYPE(1),
+			.gg_r_intstat = RMIXLP_GPIO_8XX_INTSTAT(1),
 		},
 	},
 	.sc_gpio_chipset = {
@@ -266,10 +266,18 @@ xlgpio_pci_attach(device_t parent, devic
 		KASSERT(gg->gg_inttype == 0);
 
 		/*
+		 * These are at different offsets on the 3xx than the 8xx/4xx.
+		 */
+		if (rmixl_xlp_variant >= RMIXLP_3XX) {
+			gg->gg_r_intpol = RMIXLP_GPIO_3XX_INTPOL(group);
+			gg->gg_r_inttype = RMIXLP_GPIO_3XX_INTTYPE(group);
+			gg->gg_r_intstat = RMIXLP_GPIO_3XX_INTSTAT(group);
+		}
+
+		/*
 		 * Disable all interrupts for group.
 		 * Get shadow copy of registers.
 		 */
-
 		gg->gg_padoe = xlgpio_read_4(sc, gg->gg_r_padoe);
 		gg->gg_paddrv = xlgpio_read_4(sc, gg->gg_r_paddrv);
 		xlgpio_write_4(sc, gg->gg_r_intpol, gg->gg_intpol);
@@ -283,6 +291,7 @@ xlgpio_pci_attach(device_t parent, devic
 
 	/*
 	 * GPIO has 4 interrupts which map 1:1 on IPL_VM to IPL_HIGH
+	 * (12 on 3xx but we only use 4).
 	 */
 	const pcireg_t irtinfo = xlgpio_read_4(sc, PCI_RMIXLP_IRTINFO);
 
@@ -291,8 +300,9 @@ xlgpio_pci_attach(device_t parent, devic
 
 	KASSERT(irtcount >= IPL_HIGH - IPL_VM + 1);
 
-	for (size_t irt = 0; irt < irtcount; irt++) {
-		if (rmixl_intr_establish(irtstart + irt, IPL_VM + irt,
+	for (size_t ipl = IPL_VM; ipl <= IPL_HIGH ; ipl++) {
+		const size_t irt = ipl - IPL_VM;
+		if (rmixl_intr_establish(irtstart + irt, ipl,
 		    RMIXL_TRIG_LEVEL, RMIXL_POLR_HIGH,
 		    xlgpio_intrs[irt], sc, true) == NULL)
 			panic("%s: failed to establish interrupt %zu",
@@ -469,7 +479,7 @@ gpio_intr_disestablish(void *v)
 
 	*inten_p &= ~mask;
 	xlgpio_write_4(sc, gg->gg_r_inten[gip->gip_ipl - IPL_VM], *inten_p);
-	xlgpio_write_4(sc, RMIXLP_GPIO_INTSTAT(group), mask); /* ACK it */
+	xlgpio_write_4(sc, gg->gg_r_intstat, mask);	/* ACK it */
 
 	gip->gip_ipl = IPL_NONE;
 	gip->gip_ist = IST_NONE;

Index: src/sys/arch/mips/rmi/rmixlreg.h
diff -u src/sys/arch/mips/rmi/rmixlreg.h:1.1.2.16 src/sys/arch/mips/rmi/rmixlreg.h:1.1.2.17
--- src/sys/arch/mips/rmi/rmixlreg.h:1.1.2.16	Fri Dec 30 06:48:56 2011
+++ src/sys/arch/mips/rmi/rmixlreg.h	Sat Dec 31 04:30:52 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: rmixlreg.h,v 1.1.2.16 2011/12/30 06:48:56 matt Exp $	*/
+/*	$NetBSD: rmixlreg.h,v 1.1.2.17 2011/12/31 04:30:52 matt Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -912,23 +912,12 @@
 #define RMIXLP_GPIO_INTEN(n,g) _RMIXL_OFFSET(0x46+2*(n)+(g)) // Interrupt 0 Enable Register 0
 #define RMIXLP_GPIO_INTEN0(n) _RMIXL_OFFSET(0x46+2*(n)) // Interrupt 0 Enable Register 0
 #define RMIXLP_GPIO_INTEN1(n) _RMIXL_OFFSET(0x47+2*(n)) // Interrupt 0 Enable Register 0
-#define RMIXLP_GPIO_INTEN00 _RMIXL_OFFSET(0x46) // Interrupt 0 Enable Register 0
-#define RMIXLP_GPIO_INTEN01 _RMIXL_OFFSET(0x47) // Interrupt 0 Enable Register 1
-#define RMIXLP_GPIO_INTEN10 _RMIXL_OFFSET(0x48) // Interrupt 1 Enable Register 0
-#define RMIXLP_GPIO_INTEN11 _RMIXL_OFFSET(0x49) // Interrupt 1 Enable Register 1
-#define RMIXLP_GPIO_INTEN20 _RMIXL_OFFSET(0x4A) // Interrupt 2 Enable Register 0
-#define RMIXLP_GPIO_INTEN21 _RMIXL_OFFSET(0x4B) // Interrupt 2 Enable Register 1
-#define RMIXLP_GPIO_INTEN30 _RMIXL_OFFSET(0x4C) // Interrupt 3 Enable Register 0
-#define RMIXLP_GPIO_INTEN31 _RMIXL_OFFSET(0x4D) // Interrupt 3 Enable Register 1
-#define RMIXLP_GPIO_INTPOL(g) _RMIXL_OFFSET((0x4E)+(g)) // Interrupt Polarity Register 0
-#define RMIXLP_GPIO_INTPOL0 _RMIXL_OFFSET(0x4E) // Interrupt Polarity Register 0
-#define RMIXLP_GPIO_INTPOL1 _RMIXL_OFFSET(0x4F) // Interrupt Polarity Register 1
-#define RMIXLP_GPIO_INTTYPE(g) _RMIXL_OFFSET(0x50+(g)) // Interrupt Type Register 0
-#define RMIXLP_GPIO_INTTYPE0 _RMIXL_OFFSET(0x50) // Interrupt Type Register 0
-#define RMIXLP_GPIO_INTTYPE1 _RMIXL_OFFSET(0x51) // Interrupt Type Register 1
-#define RMIXLP_GPIO_INTSTAT(g) _RMIXL_OFFSET(0x52+(g)) // Interrupt Status Register 0
-#define RMIXLP_GPIO_INTSTAT0 _RMIXL_OFFSET(0x52) // Interrupt Status Register 0
-#define RMIXLP_GPIO_INTSTAT1 _RMIXL_OFFSET(0x53) // Interrupt Status Register 1
+#define RMIXLP_GPIO_8XX_INTPOL(g) _RMIXL_OFFSET((0x4E)+(g)) // Interrupt Polarity Register 0
+#define RMIXLP_GPIO_8XX_INTTYPE(g) _RMIXL_OFFSET(0x50+(g)) // Interrupt Type Register 0
+#define RMIXLP_GPIO_8XX_INTSTAT(g) _RMIXL_OFFSET(0x52+(g)) // Interrupt Status Register 0
+#define RMIXLP_GPIO_3XX_INTPOL(g) _RMIXL_OFFSET((0x5E)+(g)) // Interrupt Polarity Register 0
+#define RMIXLP_GPIO_3XX_INTTYPE(g) _RMIXL_OFFSET(0x60+(g)) // Interrupt Type Register 0
+#define RMIXLP_GPIO_3XX_INTSTAT(g) _RMIXL_OFFSET(0x62+(g)) // Interrupt Status Register 0
 
 #define	RMIXLP_GPIO_8XX_MAXPINS		41	/* 41 GPIO pins */
 #define	RMIXLP_GPIO_4XX_MAXPINS		41	/* 41 GPIO pins */

Reply via email to