ACPI fixes for 6.10-rc1

These make the ACPI EC driver always install the EC address space handler
 at the root of the ACPI namespace which causes it to take care of all EC
 operation regions everywhere, so in particular the custom EC address
 space handler in the WMI driver is not needed any more and accordingly
 it gets removed altogether.
 -----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmZMYfoSHHJqd0Byand5
 c29ja2kubmV0AAoJEILEb/54YlRxyQEQAJst7Tn/3kMwGQXnalapUC/sKmabNNqq
 9E6hlFMlvkev36QNEmPg102Bs+qzr3JVzydyoP+9P/rarw3pa1f2ab7JSQbV77HX
 s+EJ75NKT4GFGx2uq3UGArFqLaPhm+jT4dqKES0f+Niw1urgkpCXl//j9CpbdgWM
 6oIlkDePUZqZ6mleFgYI99jhqtwI3yWcHVNHO7Iw9F6fA6A+qmMLELJvgsyW4Yaw
 E3CBhszMu4YeX5ovQxze/UYYdUMBf/JWel3iuzu9Gpt3IdWpocIjCgMXKp0/eekG
 wR1PuGA7X/4Tv4pJ2KDMMGD9w5ff6hBj9iI35BACxjuje4mVQf3LLBKmfphOaTVo
 NBFLTJW8gVyFkudEwmvuNBOezG/ltIXqLVI79qwWkYcLagSQeg4HiKXkv7pKzVwA
 1kAcG3Vg3lrg3dO09Nu9xWzOHoLiJSROCqDA1onR+cmrvb1cJB05PGS3lvHwAQgJ
 +dv1/+iIur3R0Yisc3pXKWz4q4wARjjafL/8QWBXlwNlo1PBVqv5Hbf3l1N15jnZ
 lkl21RmoTRzw7p/yqiz0JIWXL+xqDLRQhko1wVAbdBSTEtlhCaBQZKx67rZ849Je
 KtbSwupI5u++QuB2uYGJ+9+XqRoZ4m7LZOGGXXPjDrkJdBE72T9MJKiZohAMptVa
 uOvE0AMszRiz
 =Ho4A
 -----END PGP SIGNATURE-----

Merge tag 'acpi-6.10-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI fixes from Rafael Wysocki:
 "These make the ACPI EC driver always install the EC address space
  handler at the root of the ACPI namespace which causes it to take care
  of all EC operation regions everywhere.

  This means that the custom EC address space handler in the WMI driver
  is not needed any more and accordingly it gets removed altogether"

* tag 'acpi-6.10-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  platform/x86: wmi: Remove custom EC address space handler
  ACPI: EC: Install address space handler at the namespace root
This commit is contained in:
Linus Torvalds 2024-05-21 11:37:51 -07:00
commit 62a12816cb
3 changed files with 16 additions and 102 deletions

View File

@ -1482,13 +1482,14 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)
static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device,
bool call_reg)
{
acpi_handle scope_handle = ec == first_ec ? ACPI_ROOT_OBJECT : ec->handle;
acpi_status status;
acpi_ec_start(ec, false);
if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
acpi_ec_enter_noirq(ec);
status = acpi_install_address_space_handler_no_reg(ec->handle,
status = acpi_install_address_space_handler_no_reg(scope_handle,
ACPI_ADR_SPACE_EC,
&acpi_ec_space_handler,
NULL, ec);
@ -1497,11 +1498,10 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device,
return -ENODEV;
}
set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
ec->address_space_handler_holder = ec->handle;
}
if (call_reg && !test_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags)) {
acpi_execute_reg_methods(ec->handle, ACPI_ADR_SPACE_EC);
acpi_execute_reg_methods(scope_handle, ACPI_ADR_SPACE_EC);
set_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags);
}
@ -1553,10 +1553,13 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device,
static void ec_remove_handlers(struct acpi_ec *ec)
{
acpi_handle scope_handle = ec == first_ec ? ACPI_ROOT_OBJECT : ec->handle;
if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
if (ACPI_FAILURE(acpi_remove_address_space_handler(
ec->address_space_handler_holder,
ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
scope_handle,
ACPI_ADR_SPACE_EC,
&acpi_ec_space_handler)))
pr_err("failed to remove space handler\n");
clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
}
@ -1595,14 +1598,18 @@ static int acpi_ec_setup(struct acpi_ec *ec, struct acpi_device *device, bool ca
{
int ret;
ret = ec_install_handlers(ec, device, call_reg);
if (ret)
return ret;
/* First EC capable of handling transactions */
if (!first_ec)
first_ec = ec;
ret = ec_install_handlers(ec, device, call_reg);
if (ret) {
if (ec == first_ec)
first_ec = NULL;
return ret;
}
pr_info("EC_CMD/EC_SC=0x%lx, EC_DATA=0x%lx\n", ec->command_addr,
ec->data_addr);

View File

@ -186,7 +186,6 @@ enum acpi_ec_event_state {
struct acpi_ec {
acpi_handle handle;
acpi_handle address_space_handler_holder;
int gpe;
int irq;
unsigned long command_addr;

View File

@ -1153,77 +1153,6 @@ static int parse_wdg(struct device *wmi_bus_dev, struct platform_device *pdev)
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 };
@ -1338,14 +1267,6 @@ static void acpi_wmi_remove_notify_handler(void *data)
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;
@ -1377,19 +1298,6 @@ static int acpi_wmi_probe(struct platform_device *device)
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)) {