Merge branches 'acpi-iomem', 'acpi-pm' and 'acpi-sci' into acpi-next

This commit is contained in:
Rafael J. Wysocki 2011-02-24 20:00:44 +01:00
commit dd87cc53c4
13 changed files with 126 additions and 133 deletions

View file

@ -128,9 +128,9 @@ static inline const char *acpi_get_sysname (void)
int acpi_request_vector (u32 int_type); int acpi_request_vector (u32 int_type);
int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
/* routines for saving/restoring kernel state */ /* Low-level suspend routine. */
extern int acpi_save_state_mem(void); extern int acpi_suspend_lowlevel(void);
extern void acpi_restore_state_mem(void);
extern unsigned long acpi_wakeup_address; extern unsigned long acpi_wakeup_address;
/* /*

View file

@ -1034,18 +1034,8 @@ int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)
EXPORT_SYMBOL(acpi_unregister_ioapic); EXPORT_SYMBOL(acpi_unregister_ioapic);
/* /*
* acpi_save_state_mem() - save kernel state * acpi_suspend_lowlevel() - save kernel state and suspend.
* *
* TBD when when IA64 starts to support suspend... * TBD when when IA64 starts to support suspend...
*/ */
int acpi_save_state_mem(void) { return 0; } int acpi_suspend_lowlevel(void) { return 0; }
/*
* acpi_restore_state()
*/
void acpi_restore_state_mem(void) {}
/*
* do_suspend_lowlevel()
*/
void do_suspend_lowlevel(void) {}

View file

@ -112,9 +112,8 @@ static inline void acpi_disable_pci(void)
acpi_noirq_set(); acpi_noirq_set();
} }
/* routines for saving/restoring kernel state */ /* Low-level suspend routine. */
extern int acpi_save_state_mem(void); extern int acpi_suspend_lowlevel(void);
extern void acpi_restore_state_mem(void);
extern unsigned long acpi_wakeup_address; extern unsigned long acpi_wakeup_address;

View file

@ -29,14 +29,14 @@ static char temp_stack[4096];
#endif #endif
/** /**
* acpi_save_state_mem - save kernel state * acpi_suspend_lowlevel - save kernel state
* *
* Create an identity mapped page table and copy the wakeup routine to * Create an identity mapped page table and copy the wakeup routine to
* low memory. * low memory.
* *
* Note that this is too late to change acpi_wakeup_address. * Note that this is too late to change acpi_wakeup_address.
*/ */
int acpi_save_state_mem(void) int acpi_suspend_lowlevel(void)
{ {
struct wakeup_header *header; struct wakeup_header *header;
@ -107,17 +107,10 @@ int acpi_save_state_mem(void)
saved_magic = 0x123456789abcdef0L; saved_magic = 0x123456789abcdef0L;
#endif /* CONFIG_64BIT */ #endif /* CONFIG_64BIT */
do_suspend_lowlevel();
return 0; return 0;
} }
/*
* acpi_restore_state - undo effects of acpi_save_state_mem
*/
void acpi_restore_state_mem(void)
{
}
/** /**
* acpi_reserve_wakeup_memory - do _very_ early ACPI initialisation * acpi_reserve_wakeup_memory - do _very_ early ACPI initialisation
* *

View file

@ -14,3 +14,5 @@ extern char swsusp_pg_dir[PAGE_SIZE];
extern unsigned long acpi_copy_wakeup_routine(unsigned long); extern unsigned long acpi_copy_wakeup_routine(unsigned long);
extern void wakeup_long64(void); extern void wakeup_long64(void);
extern void do_suspend_lowlevel(void);

View file

@ -98,6 +98,7 @@ struct acpi_button {
struct input_dev *input; struct input_dev *input;
char phys[32]; /* for input device */ char phys[32]; /* for input device */
unsigned long pushed; unsigned long pushed;
bool wakeup_enabled;
}; };
static const struct file_operations acpi_button_info_fops = { static const struct file_operations acpi_button_info_fops = {
@ -430,8 +431,10 @@ static int acpi_button_add(struct acpi_device *device)
/* Button's GPE is run-wake GPE */ /* Button's GPE is run-wake GPE */
acpi_enable_gpe(device->wakeup.gpe_device, acpi_enable_gpe(device->wakeup.gpe_device,
device->wakeup.gpe_number); device->wakeup.gpe_number);
device->wakeup.run_wake_count++; if (!device_may_wakeup(&device->dev)) {
device_set_wakeup_enable(&device->dev, true); device_set_wakeup_enable(&device->dev, true);
button->wakeup_enabled = true;
}
} }
printk(KERN_INFO PREFIX "%s [%s]\n", name, acpi_device_bid(device)); printk(KERN_INFO PREFIX "%s [%s]\n", name, acpi_device_bid(device));
@ -453,7 +456,7 @@ static int acpi_button_remove(struct acpi_device *device, int type)
if (device->wakeup.flags.valid) { if (device->wakeup.flags.valid) {
acpi_disable_gpe(device->wakeup.gpe_device, acpi_disable_gpe(device->wakeup.gpe_device,
device->wakeup.gpe_number); device->wakeup.gpe_number);
device->wakeup.run_wake_count--; if (button->wakeup_enabled)
device_set_wakeup_enable(&device->dev, false); device_set_wakeup_enable(&device->dev, false);
} }

View file

@ -26,6 +26,7 @@ struct nvs_page {
unsigned int size; unsigned int size;
void *kaddr; void *kaddr;
void *data; void *data;
bool unmap;
struct list_head node; struct list_head node;
}; };
@ -44,6 +45,9 @@ int suspend_nvs_register(unsigned long start, unsigned long size)
{ {
struct nvs_page *entry, *next; struct nvs_page *entry, *next;
pr_info("PM: Registering ACPI NVS region at %lx (%ld bytes)\n",
start, size);
while (size > 0) { while (size > 0) {
unsigned int nr_bytes; unsigned int nr_bytes;
@ -81,7 +85,13 @@ void suspend_nvs_free(void)
free_page((unsigned long)entry->data); free_page((unsigned long)entry->data);
entry->data = NULL; entry->data = NULL;
if (entry->kaddr) { if (entry->kaddr) {
if (entry->unmap) {
iounmap(entry->kaddr); iounmap(entry->kaddr);
entry->unmap = false;
} else {
acpi_os_unmap_memory(entry->kaddr,
entry->size);
}
entry->kaddr = NULL; entry->kaddr = NULL;
} }
} }
@ -115,8 +125,14 @@ int suspend_nvs_save(void)
list_for_each_entry(entry, &nvs_list, node) list_for_each_entry(entry, &nvs_list, node)
if (entry->data) { if (entry->data) {
entry->kaddr = acpi_os_ioremap(entry->phys_start, unsigned long phys = entry->phys_start;
entry->size); unsigned int size = entry->size;
entry->kaddr = acpi_os_get_iomem(phys, size);
if (!entry->kaddr) {
entry->kaddr = acpi_os_ioremap(phys, size);
entry->unmap = !!entry->kaddr;
}
if (!entry->kaddr) { if (!entry->kaddr) {
suspend_nvs_free(); suspend_nvs_free();
return -ENOMEM; return -ENOMEM;

View file

@ -76,7 +76,6 @@ EXPORT_SYMBOL(acpi_in_debugger);
extern char line_buf[80]; extern char line_buf[80];
#endif /*ENABLE_DEBUGGER */ #endif /*ENABLE_DEBUGGER */
static unsigned int acpi_irq_irq;
static acpi_osd_handler acpi_irq_handler; static acpi_osd_handler acpi_irq_handler;
static void *acpi_irq_context; static void *acpi_irq_context;
static struct workqueue_struct *kacpid_wq; static struct workqueue_struct *kacpid_wq;
@ -105,11 +104,11 @@ struct acpi_ioremap {
void __iomem *virt; void __iomem *virt;
acpi_physical_address phys; acpi_physical_address phys;
acpi_size size; acpi_size size;
struct kref ref; unsigned long refcount;
}; };
static LIST_HEAD(acpi_ioremaps); static LIST_HEAD(acpi_ioremaps);
static DEFINE_SPINLOCK(acpi_ioremap_lock); static DEFINE_MUTEX(acpi_ioremap_lock);
static void __init acpi_osi_setup_late(void); static void __init acpi_osi_setup_late(void);
@ -285,6 +284,22 @@ acpi_map_vaddr_lookup(acpi_physical_address phys, unsigned int size)
return NULL; return NULL;
} }
void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size)
{
struct acpi_ioremap *map;
void __iomem *virt = NULL;
mutex_lock(&acpi_ioremap_lock);
map = acpi_map_lookup(phys, size);
if (map) {
virt = map->virt + (phys - map->phys);
map->refcount++;
}
mutex_unlock(&acpi_ioremap_lock);
return virt;
}
EXPORT_SYMBOL_GPL(acpi_os_get_iomem);
/* Must be called with 'acpi_ioremap_lock' or RCU read lock held. */ /* Must be called with 'acpi_ioremap_lock' or RCU read lock held. */
static struct acpi_ioremap * static struct acpi_ioremap *
acpi_map_lookup_virt(void __iomem *virt, acpi_size size) acpi_map_lookup_virt(void __iomem *virt, acpi_size size)
@ -302,8 +317,7 @@ acpi_map_lookup_virt(void __iomem *virt, acpi_size size)
void __iomem *__init_refok void __iomem *__init_refok
acpi_os_map_memory(acpi_physical_address phys, acpi_size size) acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
{ {
struct acpi_ioremap *map, *tmp_map; struct acpi_ioremap *map;
unsigned long flags;
void __iomem *virt; void __iomem *virt;
acpi_physical_address pg_off; acpi_physical_address pg_off;
acpi_size pg_sz; acpi_size pg_sz;
@ -316,14 +330,25 @@ acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
if (!acpi_gbl_permanent_mmap) if (!acpi_gbl_permanent_mmap)
return __acpi_map_table((unsigned long)phys, size); return __acpi_map_table((unsigned long)phys, size);
mutex_lock(&acpi_ioremap_lock);
/* Check if there's a suitable mapping already. */
map = acpi_map_lookup(phys, size);
if (map) {
map->refcount++;
goto out;
}
map = kzalloc(sizeof(*map), GFP_KERNEL); map = kzalloc(sizeof(*map), GFP_KERNEL);
if (!map) if (!map) {
mutex_unlock(&acpi_ioremap_lock);
return NULL; return NULL;
}
pg_off = round_down(phys, PAGE_SIZE); pg_off = round_down(phys, PAGE_SIZE);
pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off; pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off;
virt = acpi_os_ioremap(pg_off, pg_sz); virt = acpi_os_ioremap(pg_off, pg_sz);
if (!virt) { if (!virt) {
mutex_unlock(&acpi_ioremap_lock);
kfree(map); kfree(map);
return NULL; return NULL;
} }
@ -332,62 +357,51 @@ acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
map->virt = virt; map->virt = virt;
map->phys = pg_off; map->phys = pg_off;
map->size = pg_sz; map->size = pg_sz;
kref_init(&map->ref); map->refcount = 1;
spin_lock_irqsave(&acpi_ioremap_lock, flags);
/* Check if page has already been mapped. */
tmp_map = acpi_map_lookup(phys, size);
if (tmp_map) {
kref_get(&tmp_map->ref);
spin_unlock_irqrestore(&acpi_ioremap_lock, flags);
iounmap(map->virt);
kfree(map);
return tmp_map->virt + (phys - tmp_map->phys);
}
list_add_tail_rcu(&map->list, &acpi_ioremaps); list_add_tail_rcu(&map->list, &acpi_ioremaps);
spin_unlock_irqrestore(&acpi_ioremap_lock, flags);
out:
mutex_unlock(&acpi_ioremap_lock);
return map->virt + (phys - map->phys); return map->virt + (phys - map->phys);
} }
EXPORT_SYMBOL_GPL(acpi_os_map_memory); EXPORT_SYMBOL_GPL(acpi_os_map_memory);
static void acpi_kref_del_iomap(struct kref *ref) static void acpi_os_drop_map_ref(struct acpi_ioremap *map)
{ {
struct acpi_ioremap *map; if (!--map->refcount)
map = container_of(ref, struct acpi_ioremap, ref);
list_del_rcu(&map->list); list_del_rcu(&map->list);
} }
static void acpi_os_map_cleanup(struct acpi_ioremap *map)
{
if (!map->refcount) {
synchronize_rcu();
iounmap(map->virt);
kfree(map);
}
}
void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size) void __ref acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
{ {
struct acpi_ioremap *map; struct acpi_ioremap *map;
unsigned long flags;
int del;
if (!acpi_gbl_permanent_mmap) { if (!acpi_gbl_permanent_mmap) {
__acpi_unmap_table(virt, size); __acpi_unmap_table(virt, size);
return; return;
} }
spin_lock_irqsave(&acpi_ioremap_lock, flags); mutex_lock(&acpi_ioremap_lock);
map = acpi_map_lookup_virt(virt, size); map = acpi_map_lookup_virt(virt, size);
if (!map) { if (!map) {
spin_unlock_irqrestore(&acpi_ioremap_lock, flags); mutex_unlock(&acpi_ioremap_lock);
printk(KERN_ERR PREFIX "%s: bad address %p\n", __func__, virt); WARN(true, PREFIX "%s: bad address %p\n", __func__, virt);
dump_stack();
return; return;
} }
acpi_os_drop_map_ref(map);
mutex_unlock(&acpi_ioremap_lock);
del = kref_put(&map->ref, acpi_kref_del_iomap); acpi_os_map_cleanup(map);
spin_unlock_irqrestore(&acpi_ioremap_lock, flags);
if (!del)
return;
synchronize_rcu();
iounmap(map->virt);
kfree(map);
} }
EXPORT_SYMBOL_GPL(acpi_os_unmap_memory); EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
@ -397,7 +411,7 @@ void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
__acpi_unmap_table(virt, size); __acpi_unmap_table(virt, size);
} }
int acpi_os_map_generic_address(struct acpi_generic_address *addr) static int acpi_os_map_generic_address(struct acpi_generic_address *addr)
{ {
void __iomem *virt; void __iomem *virt;
@ -413,13 +427,10 @@ int acpi_os_map_generic_address(struct acpi_generic_address *addr)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(acpi_os_map_generic_address);
void acpi_os_unmap_generic_address(struct acpi_generic_address *addr) static void acpi_os_unmap_generic_address(struct acpi_generic_address *addr)
{ {
void __iomem *virt; struct acpi_ioremap *map;
unsigned long flags;
acpi_size size = addr->bit_width / 8;
if (addr->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) if (addr->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
return; return;
@ -427,13 +438,17 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *addr)
if (!addr->address || !addr->bit_width) if (!addr->address || !addr->bit_width)
return; return;
spin_lock_irqsave(&acpi_ioremap_lock, flags); mutex_lock(&acpi_ioremap_lock);
virt = acpi_map_vaddr_lookup(addr->address, size); map = acpi_map_lookup(addr->address, addr->bit_width / 8);
spin_unlock_irqrestore(&acpi_ioremap_lock, flags); if (!map) {
mutex_unlock(&acpi_ioremap_lock);
return;
}
acpi_os_drop_map_ref(map);
mutex_unlock(&acpi_ioremap_lock);
acpi_os_unmap_memory(virt, size); acpi_os_map_cleanup(map);
} }
EXPORT_SYMBOL_GPL(acpi_os_unmap_generic_address);
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
acpi_status acpi_status
@ -516,11 +531,15 @@ acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler,
acpi_irq_stats_init(); acpi_irq_stats_init();
/* /*
* Ignore the GSI from the core, and use the value in our copy of the * ACPI interrupts different from the SCI in our copy of the FADT are
* FADT. It may not be the same if an interrupt source override exists * not supported.
* for the SCI.
*/ */
gsi = acpi_gbl_FADT.sci_interrupt; if (gsi != acpi_gbl_FADT.sci_interrupt)
return AE_BAD_PARAMETER;
if (acpi_irq_handler)
return AE_ALREADY_ACQUIRED;
if (acpi_gsi_to_irq(gsi, &irq) < 0) { if (acpi_gsi_to_irq(gsi, &irq) < 0) {
printk(KERN_ERR PREFIX "SCI (ACPI GSI %d) not registered\n", printk(KERN_ERR PREFIX "SCI (ACPI GSI %d) not registered\n",
gsi); gsi);
@ -531,20 +550,20 @@ acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler,
acpi_irq_context = context; acpi_irq_context = context;
if (request_irq(irq, acpi_irq, IRQF_SHARED, "acpi", acpi_irq)) { if (request_irq(irq, acpi_irq, IRQF_SHARED, "acpi", acpi_irq)) {
printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq); printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq);
acpi_irq_handler = NULL;
return AE_NOT_ACQUIRED; return AE_NOT_ACQUIRED;
} }
acpi_irq_irq = irq;
return AE_OK; return AE_OK;
} }
acpi_status acpi_os_remove_interrupt_handler(u32 irq, acpi_osd_handler handler) acpi_status acpi_os_remove_interrupt_handler(u32 irq, acpi_osd_handler handler)
{ {
if (irq) { if (irq != acpi_gbl_FADT.sci_interrupt)
return AE_BAD_PARAMETER;
free_irq(irq, acpi_irq); free_irq(irq, acpi_irq);
acpi_irq_handler = NULL; acpi_irq_handler = NULL;
acpi_irq_irq = 0;
}
return AE_OK; return AE_OK;
} }
@ -1603,7 +1622,7 @@ acpi_status __init acpi_os_initialize1(void)
acpi_status acpi_os_terminate(void) acpi_status acpi_os_terminate(void)
{ {
if (acpi_irq_handler) { if (acpi_irq_handler) {
acpi_os_remove_interrupt_handler(acpi_irq_irq, acpi_os_remove_interrupt_handler(acpi_gbl_FADT.sci_interrupt,
acpi_irq_handler); acpi_irq_handler);
} }

View file

@ -797,7 +797,6 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device)
acpi_status status; acpi_status status;
acpi_event_status event_status; acpi_event_status event_status;
device->wakeup.run_wake_count = 0;
device->wakeup.flags.notifier_present = 0; device->wakeup.flags.notifier_present = 0;
/* Power button, Lid switch always enable wakeup */ /* Power button, Lid switch always enable wakeup */

View file

@ -199,8 +199,6 @@ static void acpi_pm_end(void)
#endif /* CONFIG_ACPI_SLEEP */ #endif /* CONFIG_ACPI_SLEEP */
#ifdef CONFIG_SUSPEND #ifdef CONFIG_SUSPEND
extern void do_suspend_lowlevel(void);
static u32 acpi_suspend_states[] = { static u32 acpi_suspend_states[] = {
[PM_SUSPEND_ON] = ACPI_STATE_S0, [PM_SUSPEND_ON] = ACPI_STATE_S0,
[PM_SUSPEND_STANDBY] = ACPI_STATE_S1, [PM_SUSPEND_STANDBY] = ACPI_STATE_S1,
@ -243,20 +241,11 @@ static int acpi_suspend_begin(suspend_state_t pm_state)
static int acpi_suspend_enter(suspend_state_t pm_state) static int acpi_suspend_enter(suspend_state_t pm_state)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long flags = 0;
u32 acpi_state = acpi_target_sleep_state; u32 acpi_state = acpi_target_sleep_state;
int error;
ACPI_FLUSH_CPU_CACHE(); ACPI_FLUSH_CPU_CACHE();
/* Do arch specific saving of state. */
if (acpi_state == ACPI_STATE_S3) {
int error = acpi_save_state_mem();
if (error)
return error;
}
local_irq_save(flags);
switch (acpi_state) { switch (acpi_state) {
case ACPI_STATE_S1: case ACPI_STATE_S1:
barrier(); barrier();
@ -264,7 +253,10 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
break; break;
case ACPI_STATE_S3: case ACPI_STATE_S3:
do_suspend_lowlevel(); error = acpi_suspend_lowlevel();
if (error)
return error;
pr_info(PREFIX "Low-level resume complete\n");
break; break;
} }
@ -290,13 +282,6 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
/* Allow EC transactions to happen. */ /* Allow EC transactions to happen. */
acpi_ec_unblock_transactions_early(); acpi_ec_unblock_transactions_early();
local_irq_restore(flags);
printk(KERN_DEBUG "Back to C!\n");
/* restore processor state */
if (acpi_state == ACPI_STATE_S3)
acpi_restore_state_mem();
suspend_nvs_restore(); suspend_nvs_restore();
return ACPI_SUCCESS(status) ? 0 : -EFAULT; return ACPI_SUCCESS(status) ? 0 : -EFAULT;
@ -472,16 +457,13 @@ static int acpi_hibernation_begin(void)
static int acpi_hibernation_enter(void) static int acpi_hibernation_enter(void)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
unsigned long flags = 0;
ACPI_FLUSH_CPU_CACHE(); ACPI_FLUSH_CPU_CACHE();
local_irq_save(flags);
/* This shouldn't return. If it returns, we have a problem */ /* This shouldn't return. If it returns, we have a problem */
status = acpi_enter_sleep_state(ACPI_STATE_S4); status = acpi_enter_sleep_state(ACPI_STATE_S4);
/* Reprogram control registers and execute _BFS */ /* Reprogram control registers and execute _BFS */
acpi_leave_sleep_state_prep(ACPI_STATE_S4); acpi_leave_sleep_state_prep(ACPI_STATE_S4);
local_irq_restore(flags);
return ACPI_SUCCESS(status) ? 0 : -EFAULT; return ACPI_SUCCESS(status) ? 0 : -EFAULT;
} }

View file

@ -293,19 +293,11 @@ static int acpi_dev_run_wake(struct device *phys_dev, bool enable)
} }
if (enable) { if (enable) {
if (!dev->wakeup.run_wake_count++) {
acpi_enable_wakeup_device_power(dev, ACPI_STATE_S0); acpi_enable_wakeup_device_power(dev, ACPI_STATE_S0);
acpi_enable_gpe(dev->wakeup.gpe_device, acpi_enable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number);
dev->wakeup.gpe_number);
}
} else if (dev->wakeup.run_wake_count > 0) {
if (!--dev->wakeup.run_wake_count) {
acpi_disable_gpe(dev->wakeup.gpe_device,
dev->wakeup.gpe_number);
acpi_disable_wakeup_device_power(dev);
}
} else { } else {
error = -EALREADY; acpi_disable_gpe(dev->wakeup.gpe_device, dev->wakeup.gpe_number);
acpi_disable_wakeup_device_power(dev);
} }
return error; return error;

View file

@ -250,7 +250,6 @@ struct acpi_device_wakeup {
struct acpi_handle_list resources; struct acpi_handle_list resources;
struct acpi_device_wakeup_flags flags; struct acpi_device_wakeup_flags flags;
int prepare_count; int prepare_count;
int run_wake_count;
}; };
/* Device */ /* Device */

View file

@ -10,7 +10,6 @@ static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,
return ioremap_cache(phys, size); return ioremap_cache(phys, size);
} }
int acpi_os_map_generic_address(struct acpi_generic_address *addr); void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size);
void acpi_os_unmap_generic_address(struct acpi_generic_address *addr);
#endif #endif