diff options
author | Randy Dunlap <randy_d_dunlap@linux.intel.com> | 2005-10-30 15:03:43 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 17:37:31 -0800 |
commit | b6ab126211e2ab17eecbd063b99742a6b04b228e (patch) | |
tree | b92172fb297b29d0fb32e08ac0a2aaaee4fdc2d6 | |
parent | 757c4724099a31a61754ea5202802eaa1def851c (diff) | |
download | kernel_samsung_smdk4412-b6ab126211e2ab17eecbd063b99742a6b04b228e.zip kernel_samsung_smdk4412-b6ab126211e2ab17eecbd063b99742a6b04b228e.tar.gz kernel_samsung_smdk4412-b6ab126211e2ab17eecbd063b99742a6b04b228e.tar.bz2 |
[PATCH] hpet: use HPET physical addresses for dup. detection
- Use HPET physical address to detect duplicates, not logical addresses.
Using logical (mapped) addresses fails to detect duplicates
because ioremap() returns a new mapped address each time.
- iounmap() regions when duplicate/busy areas are found.
Signed-off-by: Randy Dunlap <randy_d_dunlap@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | drivers/char/hpet.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index e605259..86a2ee4 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c @@ -809,8 +809,11 @@ int hpet_alloc(struct hpet_data *hdp) * ACPI also reports hpet, then we catch it here. */ for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next) - if (hpetp->hp_hpet == hdp->hd_address) + if (hpetp->hp_hpet_phys == hdp->hd_phys_address) { + printk(KERN_DEBUG "%s: duplicate HPET ignored\n", + __FUNCTION__); return 0; + } siz = sizeof(struct hpets) + ((hdp->hd_nirqs - 1) * sizeof(struct hpet_dev)); @@ -858,8 +861,8 @@ int hpet_alloc(struct hpet_data *hdp) do_div(temp, period); hpetp->hp_tick_freq = temp; /* ticks per second */ - printk(KERN_INFO "hpet%d: at MMIO 0x%lx, IRQ%s", - hpetp->hp_which, hdp->hd_phys_address, + printk(KERN_INFO "hpet%d: at MMIO 0x%lx (virtual 0x%p), IRQ%s", + hpetp->hp_which, hdp->hd_phys_address, hdp->hd_address, hpetp->hp_ntimer > 1 ? "s" : ""); for (i = 0; i < hpetp->hp_ntimer; i++) printk("%s %d", i > 0 ? "," : "", hdp->hd_irq[i]); @@ -922,8 +925,12 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data) hdp->hd_address = ioremap(addr.min_address_range, size); for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next) - if (hpetp->hp_hpet == hdp->hd_address) + if (hpetp->hp_hpet_phys == hdp->hd_phys_address) { + printk(KERN_DEBUG "%s: 0x%lx is busy\n", + __FUNCTION__, hdp->hd_phys_address); + iounmap(hdp->hd_address); return -EBUSY; + } } else if (res->id == ACPI_RSTYPE_FIXED_MEM32) { struct acpi_resource_fixed_mem32 *fixmem32; @@ -936,7 +943,10 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data) HPET_RANGE_SIZE); for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next) - if (hpetp->hp_hpet == hdp->hd_address) { + if (hpetp->hp_hpet_phys == hdp->hd_phys_address) { + printk(KERN_DEBUG "%s: 0x%lx is busy\n", + __FUNCTION__, hdp->hd_phys_address); + iounmap(hdp->hd_address); return -EBUSY; } } else if (res->id == ACPI_RSTYPE_EXT_IRQ) { |