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; }