return 0;
}
-static int ec_read_multiple(u8 address, u8 *buffer, size_t bytes)
-{
- size_t i;
- int ret;
-
- for (i = 0; i < bytes; i++) {
- ret = ec_read(address + i, &buffer[i]);
- if (ret < 0)
- return ret;
- }
-
- return 0;
-}
-
-static int ec_write_multiple(u8 address, u8 *buffer, size_t bytes)
-{
- size_t i;
- int ret;
-
- for (i = 0; i < bytes; i++) {
- ret = ec_write(address + i, buffer[i]);
- if (ret < 0)
- return ret;
- }
-
- return 0;
-}
-
-/*
- * WMI can have EmbeddedControl access regions. In which case, we just want to
- * hand these off to the EC driver.
- */
-static acpi_status
-acpi_wmi_ec_space_handler(u32 function, acpi_physical_address address,
- u32 bits, u64 *value,
- void *handler_context, void *region_context)
-{
- int bytes = bits / BITS_PER_BYTE;
- int ret;
-
- if (!value)
- return AE_NULL_ENTRY;
-
- if (!bytes || bytes > sizeof(*value))
- return AE_BAD_PARAMETER;
-
- if (address > U8_MAX || address + bytes - 1 > U8_MAX)
- return AE_BAD_PARAMETER;
-
- if (function != ACPI_READ && function != ACPI_WRITE)
- return AE_BAD_PARAMETER;
-
- if (function == ACPI_READ)
- ret = ec_read_multiple(address, (u8 *)value, bytes);
- else
- ret = ec_write_multiple(address, (u8 *)value, bytes);
-
- switch (ret) {
- case -EINVAL:
- return AE_BAD_PARAMETER;
- case -ENODEV:
- return AE_NOT_FOUND;
- case -ETIME:
- return AE_TIME;
- case 0:
- return AE_OK;
- default:
- return AE_ERROR;
- }
-}
-
static int wmi_get_notify_data(struct wmi_block *wblock, union acpi_object **obj)
{
struct acpi_buffer data = { ACPI_ALLOCATE_BUFFER, NULL };
acpi_remove_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY, acpi_wmi_notify_handler);
}
-static void acpi_wmi_remove_address_space_handler(void *data)
-{
- struct acpi_device *acpi_device = data;
-
- acpi_remove_address_space_handler(acpi_device->handle, ACPI_ADR_SPACE_EC,
- &acpi_wmi_ec_space_handler);
-}
-
static void acpi_wmi_remove_bus_device(void *data)
{
struct device *wmi_bus_dev = data;
dev_set_drvdata(&device->dev, wmi_bus_dev);
- status = acpi_install_address_space_handler(acpi_device->handle,
- ACPI_ADR_SPACE_EC,
- &acpi_wmi_ec_space_handler,
- NULL, NULL);
- if (ACPI_FAILURE(status)) {
- dev_err(&device->dev, "Error installing EC region handler\n");
- return -ENODEV;
- }
- error = devm_add_action_or_reset(&device->dev, acpi_wmi_remove_address_space_handler,
- acpi_device);
- if (error < 0)
- return error;
-
status = acpi_install_notify_handler(acpi_device->handle, ACPI_ALL_NOTIFY,
acpi_wmi_notify_handler, wmi_bus_dev);
if (ACPI_FAILURE(status)) {