[ACPI] merge 3549 4320 4485 4588 4980 5483 5651 acpica asus fops pnpacpi branches into release

Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
198 changed files with 8035 additions and 8372 deletions

View File

@@ -60,20 +60,20 @@ ACPI_MODULE_NAME("acpi_ec")
#define ACPI_EC_BURST_ENABLE 0x82
#define ACPI_EC_BURST_DISABLE 0x83
#define ACPI_EC_COMMAND_QUERY 0x84
#define EC_POLLING 0xFF
#define EC_BURST 0x00
#define EC_POLL 0xFF
#define EC_INTR 0x00
static int acpi_ec_remove(struct acpi_device *device, int type);
static int acpi_ec_start(struct acpi_device *device);
static int acpi_ec_stop(struct acpi_device *device, int type);
static int acpi_ec_burst_add(struct acpi_device *device);
static int acpi_ec_polling_add(struct acpi_device *device);
static int acpi_ec_intr_add(struct acpi_device *device);
static int acpi_ec_poll_add(struct acpi_device *device);
static struct acpi_driver acpi_ec_driver = {
.name = ACPI_EC_DRIVER_NAME,
.class = ACPI_EC_CLASS,
.ids = ACPI_EC_HID,
.ops = {
.add = acpi_ec_polling_add,
.add = acpi_ec_intr_add,
.remove = acpi_ec_remove,
.start = acpi_ec_start,
.stop = acpi_ec_stop,
@@ -105,7 +105,7 @@ union acpi_ec {
atomic_t pending_gpe;
struct semaphore sem;
wait_queue_head_t wait;
} burst;
} intr;
struct {
u32 mode;
@@ -117,37 +117,37 @@ union acpi_ec {
struct acpi_generic_address data_addr;
unsigned long global_lock;
spinlock_t lock;
} polling;
} poll;
};
static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event);
static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event);
static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data);
static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data);
static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data);
static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data);
static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data);
static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data);
static void acpi_ec_gpe_polling_query(void *ec_cxt);
static void acpi_ec_gpe_burst_query(void *ec_cxt);
static u32 acpi_ec_gpe_polling_handler(void *data);
static u32 acpi_ec_gpe_burst_handler(void *data);
static int acpi_ec_poll_wait(union acpi_ec *ec, u8 event);
static int acpi_ec_intr_wait(union acpi_ec *ec, unsigned int event);
static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data);
static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data);
static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data);
static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data);
static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data);
static int acpi_ec_intr_query(union acpi_ec *ec, u32 * data);
static void acpi_ec_gpe_poll_query(void *ec_cxt);
static void acpi_ec_gpe_intr_query(void *ec_cxt);
static u32 acpi_ec_gpe_poll_handler(void *data);
static u32 acpi_ec_gpe_intr_handler(void *data);
static acpi_status __init
acpi_fake_ecdt_polling_callback(acpi_handle handle,
acpi_fake_ecdt_poll_callback(acpi_handle handle,
u32 Level, void *context, void **retval);
static acpi_status __init
acpi_fake_ecdt_burst_callback(acpi_handle handle,
acpi_fake_ecdt_intr_callback(acpi_handle handle,
u32 Level, void *context, void **retval);
static int __init acpi_ec_polling_get_real_ecdt(void);
static int __init acpi_ec_burst_get_real_ecdt(void);
static int __init acpi_ec_poll_get_real_ecdt(void);
static int __init acpi_ec_intr_get_real_ecdt(void);
/* If we find an EC via the ECDT, we need to keep a ptr to its context */
static union acpi_ec *ec_ecdt;
/* External interfaces use first EC only, so remember */
static struct acpi_device *first_ec;
static int acpi_ec_polling_mode = EC_POLLING;
static int acpi_ec_poll_mode = EC_INTR;
/* --------------------------------------------------------------------------
Transaction Management
@@ -163,13 +163,13 @@ static u32 acpi_ec_read_status(union acpi_ec *ec)
static int acpi_ec_wait(union acpi_ec *ec, u8 event)
{
if (acpi_ec_polling_mode)
return acpi_ec_polling_wait(ec, event);
if (acpi_ec_poll_mode)
return acpi_ec_poll_wait(ec, event);
else
return acpi_ec_burst_wait(ec, event);
return acpi_ec_intr_wait(ec, event);
}
static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event)
static int acpi_ec_poll_wait(union acpi_ec *ec, u8 event)
{
u32 acpi_ec_status = 0;
u32 i = ACPI_EC_UDELAY_COUNT;
@@ -203,36 +203,31 @@ static int acpi_ec_polling_wait(union acpi_ec *ec, u8 event)
return -ETIME;
}
static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event)
static int acpi_ec_intr_wait(union acpi_ec *ec, unsigned int event)
{
int result = 0;
ACPI_FUNCTION_TRACE("acpi_ec_wait");
ec->burst.expect_event = event;
ec->intr.expect_event = event;
smp_mb();
switch (event) {
case ACPI_EC_EVENT_OBF:
if (acpi_ec_read_status(ec) & event) {
ec->burst.expect_event = 0;
case ACPI_EC_EVENT_IBE:
if (~acpi_ec_read_status(ec) & event) {
ec->intr.expect_event = 0;
return_VALUE(0);
}
break;
case ACPI_EC_EVENT_IBE:
if (~acpi_ec_read_status(ec) & event) {
ec->burst.expect_event = 0;
return_VALUE(0);
}
default:
break;
}
result = wait_event_timeout(ec->burst.wait,
!ec->burst.expect_event,
result = wait_event_timeout(ec->intr.wait,
!ec->intr.expect_event,
msecs_to_jiffies(ACPI_EC_DELAY));
ec->burst.expect_event = 0;
ec->intr.expect_event = 0;
smp_mb();
/*
@@ -255,7 +250,12 @@ static int acpi_ec_burst_wait(union acpi_ec *ec, unsigned int event)
return_VALUE(-ETIME);
}
static int acpi_ec_enter_burst_mode(union acpi_ec *ec)
#ifdef ACPI_FUTURE_USAGE
/*
* Note: samsung nv5000 doesn't work with ec burst mode.
* http://bugzilla.kernel.org/show_bug.cgi?id=4980
*/
int acpi_ec_enter_burst_mode(union acpi_ec *ec)
{
u32 tmp = 0;
int status = 0;
@@ -270,45 +270,56 @@ static int acpi_ec_enter_burst_mode(union acpi_ec *ec)
acpi_hw_low_level_write(8, ACPI_EC_BURST_ENABLE,
&ec->common.command_addr);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
if (status)
return_VALUE(-EINVAL);
acpi_hw_low_level_read(8, &tmp, &ec->common.data_addr);
if (tmp != 0x90) { /* Burst ACK byte */
return_VALUE(-EINVAL);
}
}
atomic_set(&ec->burst.leaving_burst, 0);
atomic_set(&ec->intr.leaving_burst, 0);
return_VALUE(0);
end:
printk("Error in acpi_ec_wait\n");
printk(KERN_WARNING PREFIX "Error in acpi_ec_wait\n");
return_VALUE(-1);
}
static int acpi_ec_leave_burst_mode(union acpi_ec *ec)
int acpi_ec_leave_burst_mode(union acpi_ec *ec)
{
int status = 0;
ACPI_FUNCTION_TRACE("acpi_ec_leave_burst_mode");
atomic_set(&ec->burst.leaving_burst, 1);
status = acpi_ec_read_status(ec);
if (status != -EINVAL && (status & ACPI_EC_FLAG_BURST)){
status = acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
if(status)
goto end;
acpi_hw_low_level_write(8, ACPI_EC_BURST_DISABLE, &ec->common.command_addr);
acpi_ec_wait(ec, ACPI_EC_FLAG_IBF);
}
atomic_set(&ec->intr.leaving_burst, 1);
return_VALUE(0);
end:
printk(KERN_WARNING PREFIX "leave burst_mode:error\n");
return_VALUE(-1);
}
#endif /* ACPI_FUTURE_USAGE */
static int acpi_ec_read(union acpi_ec *ec, u8 address, u32 * data)
{
if (acpi_ec_polling_mode)
return acpi_ec_polling_read(ec, address, data);
if (acpi_ec_poll_mode)
return acpi_ec_poll_read(ec, address, data);
else
return acpi_ec_burst_read(ec, address, data);
return acpi_ec_intr_read(ec, address, data);
}
static int acpi_ec_write(union acpi_ec *ec, u8 address, u8 data)
{
if (acpi_ec_polling_mode)
return acpi_ec_polling_write(ec, address, data);
if (acpi_ec_poll_mode)
return acpi_ec_poll_write(ec, address, data);
else
return acpi_ec_burst_write(ec, address, data);
return acpi_ec_intr_write(ec, address, data);
}
static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
static int acpi_ec_poll_read(union acpi_ec *ec, u8 address, u32 * data)
{
acpi_status status = AE_OK;
int result = 0;
@@ -328,7 +339,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
return_VALUE(-ENODEV);
}
spin_lock_irqsave(&ec->polling.lock, flags);
spin_lock_irqsave(&ec->poll.lock, flags);
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
&ec->common.command_addr);
@@ -347,7 +358,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
*data, address));
end:
spin_unlock_irqrestore(&ec->polling.lock, flags);
spin_unlock_irqrestore(&ec->poll.lock, flags);
if (ec->common.global_lock)
acpi_release_global_lock(glk);
@@ -355,7 +366,7 @@ static int acpi_ec_polling_read(union acpi_ec *ec, u8 address, u32 * data)
return_VALUE(result);
}
static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
static int acpi_ec_poll_write(union acpi_ec *ec, u8 address, u8 data)
{
int result = 0;
acpi_status status = AE_OK;
@@ -373,7 +384,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
return_VALUE(-ENODEV);
}
spin_lock_irqsave(&ec->polling.lock, flags);
spin_lock_irqsave(&ec->poll.lock, flags);
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
&ec->common.command_addr);
@@ -395,7 +406,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
data, address));
end:
spin_unlock_irqrestore(&ec->polling.lock, flags);
spin_unlock_irqrestore(&ec->poll.lock, flags);
if (ec->common.global_lock)
acpi_release_global_lock(glk);
@@ -403,7 +414,7 @@ static int acpi_ec_polling_write(union acpi_ec *ec, u8 address, u8 data)
return_VALUE(result);
}
static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data)
{
int status = 0;
u32 glk;
@@ -422,25 +433,24 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
}
WARN_ON(in_interrupt());
down(&ec->burst.sem);
down(&ec->intr.sem);
acpi_ec_enter_burst_mode(ec);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (status) {
printk("read EC, IB not empty\n");
printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
goto end;
}
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
&ec->common.command_addr);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (status) {
printk("read EC, IB not empty\n");
printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
}
acpi_hw_low_level_write(8, address, &ec->common.data_addr);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
if (status) {
printk("read EC, OB not full\n");
printk(KERN_DEBUG PREFIX "read EC, OB not full\n");
goto end;
}
acpi_hw_low_level_read(8, data, &ec->common.data_addr);
@@ -448,8 +458,7 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
*data, address));
end:
acpi_ec_leave_burst_mode(ec);
up(&ec->burst.sem);
up(&ec->intr.sem);
if (ec->common.global_lock)
acpi_release_global_lock(glk);
@@ -457,7 +466,7 @@ static int acpi_ec_burst_read(union acpi_ec *ec, u8 address, u32 * data)
return_VALUE(status);
}
static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data)
{
int status = 0;
u32 glk;
@@ -474,25 +483,23 @@ static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
}
WARN_ON(in_interrupt());
down(&ec->burst.sem);
acpi_ec_enter_burst_mode(ec);
down(&ec->intr.sem);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (status) {
printk("write EC, IB not empty\n");
printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
}
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
&ec->common.command_addr);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (status) {
printk("write EC, IB not empty\n");
printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
}
acpi_hw_low_level_write(8, address, &ec->common.data_addr);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (status) {
printk("write EC, IB not empty\n");
printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
}
acpi_hw_low_level_write(8, data, &ec->common.data_addr);
@@ -500,8 +507,7 @@ static int acpi_ec_burst_write(union acpi_ec *ec, u8 address, u8 data)
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
data, address));
acpi_ec_leave_burst_mode(ec);
up(&ec->burst.sem);
up(&ec->intr.sem);
if (ec->common.global_lock)
acpi_release_global_lock(glk);
@@ -553,12 +559,12 @@ EXPORT_SYMBOL(ec_write);
static int acpi_ec_query(union acpi_ec *ec, u32 * data)
{
if (acpi_ec_polling_mode)
return acpi_ec_polling_query(ec, data);
if (acpi_ec_poll_mode)
return acpi_ec_poll_query(ec, data);
else
return acpi_ec_burst_query(ec, data);
return acpi_ec_intr_query(ec, data);
}
static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
static int acpi_ec_poll_query(union acpi_ec *ec, u32 * data)
{
int result = 0;
acpi_status status = AE_OK;
@@ -583,7 +589,7 @@ static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
* Note that successful completion of the query causes the ACPI_EC_SCI
* bit to be cleared (and thus clearing the interrupt source).
*/
spin_lock_irqsave(&ec->polling.lock, flags);
spin_lock_irqsave(&ec->poll.lock, flags);
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY,
&ec->common.command_addr);
@@ -596,14 +602,14 @@ static int acpi_ec_polling_query(union acpi_ec *ec, u32 * data)
result = -ENODATA;
end:
spin_unlock_irqrestore(&ec->polling.lock, flags);
spin_unlock_irqrestore(&ec->poll.lock, flags);
if (ec->common.global_lock)
acpi_release_global_lock(glk);
return_VALUE(result);
}
static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
static int acpi_ec_intr_query(union acpi_ec *ec, u32 * data)
{
int status = 0;
u32 glk;
@@ -620,11 +626,11 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
return_VALUE(-ENODEV);
}
down(&ec->burst.sem);
down(&ec->intr.sem);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (status) {
printk("query EC, IB not empty\n");
printk(KERN_DEBUG PREFIX "query EC, IB not empty\n");
goto end;
}
/*
@@ -636,7 +642,7 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
&ec->common.command_addr);
status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
if (status) {
printk("query EC, OB not full\n");
printk(KERN_DEBUG PREFIX "query EC, OB not full\n");
goto end;
}
@@ -645,7 +651,7 @@ static int acpi_ec_burst_query(union acpi_ec *ec, u32 * data)
status = -ENODATA;
end:
up(&ec->burst.sem);
up(&ec->intr.sem);
if (ec->common.global_lock)
acpi_release_global_lock(glk);
@@ -664,13 +670,13 @@ union acpi_ec_query_data {
static void acpi_ec_gpe_query(void *ec_cxt)
{
if (acpi_ec_polling_mode)
acpi_ec_gpe_polling_query(ec_cxt);
if (acpi_ec_poll_mode)
acpi_ec_gpe_poll_query(ec_cxt);
else
acpi_ec_gpe_burst_query(ec_cxt);
acpi_ec_gpe_intr_query(ec_cxt);
}
static void acpi_ec_gpe_polling_query(void *ec_cxt)
static void acpi_ec_gpe_poll_query(void *ec_cxt)
{
union acpi_ec *ec = (union acpi_ec *)ec_cxt;
u32 value = 0;
@@ -685,9 +691,9 @@ static void acpi_ec_gpe_polling_query(void *ec_cxt)
if (!ec_cxt)
goto end;
spin_lock_irqsave(&ec->polling.lock, flags);
spin_lock_irqsave(&ec->poll.lock, flags);
acpi_hw_low_level_read(8, &value, &ec->common.command_addr);
spin_unlock_irqrestore(&ec->polling.lock, flags);
spin_unlock_irqrestore(&ec->poll.lock, flags);
/* TBD: Implement asynch events!
* NOTE: All we care about are EC-SCI's. Other EC events are
@@ -711,7 +717,7 @@ static void acpi_ec_gpe_polling_query(void *ec_cxt)
end:
acpi_enable_gpe(NULL, ec->common.gpe_bit, ACPI_NOT_ISR);
}
static void acpi_ec_gpe_burst_query(void *ec_cxt)
static void acpi_ec_gpe_intr_query(void *ec_cxt)
{
union acpi_ec *ec = (union acpi_ec *)ec_cxt;
u32 value;
@@ -736,18 +742,18 @@ static void acpi_ec_gpe_burst_query(void *ec_cxt)
acpi_evaluate_object(ec->common.handle, object_name, NULL, NULL);
end:
atomic_dec(&ec->burst.pending_gpe);
atomic_dec(&ec->intr.pending_gpe);
return;
}
static u32 acpi_ec_gpe_handler(void *data)
{
if (acpi_ec_polling_mode)
return acpi_ec_gpe_polling_handler(data);
if (acpi_ec_poll_mode)
return acpi_ec_gpe_poll_handler(data);
else
return acpi_ec_gpe_burst_handler(data);
return acpi_ec_gpe_intr_handler(data);
}
static u32 acpi_ec_gpe_polling_handler(void *data)
static u32 acpi_ec_gpe_poll_handler(void *data)
{
acpi_status status = AE_OK;
union acpi_ec *ec = (union acpi_ec *)data;
@@ -765,7 +771,7 @@ static u32 acpi_ec_gpe_polling_handler(void *data)
else
return ACPI_INTERRUPT_NOT_HANDLED;
}
static u32 acpi_ec_gpe_burst_handler(void *data)
static u32 acpi_ec_gpe_intr_handler(void *data)
{
acpi_status status = AE_OK;
u32 value;
@@ -777,22 +783,22 @@ static u32 acpi_ec_gpe_burst_handler(void *data)
acpi_clear_gpe(NULL, ec->common.gpe_bit, ACPI_ISR);
value = acpi_ec_read_status(ec);
switch (ec->burst.expect_event) {
switch (ec->intr.expect_event) {
case ACPI_EC_EVENT_OBF:
if (!(value & ACPI_EC_FLAG_OBF))
break;
case ACPI_EC_EVENT_IBE:
if ((value & ACPI_EC_FLAG_IBF))
break;
ec->burst.expect_event = 0;
wake_up(&ec->burst.wait);
ec->intr.expect_event = 0;
wake_up(&ec->intr.wait);
return ACPI_INTERRUPT_HANDLED;
default:
break;
}
if (value & ACPI_EC_FLAG_SCI) {
atomic_add(1, &ec->burst.pending_gpe);
atomic_add(1, &ec->intr.pending_gpe);
status = acpi_os_queue_for_execution(OSD_PRIORITY_GPE,
acpi_ec_gpe_query, ec);
return status == AE_OK ?
@@ -980,7 +986,7 @@ static int acpi_ec_remove_fs(struct acpi_device *device)
Driver Interface
-------------------------------------------------------------------------- */
static int acpi_ec_polling_add(struct acpi_device *device)
static int acpi_ec_poll_add(struct acpi_device *device)
{
int result = 0;
acpi_status status = AE_OK;
@@ -999,7 +1005,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
ec->common.handle = device->handle;
ec->common.uid = -1;
spin_lock_init(&ec->polling.lock);
spin_lock_init(&ec->poll.lock);
strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_EC_CLASS);
acpi_driver_data(device) = ec;
@@ -1038,7 +1044,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
if (result)
goto end;
printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
printk(KERN_INFO PREFIX "%s [%s] (gpe %d) polling mode.\n",
acpi_device_name(device), acpi_device_bid(device),
(u32) ec->common.gpe_bit);
@@ -1051,7 +1057,7 @@ static int acpi_ec_polling_add(struct acpi_device *device)
return_VALUE(result);
}
static int acpi_ec_burst_add(struct acpi_device *device)
static int acpi_ec_intr_add(struct acpi_device *device)
{
int result = 0;
acpi_status status = AE_OK;
@@ -1070,10 +1076,10 @@ static int acpi_ec_burst_add(struct acpi_device *device)
ec->common.handle = device->handle;
ec->common.uid = -1;
atomic_set(&ec->burst.pending_gpe, 0);
atomic_set(&ec->burst.leaving_burst, 1);
init_MUTEX(&ec->burst.sem);
init_waitqueue_head(&ec->burst.wait);
atomic_set(&ec->intr.pending_gpe, 0);
atomic_set(&ec->intr.leaving_burst, 1);
init_MUTEX(&ec->intr.sem);
init_waitqueue_head(&ec->intr.wait);
strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_EC_CLASS);
acpi_driver_data(device) = ec;
@@ -1112,8 +1118,7 @@ static int acpi_ec_burst_add(struct acpi_device *device)
if (result)
goto end;
printk("burst-mode-ec-10-Aug\n");
printk(KERN_INFO PREFIX "%s [%s] (gpe %d)\n",
printk(KERN_INFO PREFIX "%s [%s] (gpe %d) interrupt mode.\n",
acpi_device_name(device), acpi_device_bid(device),
(u32) ec->common.gpe_bit);
@@ -1151,7 +1156,7 @@ acpi_ec_io_ports(struct acpi_resource *resource, void *context)
union acpi_ec *ec = (union acpi_ec *)context;
struct acpi_generic_address *addr;
if (resource->id != ACPI_RSTYPE_IO) {
if (resource->type != ACPI_RESOURCE_TYPE_IO) {
return AE_OK;
}
@@ -1171,7 +1176,7 @@ acpi_ec_io_ports(struct acpi_resource *resource, void *context)
addr->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO;
addr->register_bit_width = 8;
addr->register_bit_offset = 0;
addr->address = resource->data.io.min_base_address;
addr->address = resource->data.io.minimum;
return AE_OK;
}
@@ -1267,16 +1272,16 @@ acpi_fake_ecdt_callback(acpi_handle handle,
u32 Level, void *context, void **retval)
{
if (acpi_ec_polling_mode)
return acpi_fake_ecdt_polling_callback(handle,
if (acpi_ec_poll_mode)
return acpi_fake_ecdt_poll_callback(handle,
Level, context, retval);
else
return acpi_fake_ecdt_burst_callback(handle,
return acpi_fake_ecdt_intr_callback(handle,
Level, context, retval);
}
static acpi_status __init
acpi_fake_ecdt_polling_callback(acpi_handle handle,
acpi_fake_ecdt_poll_callback(acpi_handle handle,
u32 Level, void *context, void **retval)
{
acpi_status status;
@@ -1295,7 +1300,7 @@ acpi_fake_ecdt_polling_callback(acpi_handle handle,
&ec_ecdt->common.gpe_bit);
if (ACPI_FAILURE(status))
return status;
spin_lock_init(&ec_ecdt->polling.lock);
spin_lock_init(&ec_ecdt->poll.lock);
ec_ecdt->common.global_lock = TRUE;
ec_ecdt->common.handle = handle;
@@ -1308,13 +1313,13 @@ acpi_fake_ecdt_polling_callback(acpi_handle handle,
}
static acpi_status __init
acpi_fake_ecdt_burst_callback(acpi_handle handle,
acpi_fake_ecdt_intr_callback(acpi_handle handle,
u32 Level, void *context, void **retval)
{
acpi_status status;
init_MUTEX(&ec_ecdt->burst.sem);
init_waitqueue_head(&ec_ecdt->burst.wait);
init_MUTEX(&ec_ecdt->intr.sem);
init_waitqueue_head(&ec_ecdt->intr.wait);
status = acpi_walk_resources(handle, METHOD_NAME__CRS,
acpi_ec_io_ports, ec_ecdt);
if (ACPI_FAILURE(status))
@@ -1380,13 +1385,13 @@ static int __init acpi_ec_fake_ecdt(void)
static int __init acpi_ec_get_real_ecdt(void)
{
if (acpi_ec_polling_mode)
return acpi_ec_polling_get_real_ecdt();
if (acpi_ec_poll_mode)
return acpi_ec_poll_get_real_ecdt();
else
return acpi_ec_burst_get_real_ecdt();
return acpi_ec_intr_get_real_ecdt();
}
static int __init acpi_ec_polling_get_real_ecdt(void)
static int __init acpi_ec_poll_get_real_ecdt(void)
{
acpi_status status;
struct acpi_table_ecdt *ecdt_ptr;
@@ -1411,7 +1416,7 @@ static int __init acpi_ec_polling_get_real_ecdt(void)
ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit;
spin_lock_init(&ec_ecdt->polling.lock);
spin_lock_init(&ec_ecdt->poll.lock);
/* use the GL just to be safe */
ec_ecdt->common.global_lock = TRUE;
ec_ecdt->common.uid = ecdt_ptr->uid;
@@ -1431,7 +1436,7 @@ static int __init acpi_ec_polling_get_real_ecdt(void)
return -ENODEV;
}
static int __init acpi_ec_burst_get_real_ecdt(void)
static int __init acpi_ec_intr_get_real_ecdt(void)
{
acpi_status status;
struct acpi_table_ecdt *ecdt_ptr;
@@ -1452,8 +1457,8 @@ static int __init acpi_ec_burst_get_real_ecdt(void)
return -ENOMEM;
memset(ec_ecdt, 0, sizeof(union acpi_ec));
init_MUTEX(&ec_ecdt->burst.sem);
init_waitqueue_head(&ec_ecdt->burst.wait);
init_MUTEX(&ec_ecdt->intr.sem);
init_waitqueue_head(&ec_ecdt->intr.wait);
ec_ecdt->common.command_addr = ecdt_ptr->ec_control;
ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
@@ -1571,22 +1576,22 @@ static int __init acpi_fake_ecdt_setup(char *str)
}
__setup("acpi_fake_ecdt", acpi_fake_ecdt_setup);
static int __init acpi_ec_set_polling_mode(char *str)
static int __init acpi_ec_set_intr_mode(char *str)
{
int burst;
int intr;
if (!get_option(&str, &burst))
if (!get_option(&str, &intr))
return 0;
if (burst) {
acpi_ec_polling_mode = EC_BURST;
acpi_ec_driver.ops.add = acpi_ec_burst_add;
if (intr) {
acpi_ec_poll_mode = EC_INTR;
acpi_ec_driver.ops.add = acpi_ec_intr_add;
} else {
acpi_ec_polling_mode = EC_POLLING;
acpi_ec_driver.ops.add = acpi_ec_polling_add;
acpi_ec_poll_mode = EC_POLL;
acpi_ec_driver.ops.add = acpi_ec_poll_add;
}
printk(KERN_INFO PREFIX "EC %s mode.\n", burst ? "burst" : "polling");
printk(KERN_INFO PREFIX "EC %s mode.\n", intr ? "interrupt" : "polling");
return 0;
}
__setup("ec_burst=", acpi_ec_set_polling_mode);
__setup("ec_intr=", acpi_ec_set_intr_mode);