diff options
author | njl <njl@FreeBSD.org> | 2004-07-22 05:32:56 +0000 |
---|---|---|
committer | njl <njl@FreeBSD.org> | 2004-07-22 05:32:56 +0000 |
commit | 6cc8d1d266d9241b85a41408b8ecd9d8960d5558 (patch) | |
tree | 8226ba9e7e935b2293ed20d6eea9a4606f65481c /sys/dev | |
parent | 45ea516f197ff007e17e08cd736201160fc63310 (diff) | |
download | FreeBSD-src-6cc8d1d266d9241b85a41408b8ecd9d8960d5558.zip FreeBSD-src-6cc8d1d266d9241b85a41408b8ecd9d8960d5558.tar.gz |
Instead of doing everything in identify, do a proper probe/attach. Also,
don't add another device if identify is called twice. Minor reworking by
myself.
Submitted by: marcel
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/acpica/acpi_timer.c | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/sys/dev/acpica/acpi_timer.c b/sys/dev/acpica/acpi_timer.c index e3426bc..5856019 100644 --- a/sys/dev/acpica/acpi_timer.c +++ b/sys/dev/acpica/acpi_timer.c @@ -110,14 +110,13 @@ acpi_timer_read() static void acpi_timer_identify(driver_t *driver, device_t parent) { - device_t dev; - char desc[40]; - u_long rlen, rstart; - int i, j, rid, rtype; + device_t dev; + u_long rlen, rstart; + int rid, rtype; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - if (acpi_disabled("timer") || AcpiGbl_FADT == NULL) + if (acpi_disabled("timer") || AcpiGbl_FADT == NULL || acpi_timer_dev) return_VOID; if ((dev = BUS_ADD_CHILD(parent, 0, "acpi_timer", 0)) == NULL) { @@ -127,19 +126,37 @@ acpi_timer_identify(driver_t *driver, device_t parent) acpi_timer_dev = dev; rid = 0; + rtype = AcpiGbl_FADT->XPmTmrBlk.AddressSpaceId ? + SYS_RES_IOPORT : SYS_RES_MEMORY; rlen = AcpiGbl_FADT->PmTmLen; - rtype = (AcpiGbl_FADT->XPmTmrBlk.AddressSpaceId) - ? SYS_RES_IOPORT : SYS_RES_MEMORY; rstart = AcpiGbl_FADT->XPmTmrBlk.Address; - bus_set_resource(dev, rtype, rid, rstart, rlen); + if (bus_set_resource(dev, rtype, rid, rstart, rlen)) + device_printf(dev, "couldn't set resource (%s 0x%lx+0x%lx)\n", + (rtype == SYS_RES_IOPORT) ? "port" : "mem", rstart, rlen); + return_VOID; +} + +static int +acpi_timer_probe(device_t dev) +{ + char desc[40]; + int i, j, rid, rtype; + + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); + + if (dev != acpi_timer_dev) + return (ENXIO); + + rid = 0; + rtype = AcpiGbl_FADT->XPmTmrBlk.AddressSpaceId ? + SYS_RES_IOPORT : SYS_RES_MEMORY; acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE); if (acpi_timer_reg == NULL) { - device_printf(dev, "couldn't allocate I/O resource (%s 0x%lx)\n", - rtype == SYS_RES_IOPORT ? "port" : "mem", rstart); - return_VOID; + device_printf(dev, "couldn't allocate resource (%s 0x%lx)\n", + (rtype == SYS_RES_IOPORT) ? "port" : "mem", + (u_long)AcpiGbl_FADT->XPmTmrBlk.Address); + return (ENXIO); } - acpi_timer_bsh = rman_get_bushandle(acpi_timer_reg); - acpi_timer_bst = rman_get_bustag(acpi_timer_reg); if (AcpiGbl_FADT->TmrValExt != 0) acpi_timer_timecounter.tc_counter_mask = 0xffffffff; else @@ -166,24 +183,29 @@ acpi_timer_identify(driver_t *driver, device_t parent) tc_init(&acpi_timer_timecounter); sprintf(desc, "%d-bit timer at 3.579545MHz", - AcpiGbl_FADT->TmrValExt ? 32 : 24); + AcpiGbl_FADT->TmrValExt ? 32 : 24); device_set_desc_copy(dev, desc); - return_VOID; + /* Release the resource, we'll allocate it again during attach. */ + bus_release_resource(dev, rtype, rid, acpi_timer_reg); + return (0); } static int -acpi_timer_probe(device_t dev) +acpi_timer_attach(device_t dev) { - if (dev == acpi_timer_dev) - return (0); + int rid, rtype; - return (ENXIO); -} + ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); -static int -acpi_timer_attach(device_t dev) -{ + rid = 0; + rtype = AcpiGbl_FADT->XPmTmrBlk.AddressSpaceId ? + SYS_RES_IOPORT : SYS_RES_MEMORY; + acpi_timer_reg = bus_alloc_resource_any(dev, rtype, &rid, RF_ACTIVE); + if (acpi_timer_reg == NULL) + return (ENXIO); + acpi_timer_bsh = rman_get_bushandle(acpi_timer_reg); + acpi_timer_bst = rman_get_bustag(acpi_timer_reg); return (0); } |