Commit 772c0cf1 authored by Andy Grover's avatar Andy Grover

ACPI: Add ec_read and ec_write external functions

  Other ec.c cleanups, too
parent f6321f7d
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/acpi.h>
#include "include/acpi.h" #include "include/acpi.h"
#include "acpi_bus.h" #include "acpi_bus.h"
...@@ -141,3 +142,11 @@ EXPORT_SYMBOL(acpi_pci_irq_enable); ...@@ -141,3 +142,11 @@ EXPORT_SYMBOL(acpi_pci_irq_enable);
extern int acpi_pci_irq_lookup (int segment, int bus, int device, int pin); extern int acpi_pci_irq_lookup (int segment, int bus, int device, int pin);
EXPORT_SYMBOL(acpi_pci_irq_lookup); EXPORT_SYMBOL(acpi_pci_irq_lookup);
#endif /*CONFIG_ACPI_PCI */ #endif /*CONFIG_ACPI_PCI */
#ifdef CONFIG_ACPI_EC
/* ACPI EC driver (ec.c) */
EXPORT_SYMBOL(ec_read);
EXPORT_SYMBOL(ec_write);
#endif
...@@ -92,6 +92,9 @@ struct acpi_ec { ...@@ -92,6 +92,9 @@ struct acpi_ec {
/* If we find an EC via the ECDT, we need to keep a ptr to its context */ /* If we find an EC via the ECDT, we need to keep a ptr to its context */
static struct acpi_ec *ec_ecdt; static struct acpi_ec *ec_ecdt;
/* External interfaces use first EC only, so remember */
static struct acpi_device *first_ec;
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
Transaction Management Transaction Management
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
...@@ -236,6 +239,47 @@ acpi_ec_write ( ...@@ -236,6 +239,47 @@ acpi_ec_write (
return_VALUE(result); return_VALUE(result);
} }
/*
* Externally callable EC access functions. For now, assume 1 EC only
*/
int
ec_read(u8 addr, u8 *val)
{
struct acpi_ec *ec;
int err;
u32 temp_data;
if (!first_ec)
return -ENODEV;
ec = acpi_driver_data(first_ec);
err = acpi_ec_read(ec, addr, &temp_data);
if (!err) {
*val = temp_data;
return 0;
}
else
return err;
}
int
ec_write(u8 addr, u8 val)
{
struct acpi_ec *ec;
int err;
if (!first_ec)
return -ENODEV;
ec = acpi_driver_data(first_ec);
err = acpi_ec_write(ec, addr, val);
return err;
}
static int static int
acpi_ec_query ( acpi_ec_query (
...@@ -540,11 +584,15 @@ acpi_ec_add ( ...@@ -540,11 +584,15 @@ acpi_ec_add (
acpi_evaluate_integer(ec->handle, "_GLK", NULL, &ec->global_lock); acpi_evaluate_integer(ec->handle, "_GLK", NULL, &ec->global_lock);
/* If our UID matches the UID for the ECDT-enumerated EC, /* If our UID matches the UID for the ECDT-enumerated EC,
we already found this EC, so abort. */ we now have the *real* EC info, so kill the makeshift one.*/
acpi_evaluate_integer(ec->handle, "_UID", NULL, &uid); acpi_evaluate_integer(ec->handle, "_UID", NULL, &uid);
if (ec_ecdt && ec_ecdt->uid == uid) { if (ec_ecdt && ec_ecdt->uid == uid) {
result = -ENODEV; acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
goto end; ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
acpi_remove_gpe_handler(ec_ecdt->gpe_bit, &acpi_ec_gpe_handler);
kfree(ec_ecdt);
} }
/* Get GPE bit assignment (EC events). */ /* Get GPE bit assignment (EC events). */
...@@ -564,6 +612,9 @@ acpi_ec_add ( ...@@ -564,6 +612,9 @@ acpi_ec_add (
acpi_device_name(device), acpi_device_bid(device), acpi_device_name(device), acpi_device_bid(device),
(u32) ec->gpe_bit); (u32) ec->gpe_bit);
if (!first_ec)
first_ec = device;
end: end:
if (result) if (result)
kfree(ec); kfree(ec);
...@@ -584,7 +635,7 @@ acpi_ec_remove ( ...@@ -584,7 +635,7 @@ acpi_ec_remove (
if (!device) if (!device)
return_VALUE(-EINVAL); return_VALUE(-EINVAL);
ec = (struct acpi_ec *) acpi_driver_data(device); ec = acpi_driver_data(device);
acpi_ec_remove_fs(device); acpi_ec_remove_fs(device);
...@@ -609,7 +660,7 @@ acpi_ec_start ( ...@@ -609,7 +660,7 @@ acpi_ec_start (
if (!device) if (!device)
return_VALUE(-EINVAL); return_VALUE(-EINVAL);
ec = (struct acpi_ec *) acpi_driver_data(device); ec = acpi_driver_data(device);
if (!ec) if (!ec)
return_VALUE(-EINVAL); return_VALUE(-EINVAL);
...@@ -688,7 +739,7 @@ acpi_ec_stop ( ...@@ -688,7 +739,7 @@ acpi_ec_stop (
if (!device) if (!device)
return_VALUE(-EINVAL); return_VALUE(-EINVAL);
ec = (struct acpi_ec *) acpi_driver_data(device); ec = acpi_driver_data(device);
status = acpi_remove_address_space_handler(ec->handle, status = acpi_remove_address_space_handler(ec->handle,
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler); ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
...@@ -711,50 +762,50 @@ acpi_ec_ecdt_probe (void) ...@@ -711,50 +762,50 @@ acpi_ec_ecdt_probe (void)
status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING, status = acpi_get_firmware_table("ECDT", 1, ACPI_LOGICAL_ADDRESSING,
(acpi_table_header **) &ecdt_ptr); (acpi_table_header **) &ecdt_ptr);
if (ACPI_SUCCESS(status)) { if (ACPI_FAILURE(status))
printk(KERN_INFO PREFIX "Found ECDT\n"); return 0;
/* printk(KERN_INFO PREFIX "Found ECDT\n");
* TODO: When the new driver model allows it, simply tell the
* EC driver it has a new device via that, instead if this. /*
*/ * Generate a temporary ec context to use until the namespace is scanned
ec_ecdt = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL); */
if (!ec_ecdt) ec_ecdt = kmalloc(sizeof(struct acpi_ec), GFP_KERNEL);
return -ENOMEM; if (!ec_ecdt)
memset(ec_ecdt, 0, sizeof(struct acpi_ec)); return -ENOMEM;
memset(ec_ecdt, 0, sizeof(struct acpi_ec));
ec_ecdt->command_addr = ecdt_ptr->ec_control;
ec_ecdt->status_addr = ecdt_ptr->ec_control; ec_ecdt->command_addr = ecdt_ptr->ec_control;
ec_ecdt->data_addr = ecdt_ptr->ec_data; ec_ecdt->status_addr = ecdt_ptr->ec_control;
ec_ecdt->gpe_bit = ecdt_ptr->gpe_bit; ec_ecdt->data_addr = ecdt_ptr->ec_data;
ec_ecdt->lock = SPIN_LOCK_UNLOCKED; ec_ecdt->gpe_bit = ecdt_ptr->gpe_bit;
/* use the GL just to be safe */ ec_ecdt->lock = SPIN_LOCK_UNLOCKED;
ec_ecdt->global_lock = TRUE; /* use the GL just to be safe */
ec_ecdt->uid = ecdt_ptr->uid; ec_ecdt->global_lock = TRUE;
ec_ecdt->uid = ecdt_ptr->uid;
status = acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle);
if (ACPI_FAILURE(status)) { status = acpi_get_handle(NULL, ecdt_ptr->ec_id, &ec_ecdt->handle);
goto error; if (ACPI_FAILURE(status)) {
} goto error;
}
/*
* Install GPE handler /*
*/ * Install GPE handler
status = acpi_install_gpe_handler(ec_ecdt->gpe_bit, */
ACPI_EVENT_EDGE_TRIGGERED, &acpi_ec_gpe_handler, status = acpi_install_gpe_handler(ec_ecdt->gpe_bit,
ec_ecdt); ACPI_EVENT_EDGE_TRIGGERED, &acpi_ec_gpe_handler,
if (ACPI_FAILURE(status)) { ec_ecdt);
goto error; if (ACPI_FAILURE(status)) {
} goto error;
}
status = acpi_install_address_space_handler (ACPI_ROOT_OBJECT,
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler, status = acpi_install_address_space_handler (ACPI_ROOT_OBJECT,
&acpi_ec_space_setup, ec_ecdt); ACPI_ADR_SPACE_EC, &acpi_ec_space_handler,
if (ACPI_FAILURE(status)) { &acpi_ec_space_setup, ec_ecdt);
acpi_remove_gpe_handler(ec_ecdt->gpe_bit, if (ACPI_FAILURE(status)) {
&acpi_ec_gpe_handler); acpi_remove_gpe_handler(ec_ecdt->gpe_bit,
goto error; &acpi_ec_gpe_handler);
} goto error;
} }
return 0; return 0;
...@@ -795,20 +846,6 @@ subsys_initcall(acpi_ec_init); ...@@ -795,20 +846,6 @@ subsys_initcall(acpi_ec_init);
/* EC driver currently not unloadable */ /* EC driver currently not unloadable */
#if 0 #if 0
static void __exit
acpi_ec_ecdt_exit (void)
{
if (!ec_ecdt)
return;
acpi_remove_address_space_handler(ACPI_ROOT_OBJECT,
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler);
acpi_remove_gpe_handler(ec_ecdt->gpe_bit, &acpi_ec_gpe_handler);
kfree(ec_ecdt);
}
static void __exit static void __exit
acpi_ec_exit (void) acpi_ec_exit (void)
{ {
...@@ -818,8 +855,6 @@ acpi_ec_exit (void) ...@@ -818,8 +855,6 @@ acpi_ec_exit (void)
remove_proc_entry(ACPI_EC_CLASS, acpi_root_dir); remove_proc_entry(ACPI_EC_CLASS, acpi_root_dir);
acpi_ec_ecdt_exit();
return_VOID; return_VOID;
} }
#endif /* 0 */ #endif /* 0 */
......
...@@ -419,6 +419,12 @@ int acpi_pci_irq_init (void); ...@@ -419,6 +419,12 @@ int acpi_pci_irq_init (void);
#endif /*CONFIG_ACPI_PCI*/ #endif /*CONFIG_ACPI_PCI*/
#ifdef CONFIG_ACPI_EC
int ec_read(u8 addr, u8 *val);
int ec_write(u8 addr, u8 val);
#endif /*CONFIG_ACPI_EC*/
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment