Subject: [PATCH] [acpi ec] Add probing of resources to ec device init sequence - Create drivers/acpi/drivers/ec/resource.c - Put ec_resource_init() in there, which calls acpi_dev_find_crs() to find device addresses. - Call ec_resource_init() from ec_add(). Signed-off-by: Patrick Mochel --- drivers/acpi/drivers/ec/Makefile | 1 + drivers/acpi/drivers/ec/driver.c | 6 ++++ drivers/acpi/drivers/ec/ec.h | 8 +++++ drivers/acpi/drivers/ec/resource.c | 58 ++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 0 deletions(-) create mode 100644 drivers/acpi/drivers/ec/resource.c applies-to: 16a84984f4b6c07a5fc7d4bff59956e79c92d749 d65f8fcb4f90db888baed0d9b17eeb7fb0d1ebb0 diff --git a/drivers/acpi/drivers/ec/Makefile b/drivers/acpi/drivers/ec/Makefile index a6222b5..b1876ef 100644 --- a/drivers/acpi/drivers/ec/Makefile +++ b/drivers/acpi/drivers/ec/Makefile @@ -1,6 +1,7 @@ obj-$(CONFIG_ACPI_EC) += ec.o ec-y := driver.o device.o event.o +ec-y += resource.o ec-$(CONFIG_ACPI_DM_PROC) += proc.o ec-$(CONFIG_ACPI_DM_SYSFS) += sysfs.o diff --git a/drivers/acpi/drivers/ec/driver.c b/drivers/acpi/drivers/ec/driver.c index d1c5b8a..4e48e1e 100644 --- a/drivers/acpi/drivers/ec/driver.c +++ b/drivers/acpi/drivers/ec/driver.c @@ -32,6 +32,12 @@ static int ec_add(struct acpi_dev * ad) return ret; } + ret = ec_resource_init(ae); + if (ret) { + kfree(ae); + return ret; + } + dev_set_drvdata(&ad->dev, ae); printk(KERN_INFO PREFIX "ec [%s] (gpe %ld)\n", diff --git a/drivers/acpi/drivers/ec/ec.h b/drivers/acpi/drivers/ec/ec.h index eff30ca..a6f2bda 100644 --- a/drivers/acpi/drivers/ec/ec.h +++ b/drivers/acpi/drivers/ec/ec.h @@ -27,5 +27,13 @@ struct acpi_ec { struct acpi_generic_address e_data; }; +/* + * device.c + */ extern int ec_init(struct acpi_ec * ec); +/* + * resource.c + */ +extern int ec_resource_init(struct acpi_ec * ec); + diff --git a/drivers/acpi/drivers/ec/resource.c b/drivers/acpi/drivers/ec/resource.c new file mode 100644 index 0000000..4b0d594 --- /dev/null +++ b/drivers/acpi/drivers/ec/resource.c @@ -0,0 +1,58 @@ + +#include "ec.h" +#include + +static int find_io_ports(struct walk_resource * w) +{ + struct acpi_ec * ae = w->data; + struct acpi_resource * res = w->resource; + struct acpi_generic_address * addr; + + /* + * The first address region returned in the data port, and + * the second address region returned is the status/command port. + */ + if (ae->e_data.register_bit_width == 0) + addr = &ae->e_data; + else if (ae->e_data.register_bit_width == 0) + addr = &ae->e_command; + else + return 1; + + addr->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO; + addr->register_bit_width = 8; + addr->register_bit_offset = 0; + addr->address = res->data.io.min_base_address; + + return 0; +} + +int ec_resource_init(struct acpi_ec * ec) +{ + struct walk_resource w = { + .handle = ec->e_ad->acpi_device->handle, + .rstypes = { + ACPI_RSTYPE_IO, + }, + .num_rstypes = 1, + .func = find_io_ports, + .data = ec, + }; + int ret; + + /* + * Get I/O Addresses and convert to GAS format. + */ + ret = acpi_dev_find_crs(&w); + + if (ret || ec->e_command.register_bit_width == 0) { + err("Getting I/O Ports"); + return ret ? ret : -ENODEV; + } + + ec->e_status = ec->e_command; + + dbg("gpe=%#02x, ports=%#02x,%#02x", + ec->e_gpe_bit, ec->e_command.address, ec->e_data.address); + return ret; +} --- 0.99.9.GIT