Module Name: src Committed By: jruoho Date: Tue Jun 14 16:33:51 UTC 2011
Modified Files: src/sys/dev/acpi: hpet_acpi.c src/sys/dev/ic: hpetvar.h Log Message: Add detach function. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/dev/acpi/hpet_acpi.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/ic/hpetvar.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/dev/acpi/hpet_acpi.c diff -u src/sys/dev/acpi/hpet_acpi.c:1.6 src/sys/dev/acpi/hpet_acpi.c:1.7 --- src/sys/dev/acpi/hpet_acpi.c:1.6 Tue Jun 14 13:59:23 2011 +++ src/sys/dev/acpi/hpet_acpi.c Tue Jun 14 16:33:51 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: hpet_acpi.c,v 1.6 2011/06/14 13:59:23 jruoho Exp $ */ +/* $NetBSD: hpet_acpi.c,v 1.7 2011/06/14 16:33:51 jruoho Exp $ */ /* * Copyright (c) 2006, 2011 Nicolas Joly @@ -28,7 +28,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hpet_acpi.c,v 1.6 2011/06/14 13:59:23 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hpet_acpi.c,v 1.7 2011/06/14 16:33:51 jruoho Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -47,6 +47,7 @@ static void hpet_acpi_dev_attach(device_t, device_t, void *); static int hpet_acpi_tab_match(device_t, cfdata_t, void *); static void hpet_acpi_tab_attach(device_t, device_t, void *); +static int hpet_acpi_detach(device_t, int); static const char * const hpet_acpi_ids[] = { "PNP0103", @@ -54,10 +55,10 @@ }; CFATTACH_DECL_NEW(hpet_acpi_tab, sizeof(struct hpet_softc), - hpet_acpi_tab_match, hpet_acpi_tab_attach, NULL, NULL); + hpet_acpi_tab_match, hpet_acpi_tab_attach, hpet_acpi_detach, NULL); CFATTACH_DECL_NEW(hpet_acpi_dev, sizeof(struct hpet_softc), - hpet_acpi_dev_match, hpet_acpi_dev_attach, NULL, NULL); + hpet_acpi_dev_match, hpet_acpi_dev_attach, hpet_acpi_detach, NULL); static int hpet_acpi_tab_match(device_t parent, cfdata_t match, void *aux) @@ -87,22 +88,27 @@ ACPI_TABLE_HPET *hpet; ACPI_STATUS rv; + sc->sc_mapped = false; + rv = AcpiGetTable(ACPI_SIG_HPET, 1, (ACPI_TABLE_HEADER **)&hpet); if (ACPI_FAILURE(rv)) return; sc->sc_memt = aa->aa_memt; + sc->sc_mems = HPET_MEM_WIDTH; if (hpet->Address.Address == 0xfed0000000000000UL) /* A quirk. */ hpet->Address.Address >>= 32; if (bus_space_map(sc->sc_memt, hpet->Address.Address, - HPET_MEM_WIDTH, 0, &sc->sc_memh) != 0) { + sc->sc_mems, 0, &sc->sc_memh) != 0) { aprint_error(": failed to map mem space\n"); return; } + sc->sc_mapped = true; + aprint_naive("\n"); aprint_normal(": mem 0x%"PRIx64"-0x%"PRIx64"\n", hpet->Address.Address, hpet->Address.Address + HPET_MEM_WIDTH); @@ -130,6 +136,8 @@ struct acpi_mem *mem; ACPI_STATUS rv; + sc->sc_mapped = false; + rv = acpi_resource_parse(self, aa->aa_node->ad_handle, "_CRS", &res, &acpi_resource_parse_ops_default); @@ -149,15 +157,33 @@ } sc->sc_memt = aa->aa_memt; + sc->sc_mems = mem->ar_length; if (bus_space_map(sc->sc_memt, mem->ar_base, - mem->ar_length, 0, &sc->sc_memh) != 0) { + sc->sc_mems, 0, &sc->sc_memh) != 0) { aprint_error(": failed to map mem space\n"); goto out; } + sc->sc_mapped = true; + hpet_attach_subr(self); out: acpi_resource_cleanup(&res); } + +static int +hpet_acpi_detach(device_t self, int flags) +{ + struct hpet_softc *sc = device_private(self); + int rv; + + if (sc->sc_mapped != true) + return 0; + + rv = hpet_detach(self, flags); + bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_mems); + + return rv; +} Index: src/sys/dev/ic/hpetvar.h diff -u src/sys/dev/ic/hpetvar.h:1.3 src/sys/dev/ic/hpetvar.h:1.4 --- src/sys/dev/ic/hpetvar.h:1.3 Tue Aug 18 17:06:35 2009 +++ src/sys/dev/ic/hpetvar.h Tue Jun 14 16:33:51 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: hpetvar.h,v 1.3 2009/08/18 17:06:35 dyoung Exp $ */ +/* $NetBSD: hpetvar.h,v 1.4 2011/06/14 16:33:51 jruoho Exp $ */ /* * Copyright (c) 2006 Nicolas Joly @@ -32,11 +32,13 @@ #define _DEV_IC_HPETVAR_H_ struct hpet_softc { - bus_space_tag_t sc_memt; - bus_space_handle_t sc_memh; - - uint32_t sc_config; - struct timecounter sc_tc; + bus_size_t sc_mems; + bus_space_tag_t sc_memt; + bus_space_handle_t sc_memh; + + bool sc_mapped; + uint32_t sc_config; + struct timecounter sc_tc; }; void hpet_attach_subr(device_t);