diff options
Diffstat (limited to 'drivers/acpi/osl.c')
| -rw-r--r-- | drivers/acpi/osl.c | 98 |
1 files changed, 13 insertions, 85 deletions
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index 5aef087d42d0..9fddb55764f3 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -554,6 +554,15 @@ acpi_os_table_override(struct acpi_table_header * existing_table, | |||
| 554 | return AE_OK; | 554 | return AE_OK; |
| 555 | } | 555 | } |
| 556 | 556 | ||
| 557 | acpi_status | ||
| 558 | acpi_os_physical_table_override(struct acpi_table_header *existing_table, | ||
| 559 | acpi_physical_address * new_address, | ||
| 560 | u32 *new_table_length) | ||
| 561 | { | ||
| 562 | return AE_SUPPORT; | ||
| 563 | } | ||
| 564 | |||
| 565 | |||
| 557 | static irqreturn_t acpi_irq(int irq, void *dev_id) | 566 | static irqreturn_t acpi_irq(int irq, void *dev_id) |
| 558 | { | 567 | { |
| 559 | u32 handled; | 568 | u32 handled; |
| @@ -595,7 +604,8 @@ acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler, | |||
| 595 | 604 | ||
| 596 | acpi_irq_handler = handler; | 605 | acpi_irq_handler = handler; |
| 597 | acpi_irq_context = context; | 606 | acpi_irq_context = context; |
| 598 | if (request_irq(irq, acpi_irq, IRQF_SHARED, "acpi", acpi_irq)) { | 607 | if (request_threaded_irq(irq, NULL, acpi_irq, IRQF_SHARED, "acpi", |
| 608 | acpi_irq)) { | ||
| 599 | printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq); | 609 | printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq); |
| 600 | acpi_irq_handler = NULL; | 610 | acpi_irq_handler = NULL; |
| 601 | return AE_NOT_ACQUIRED; | 611 | return AE_NOT_ACQUIRED; |
| @@ -699,49 +709,6 @@ acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width) | |||
| 699 | 709 | ||
| 700 | EXPORT_SYMBOL(acpi_os_write_port); | 710 | EXPORT_SYMBOL(acpi_os_write_port); |
| 701 | 711 | ||
| 702 | acpi_status | ||
| 703 | acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width) | ||
| 704 | { | ||
| 705 | void __iomem *virt_addr; | ||
| 706 | unsigned int size = width / 8; | ||
| 707 | bool unmap = false; | ||
| 708 | u32 dummy; | ||
| 709 | |||
| 710 | rcu_read_lock(); | ||
| 711 | virt_addr = acpi_map_vaddr_lookup(phys_addr, size); | ||
| 712 | if (!virt_addr) { | ||
| 713 | rcu_read_unlock(); | ||
| 714 | virt_addr = acpi_os_ioremap(phys_addr, size); | ||
| 715 | if (!virt_addr) | ||
| 716 | return AE_BAD_ADDRESS; | ||
| 717 | unmap = true; | ||
| 718 | } | ||
| 719 | |||
| 720 | if (!value) | ||
| 721 | value = &dummy; | ||
| 722 | |||
| 723 | switch (width) { | ||
| 724 | case 8: | ||
| 725 | *(u8 *) value = readb(virt_addr); | ||
| 726 | break; | ||
| 727 | case 16: | ||
| 728 | *(u16 *) value = readw(virt_addr); | ||
| 729 | break; | ||
| 730 | case 32: | ||
| 731 | *(u32 *) value = readl(virt_addr); | ||
| 732 | break; | ||
| 733 | default: | ||
| 734 | BUG(); | ||
| 735 | } | ||
| 736 | |||
| 737 | if (unmap) | ||
| 738 | iounmap(virt_addr); | ||
| 739 | else | ||
| 740 | rcu_read_unlock(); | ||
| 741 | |||
| 742 | return AE_OK; | ||
| 743 | } | ||
| 744 | |||
| 745 | #ifdef readq | 712 | #ifdef readq |
| 746 | static inline u64 read64(const volatile void __iomem *addr) | 713 | static inline u64 read64(const volatile void __iomem *addr) |
| 747 | { | 714 | { |
| @@ -758,7 +725,7 @@ static inline u64 read64(const volatile void __iomem *addr) | |||
| 758 | #endif | 725 | #endif |
| 759 | 726 | ||
| 760 | acpi_status | 727 | acpi_status |
| 761 | acpi_os_read_memory64(acpi_physical_address phys_addr, u64 *value, u32 width) | 728 | acpi_os_read_memory(acpi_physical_address phys_addr, u64 *value, u32 width) |
| 762 | { | 729 | { |
| 763 | void __iomem *virt_addr; | 730 | void __iomem *virt_addr; |
| 764 | unsigned int size = width / 8; | 731 | unsigned int size = width / 8; |
| @@ -803,45 +770,6 @@ acpi_os_read_memory64(acpi_physical_address phys_addr, u64 *value, u32 width) | |||
| 803 | return AE_OK; | 770 | return AE_OK; |
| 804 | } | 771 | } |
| 805 | 772 | ||
| 806 | acpi_status | ||
| 807 | acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width) | ||
| 808 | { | ||
| 809 | void __iomem *virt_addr; | ||
| 810 | unsigned int size = width / 8; | ||
| 811 | bool unmap = false; | ||
| 812 | |||
| 813 | rcu_read_lock(); | ||
| 814 | virt_addr = acpi_map_vaddr_lookup(phys_addr, size); | ||
| 815 | if (!virt_addr) { | ||
| 816 | rcu_read_unlock(); | ||
| 817 | virt_addr = acpi_os_ioremap(phys_addr, size); | ||
| 818 | if (!virt_addr) | ||
| 819 | return AE_BAD_ADDRESS; | ||
| 820 | unmap = true; | ||
| 821 | } | ||
| 822 | |||
| 823 | switch (width) { | ||
| 824 | case 8: | ||
| 825 | writeb(value, virt_addr); | ||
| 826 | break; | ||
| 827 | case 16: | ||
| 828 | writew(value, virt_addr); | ||
| 829 | break; | ||
| 830 | case 32: | ||
| 831 | writel(value, virt_addr); | ||
| 832 | break; | ||
| 833 | default: | ||
| 834 | BUG(); | ||
| 835 | } | ||
| 836 | |||
| 837 | if (unmap) | ||
| 838 | iounmap(virt_addr); | ||
| 839 | else | ||
| 840 | rcu_read_unlock(); | ||
| 841 | |||
| 842 | return AE_OK; | ||
| 843 | } | ||
| 844 | |||
| 845 | #ifdef writeq | 773 | #ifdef writeq |
| 846 | static inline void write64(u64 val, volatile void __iomem *addr) | 774 | static inline void write64(u64 val, volatile void __iomem *addr) |
| 847 | { | 775 | { |
| @@ -856,7 +784,7 @@ static inline void write64(u64 val, volatile void __iomem *addr) | |||
| 856 | #endif | 784 | #endif |
| 857 | 785 | ||
| 858 | acpi_status | 786 | acpi_status |
| 859 | acpi_os_write_memory64(acpi_physical_address phys_addr, u64 value, u32 width) | 787 | acpi_os_write_memory(acpi_physical_address phys_addr, u64 value, u32 width) |
| 860 | { | 788 | { |
| 861 | void __iomem *virt_addr; | 789 | void __iomem *virt_addr; |
| 862 | unsigned int size = width / 8; | 790 | unsigned int size = width / 8; |
