aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/osl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/osl.c')
-rw-r--r--drivers/acpi/osl.c98
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
557acpi_status
558acpi_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
557static irqreturn_t acpi_irq(int irq, void *dev_id) 566static 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
700EXPORT_SYMBOL(acpi_os_write_port); 710EXPORT_SYMBOL(acpi_os_write_port);
701 711
702acpi_status
703acpi_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
746static inline u64 read64(const volatile void __iomem *addr) 713static 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
760acpi_status 727acpi_status
761acpi_os_read_memory64(acpi_physical_address phys_addr, u64 *value, u32 width) 728acpi_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
806acpi_status
807acpi_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
846static inline void write64(u64 val, volatile void __iomem *addr) 774static 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
858acpi_status 786acpi_status
859acpi_os_write_memory64(acpi_physical_address phys_addr, u64 value, u32 width) 787acpi_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;