aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorMyron Stowe <myron.stowe@hp.com>2010-10-21 16:23:59 -0400
committerLen Brown <len.brown@intel.com>2010-10-24 23:26:23 -0400
commit29718521237a1b1607ea05b49243100ea2044337 (patch)
tree69608fa74248415a6055f0b48753cf54b63043b3 /drivers/acpi
parent620242ae8c3d9c0b1a77451744fb2d855d1e7342 (diff)
ACPI: Add interfaces for ioremapping/iounmapping ACPI registers
Add remapping and unmapping interfaces for ACPI registers that are backed by memory mapped I/O (MMIO). These interfaces, along with the MMIO remapping list, enable accesses of such registers from within interrupt context. ACPI Generic Address Structure (GAS) reference (ACPI's fixed/generic hardware registers use the GAS format): ACPI Specification, Revision 4.0, Section 5.2.3.1, "Generic Address Structure". Signed-off-by: Myron Stowe <myron.stowe@hp.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi')
-rw-r--r--drivers/acpi/osl.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
index bd72129e35f..fc6c5d21c3e 100644
--- a/drivers/acpi/osl.c
+++ b/drivers/acpi/osl.c
@@ -372,6 +372,44 @@ void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
372 __acpi_unmap_table(virt, size); 372 __acpi_unmap_table(virt, size);
373} 373}
374 374
375int acpi_os_map_generic_address(struct acpi_generic_address *addr)
376{
377 void __iomem *virt;
378
379 if (addr->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
380 return 0;
381
382 if (!addr->address || !addr->bit_width)
383 return -EINVAL;
384
385 virt = acpi_os_map_memory(addr->address, addr->bit_width / 8);
386 if (!virt)
387 return -EIO;
388
389 return 0;
390}
391EXPORT_SYMBOL_GPL(acpi_os_map_generic_address);
392
393void acpi_os_unmap_generic_address(struct acpi_generic_address *addr)
394{
395 void __iomem *virt;
396 unsigned long flags;
397 acpi_size size = addr->bit_width / 8;
398
399 if (addr->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
400 return;
401
402 if (!addr->address || !addr->bit_width)
403 return;
404
405 spin_lock_irqsave(&acpi_ioremap_lock, flags);
406 virt = acpi_map_vaddr_lookup(addr->address, size);
407 spin_unlock_irqrestore(&acpi_ioremap_lock, flags);
408
409 acpi_os_unmap_memory(virt, size);
410}
411EXPORT_SYMBOL_GPL(acpi_os_unmap_generic_address);
412
375#ifdef ACPI_FUTURE_USAGE 413#ifdef ACPI_FUTURE_USAGE
376acpi_status 414acpi_status
377acpi_os_get_physical_address(void *virt, acpi_physical_address * phys) 415acpi_os_get_physical_address(void *virt, acpi_physical_address * phys)