Module Name: src
Committed By: dyoung
Date: Wed Apr 8 23:53:10 UTC 2009
Modified Files:
src/sys/arch/i386/pci: elan520.c
Log Message:
Move elanpar0 and elanpex0 attachment out of the #if NGPIO > 0 block in
elansc_attach().
Let us detach gpio0 at elansc0.
Let us re-attach pci0 at elansc0.
Reduce code duplication between elansc_rescan() and elansc_attach():
call _rescan() from _attach() to attach elanpex0, elanpar0, gpio0, and
pci0.
To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/i386/pci/elan520.c
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/i386/pci/elan520.c
diff -u src/sys/arch/i386/pci/elan520.c:1.39 src/sys/arch/i386/pci/elan520.c:1.40
--- src/sys/arch/i386/pci/elan520.c:1.39 Thu Apr 2 00:09:32 2009
+++ src/sys/arch/i386/pci/elan520.c Wed Apr 8 23:53:10 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: elan520.c,v 1.39 2009/04/02 00:09:32 dyoung Exp $ */
+/* $NetBSD: elan520.c,v 1.40 2009/04/08 23:53:10 dyoung Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: elan520.c,v 1.39 2009/04/02 00:09:32 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: elan520.c,v 1.40 2009/04/08 23:53:10 dyoung Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -80,10 +80,15 @@
device_t sc_pex;
device_t sc_pci;
- pci_chipset_tag_t sc_pc;
- pcitag_t sc_tag;
- bus_space_tag_t sc_memt;
- bus_space_handle_t sc_memh;
+ pci_chipset_tag_t sc_pc;
+ pcitag_t sc_tag;
+ bus_dma_tag_t sc_dmat;
+ bus_dma_tag_t sc_dmat64;
+ bus_space_tag_t sc_iot;
+ bus_space_tag_t sc_memt;
+ bus_space_handle_t sc_memh;
+ int sc_pciflags;
+
int sc_echobug;
kmutex_t sc_mtx;
@@ -123,6 +128,7 @@
static void elanpex_intr_establish(device_t, struct elansc_softc *);
static void elanpex_intr_disestablish(struct elansc_softc *);
static bool elanpex_shutdown(device_t, int);
+static int elansc_rescan(device_t, const char *, const int *);
static void elansc_protect(struct elansc_softc *, int, paddr_t, uint32_t);
@@ -139,10 +145,8 @@
sc->sc_pex = NULL;
if (child == sc->sc_pci)
sc->sc_pci = NULL;
-
- /* elansc does not presently keep a pointer to
- * the gpio, so there is nothing to do if it is detached.
- */
+ if (child == sc->sc_gpio)
+ sc->sc_gpio = NULL;
}
static int
@@ -1270,11 +1274,15 @@
sc->sc_dev = self;
sc->sc_pc = pba->pba_pc;
+ sc->sc_pciflags = pba->pba_flags;
+ sc->sc_dmat = pba->pba_dmat;
+ sc->sc_dmat64 = pba->pba_dmat64;
sc->sc_tag = pci_make_tag(sc->sc_pc, 0, 0, 0);
aprint_naive(": System Controller\n");
aprint_normal(": AMD Elan SC520 System Controller\n");
+ sc->sc_iot = pba->pba_iot;
sc->sc_memt = pba->pba_memt;
if (bus_space_map(sc->sc_memt, MMCR_BASE_ADDR, PAGE_SIZE, 0,
&sc->sc_memh) != 0) {
@@ -1386,13 +1394,12 @@
gba.gba_pins = sc->sc_gpio_pins;
gba.gba_npins = ELANSC_PIO_NPINS;
- sc->sc_par = config_found_ia(sc->sc_dev, "elanparbus", NULL, NULL);
- sc->sc_pex = config_found_ia(sc->sc_dev, "elanpexbus", NULL, NULL);
- /* Attach GPIO framework */
- sc->sc_gpio = config_found_ia(sc->sc_dev, "gpiobus", &gba,
- gpiobus_print);
#endif /* NGPIO */
+ elansc_rescan(sc->sc_dev, "elanparbus", NULL);
+ elansc_rescan(sc->sc_dev, "elanpexbus", NULL);
+ elansc_rescan(sc->sc_dev, "gpiobus", NULL);
+
/*
* Hook up the watchdog timer.
*/
@@ -1406,7 +1413,19 @@
"unable to register watchdog with sysmon\n");
}
elansc_attached = true;
+#if 0
+ pba.pba_iot = sc->sc_iot;
+ pba.pba_memt = sc->sc_memt;
+ pba.pba_dmat = sc->sc_dmat;
+ pba.pba_dmat64 = sc->sc_dmat64;
+ pba.pba_pc = sc->sc_pc;
+ pba.pba_flags = sc->sc_pciflags;
+ pba.pba_bus = 0;
+ pba.pba_bridgetag = NULL;
sc->sc_pci = config_found_ia(self, "pcibus", pba, pcibusprint);
+#else
+ elansc_rescan(sc->sc_dev, "pcibus", NULL);
+#endif
}
static int
@@ -1437,10 +1456,22 @@
{
struct elansc_softc *sc = device_private(self);
+ if (ifattr_match(ifattr, "elanparbus") && sc->sc_par == NULL) {
+ sc->sc_par = config_found_ia(sc->sc_dev, "elanparbus", NULL,
+ NULL);
+ }
+
+ if (ifattr_match(ifattr, "elanpexbus") && sc->sc_pex == NULL) {
+ sc->sc_pex = config_found_ia(sc->sc_dev, "elanpexbus", NULL,
+ NULL);
+ }
+
if (ifattr_match(ifattr, "gpiobus") && sc->sc_gpio == NULL) {
#if NGPIO > 0
struct gpiobus_attach_args gba;
+ memset(&gba, 0, sizeof(gba));
+
gba.gba_gc = &sc->sc_gpio_gc;
gba.gba_pins = sc->sc_gpio_pins;
gba.gba_npins = ELANSC_PIO_NPINS;
@@ -1449,18 +1480,21 @@
#endif
}
- if (ifattr_match(ifattr, "elanparbus") && sc->sc_par == NULL)
- sc->sc_par = config_found_ia(sc->sc_dev, ifattr, NULL, NULL);
-
- if (ifattr_match(ifattr, "elanpexbus") && sc->sc_pex == NULL)
- sc->sc_pex = config_found_ia(sc->sc_dev, ifattr, NULL, NULL);
-
if (ifattr_match(ifattr, "pcibus") && sc->sc_pci == NULL) {
-#if 0
- /* TBD */
- sc->sc_pci = config_found_ia(self, "pcibus", pba, pcibusprint);
-#endif
+ struct pcibus_attach_args pba;
+
+ memset(&pba, 0, sizeof(pba));
+ pba.pba_iot = sc->sc_iot;
+ pba.pba_memt = sc->sc_memt;
+ pba.pba_dmat = sc->sc_dmat;
+ pba.pba_dmat64 = sc->sc_dmat64;
+ pba.pba_pc = sc->sc_pc;
+ pba.pba_flags = sc->sc_pciflags;
+ pba.pba_bus = 0;
+ pba.pba_bridgetag = NULL;
+ sc->sc_pci = config_found_ia(self, "pcibus", &pba, pcibusprint);
}
+
return 0;
}