aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/hpet.c
diff options
context:
space:
mode:
authorRandy Dunlap <randy_d_dunlap@linux.intel.com>2005-10-30 18:03:43 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-10-30 20:37:31 -0500
commitb6ab126211e2ab17eecbd063b99742a6b04b228e (patch)
treeb92172fb297b29d0fb32e08ac0a2aaaee4fdc2d6 /drivers/char/hpet.c
parent757c4724099a31a61754ea5202802eaa1def851c (diff)
[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>
Diffstat (limited to 'drivers/char/hpet.c')
-rw-r--r--drivers/char/hpet.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index e605259e3753..86a2ee40078b 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -809,8 +809,11 @@ int hpet_alloc(struct hpet_data *hdp)
809 * ACPI also reports hpet, then we catch it here. 809 * ACPI also reports hpet, then we catch it here.
810 */ 810 */
811 for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next) 811 for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next)
812 if (hpetp->hp_hpet == hdp->hd_address) 812 if (hpetp->hp_hpet_phys == hdp->hd_phys_address) {
813 printk(KERN_DEBUG "%s: duplicate HPET ignored\n",
814 __FUNCTION__);
813 return 0; 815 return 0;
816 }
814 817
815 siz = sizeof(struct hpets) + ((hdp->hd_nirqs - 1) * 818 siz = sizeof(struct hpets) + ((hdp->hd_nirqs - 1) *
816 sizeof(struct hpet_dev)); 819 sizeof(struct hpet_dev));
@@ -858,8 +861,8 @@ int hpet_alloc(struct hpet_data *hdp)
858 do_div(temp, period); 861 do_div(temp, period);
859 hpetp->hp_tick_freq = temp; /* ticks per second */ 862 hpetp->hp_tick_freq = temp; /* ticks per second */
860 863
861 printk(KERN_INFO "hpet%d: at MMIO 0x%lx, IRQ%s", 864 printk(KERN_INFO "hpet%d: at MMIO 0x%lx (virtual 0x%p), IRQ%s",
862 hpetp->hp_which, hdp->hd_phys_address, 865 hpetp->hp_which, hdp->hd_phys_address, hdp->hd_address,
863 hpetp->hp_ntimer > 1 ? "s" : ""); 866 hpetp->hp_ntimer > 1 ? "s" : "");
864 for (i = 0; i < hpetp->hp_ntimer; i++) 867 for (i = 0; i < hpetp->hp_ntimer; i++)
865 printk("%s %d", i > 0 ? "," : "", hdp->hd_irq[i]); 868 printk("%s %d", i > 0 ? "," : "", hdp->hd_irq[i]);
@@ -922,8 +925,12 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
922 hdp->hd_address = ioremap(addr.min_address_range, size); 925 hdp->hd_address = ioremap(addr.min_address_range, size);
923 926
924 for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next) 927 for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next)
925 if (hpetp->hp_hpet == hdp->hd_address) 928 if (hpetp->hp_hpet_phys == hdp->hd_phys_address) {
929 printk(KERN_DEBUG "%s: 0x%lx is busy\n",
930 __FUNCTION__, hdp->hd_phys_address);
931 iounmap(hdp->hd_address);
926 return -EBUSY; 932 return -EBUSY;
933 }
927 } else if (res->id == ACPI_RSTYPE_FIXED_MEM32) { 934 } else if (res->id == ACPI_RSTYPE_FIXED_MEM32) {
928 struct acpi_resource_fixed_mem32 *fixmem32; 935 struct acpi_resource_fixed_mem32 *fixmem32;
929 936
@@ -936,7 +943,10 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
936 HPET_RANGE_SIZE); 943 HPET_RANGE_SIZE);
937 944
938 for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next) 945 for (hpetp = hpets; hpetp; hpetp = hpetp->hp_next)
939 if (hpetp->hp_hpet == hdp->hd_address) { 946 if (hpetp->hp_hpet_phys == hdp->hd_phys_address) {
947 printk(KERN_DEBUG "%s: 0x%lx is busy\n",
948 __FUNCTION__, hdp->hd_phys_address);
949 iounmap(hdp->hd_address);
940 return -EBUSY; 950 return -EBUSY;
941 } 951 }
942 } else if (res->id == ACPI_RSTYPE_EXT_IRQ) { 952 } else if (res->id == ACPI_RSTYPE_EXT_IRQ) {