[PATCH] hpet: allow HPET FIXED_MEM32 resource type
authorRandy Dunlap <randy_d_dunlap@linux.intel.com>
Sun, 30 Oct 2005 23:03:42 +0000 (15:03 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 31 Oct 2005 01:37:31 +0000 (17:37 -0800)
Allow the ACPI HPET description table to use a resource type of FIXED_MEM32
for the HPET reource.  Use the fixed resoure size of 1 KB for the HPET
resource as per the HPET spec.

Signed-off-by: Randy Dunlap <randy_d_dunlap@linux.intel.com>
Acked-by: Bob Picco <bob.picco@hp.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/char/hpet.c

index 0159c463f0f9b6dfad57fa687cff9f8621e2252a..e605259e3753374a86f4a5a6796d452b2823e30f 100644 (file)
@@ -49,6 +49,8 @@
 #define        HPET_USER_FREQ  (64)
 #define        HPET_DRIFT      (500)
 
+#define HPET_RANGE_SIZE                1024    /* from HPET spec */
+
 static u32 hpet_nhpet, hpet_max_freq = HPET_USER_FREQ;
 
 /* A lock for concurrent access by app and isr hpet activity. */
@@ -922,6 +924,21 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
                for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next)
                        if (hpetp->hp_hpet == hdp->hd_address)
                                return -EBUSY;
+       } else if (res->id == ACPI_RSTYPE_FIXED_MEM32) {
+               struct acpi_resource_fixed_mem32 *fixmem32;
+
+               fixmem32 = &res->data.fixed_memory32;
+               if (!fixmem32)
+                       return -EINVAL;
+
+               hdp->hd_phys_address = fixmem32->range_base_address;
+               hdp->hd_address = ioremap(fixmem32->range_base_address,
+                                               HPET_RANGE_SIZE);
+
+               for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next)
+                       if (hpetp->hp_hpet == hdp->hd_address) {
+                               return -EBUSY;
+                       }
        } else if (res->id == ACPI_RSTYPE_EXT_IRQ) {
                struct acpi_resource_ext_irq *irqp;
                int i;