Commit fd6231e7 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPI / EC: Cleanup boot EC code using acpi_ec_alloc()

Failure handling of the boot EC code is not tidy. This patch cleans
them up with acpi_ec_alloc().

This patch also changes acpi_ec_dsdt_probe(), always switches the
boot EC from the ECDT one to the DSDT one in this function.
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent a99cde43
...@@ -1348,13 +1348,9 @@ static void ec_remove_handlers(struct acpi_ec *ec) ...@@ -1348,13 +1348,9 @@ static void ec_remove_handlers(struct acpi_ec *ec)
} }
} }
static int acpi_ec_add(struct acpi_device *device) static struct acpi_ec *acpi_ec_alloc(void)
{ {
struct acpi_ec *ec = NULL; struct acpi_ec *ec;
int ret;
strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_EC_CLASS);
/* Check for boot EC */ /* Check for boot EC */
if (boot_ec) { if (boot_ec) {
...@@ -1365,9 +1361,21 @@ static int acpi_ec_add(struct acpi_device *device) ...@@ -1365,9 +1361,21 @@ static int acpi_ec_add(struct acpi_device *device)
first_ec = NULL; first_ec = NULL;
} else { } else {
ec = make_acpi_ec(); ec = make_acpi_ec();
if (!ec)
return -ENOMEM;
} }
return ec;
}
static int acpi_ec_add(struct acpi_device *device)
{
struct acpi_ec *ec = NULL;
int ret;
strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
strcpy(acpi_device_class(device), ACPI_EC_CLASS);
ec = acpi_ec_alloc();
if (!ec)
return -ENOMEM;
if (ec_parse_device(device->handle, 0, ec, NULL) != if (ec_parse_device(device->handle, 0, ec, NULL) !=
AE_CTRL_TERMINATE) { AE_CTRL_TERMINATE) {
kfree(ec); kfree(ec);
...@@ -1454,27 +1462,31 @@ static const struct acpi_device_id ec_device_ids[] = { ...@@ -1454,27 +1462,31 @@ static const struct acpi_device_id ec_device_ids[] = {
int __init acpi_ec_dsdt_probe(void) int __init acpi_ec_dsdt_probe(void)
{ {
acpi_status status; acpi_status status;
struct acpi_ec *ec;
int ret;
if (boot_ec) ec = acpi_ec_alloc();
return 0; if (!ec)
return -ENOMEM;
/* /*
* Finding EC from DSDT if there is no ECDT EC available. When this * Finding EC from DSDT if there is no ECDT EC available. When this
* function is invoked, ACPI tables have been fully loaded, we can * function is invoked, ACPI tables have been fully loaded, we can
* walk namespace now. * walk namespace now.
*/ */
boot_ec = make_acpi_ec();
if (!boot_ec)
return -ENOMEM;
status = acpi_get_devices(ec_device_ids[0].id, status = acpi_get_devices(ec_device_ids[0].id,
ec_parse_device, boot_ec, NULL); ec_parse_device, ec, NULL);
if (ACPI_FAILURE(status) || !boot_ec->handle) if (ACPI_FAILURE(status) || !ec->handle) {
return -ENODEV; ret = -ENODEV;
if (!ec_install_handlers(boot_ec)) { goto error;
first_ec = boot_ec;
return 0;
} }
return -EFAULT; ret = ec_install_handlers(ec);
error:
if (ret)
kfree(ec);
else
first_ec = boot_ec = ec;
return ret;
} }
#if 0 #if 0
...@@ -1548,12 +1560,13 @@ static struct dmi_system_id ec_dmi_table[] __initdata = { ...@@ -1548,12 +1560,13 @@ static struct dmi_system_id ec_dmi_table[] __initdata = {
int __init acpi_ec_ecdt_probe(void) int __init acpi_ec_ecdt_probe(void)
{ {
int ret = 0; int ret;
acpi_status status; acpi_status status;
struct acpi_table_ecdt *ecdt_ptr; struct acpi_table_ecdt *ecdt_ptr;
struct acpi_ec *ec;
boot_ec = make_acpi_ec(); ec = acpi_ec_alloc();
if (!boot_ec) if (!ec)
return -ENOMEM; return -ENOMEM;
/* /*
* Generate a boot ec context * Generate a boot ec context
...@@ -1583,22 +1596,20 @@ int __init acpi_ec_ecdt_probe(void) ...@@ -1583,22 +1596,20 @@ int __init acpi_ec_ecdt_probe(void)
* MSI MS-171F * MSI MS-171F
* https://bugzilla.kernel.org/show_bug.cgi?id=12461 * https://bugzilla.kernel.org/show_bug.cgi?id=12461
*/ */
boot_ec->command_addr = ecdt_ptr->data.address; ec->command_addr = ecdt_ptr->data.address;
boot_ec->data_addr = ecdt_ptr->control.address; ec->data_addr = ecdt_ptr->control.address;
} else { } else {
boot_ec->command_addr = ecdt_ptr->control.address; ec->command_addr = ecdt_ptr->control.address;
boot_ec->data_addr = ecdt_ptr->data.address; ec->data_addr = ecdt_ptr->data.address;
} }
boot_ec->gpe = ecdt_ptr->gpe; ec->gpe = ecdt_ptr->gpe;
boot_ec->handle = ACPI_ROOT_OBJECT; ec->handle = ACPI_ROOT_OBJECT;
ret = ec_install_handlers(boot_ec); ret = ec_install_handlers(ec);
if (!ret)
first_ec = boot_ec;
error: error:
if (ret) { if (ret)
kfree(boot_ec); kfree(ec);
boot_ec = NULL; else
} first_ec = boot_ec = ec;
return ret; return ret;
} }
......
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