hpet: use physical addresses for dup. checking
PATCH 2/3 hpet: use physical addresses for dup. checking
From: Randy Dunlap <[email protected]>
- 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 <[email protected]>
---
drivers/char/hpet.c | 20 +++++++++++++++----- 1 files changed, 15 insertions(+), 5 deletions(-)
drivers/char/hpet.c renamed from drivers/char/hpet.c~hpet_phys_addr +15 -5
@@ -782,8 +782,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 ));
@@ -827,8 +830,8 @@ int hpet_alloc(struct hpet_data *hdp) hpetp->hp_period = (cap &HPET_COUNTER_CLK_PERIOD_MASK ) >>HPET_COUNTER_CLK_PERIOD_SHIFT ; -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]);
@@ -896,8 +899,12 @@ static acpi_status hpet_resources(struct 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;
@@ -910,7 +917,10 @@ static acpi_status hpet_resources(struct 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 ) {
---