summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2004-07-22 05:32:56 +0000
committernjl <njl@FreeBSD.org>2004-07-22 05:32:56 +0000
commit6cc8d1d266d9241b85a41408b8ecd9d8960d5558 (patch)
tree8226ba9e7e935b2293ed20d6eea9a4606f65481c /sys/dev/acpica
parent45ea516f197ff007e17e08cd736201160fc63310 (diff)
downloadFreeBSD-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/acpica')
-rw-r--r--sys/dev/acpica/acpi_timer.c68
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);
}
OpenPOWER on IntegriCloud