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 */