diff options
Diffstat (limited to 'drivers/acpi/osl.c')
-rw-r--r-- | drivers/acpi/osl.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index db78d353bab1..3bb46cb24a99 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
@@ -663,6 +663,29 @@ acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width) | |||
663 | 663 | ||
664 | EXPORT_SYMBOL(acpi_os_write_port); | 664 | EXPORT_SYMBOL(acpi_os_write_port); |
665 | 665 | ||
666 | int acpi_os_read_iomem(void __iomem *virt_addr, u64 *value, u32 width) | ||
667 | { | ||
668 | |||
669 | switch (width) { | ||
670 | case 8: | ||
671 | *(u8 *) value = readb(virt_addr); | ||
672 | break; | ||
673 | case 16: | ||
674 | *(u16 *) value = readw(virt_addr); | ||
675 | break; | ||
676 | case 32: | ||
677 | *(u32 *) value = readl(virt_addr); | ||
678 | break; | ||
679 | case 64: | ||
680 | *(u64 *) value = readq(virt_addr); | ||
681 | break; | ||
682 | default: | ||
683 | return -EINVAL; | ||
684 | } | ||
685 | |||
686 | return 0; | ||
687 | } | ||
688 | |||
666 | acpi_status | 689 | acpi_status |
667 | acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) | 690 | acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) |
668 | { | 691 | { |
@@ -670,6 +693,7 @@ acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) | |||
670 | unsigned int size = width / 8; | 693 | unsigned int size = width / 8; |
671 | bool unmap = false; | 694 | bool unmap = false; |
672 | u64 dummy; | 695 | u64 dummy; |
696 | int error; | ||
673 | 697 | ||
674 | rcu_read_lock(); | 698 | rcu_read_lock(); |
675 | virt_addr = acpi_map_vaddr_lookup(phys_addr, size); | 699 | virt_addr = acpi_map_vaddr_lookup(phys_addr, size); |
@@ -684,22 +708,8 @@ acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) | |||
684 | if (!value) | 708 | if (!value) |
685 | value = &dummy; | 709 | value = &dummy; |
686 | 710 | ||
687 | switch (width) { | 711 | error = acpi_os_read_iomem(virt_addr, value, width); |
688 | case 8: | 712 | BUG_ON(error); |
689 | *(u8 *) value = readb(virt_addr); | ||
690 | break; | ||
691 | case 16: | ||
692 | *(u16 *) value = readw(virt_addr); | ||
693 | break; | ||
694 | case 32: | ||
695 | *(u32 *) value = readl(virt_addr); | ||
696 | break; | ||
697 | case 64: | ||
698 | *(u64 *) value = readq(virt_addr); | ||
699 | break; | ||
700 | default: | ||
701 | BUG(); | ||
702 | } | ||
703 | 713 | ||
704 | if (unmap) | 714 | if (unmap) |
705 | iounmap(virt_addr); | 715 | iounmap(virt_addr); |