History

Merge branch 'acpi-ec'

Merge additional ACPI EC driver fixes for 6.2-rc1: - Fix EC address space handler unregistration (Hans de Goede). - Defer the evaluation of _REG for ECDT described ECs till the matching EC device in the DSDT gets parsed and acpi_ec_add() gets called for it (Hans de Goede). * acpi-ec: ACPI: EC: Fix ECDT probe ordering issues ACPI: EC: Fix EC address space handler unregistration

Rafael J. Wysocki committed 3 years ago

Commit 3d031402 parents f7eae09 ab4620f2 files · +22 −11Browse files

Unified · Split

2 files
  1. drivers/acpi/ec.c +21 −11
  2. drivers/acpi/internal.h +1 −0
drivers/acpi/ec.c+21−11
@@ -94,6 +94,7 @@ enum { · 93 unmodified lines
9494 EC_FLAGS_QUERY_ENABLED, /* Query is enabled */
9595 EC_FLAGS_EVENT_HANDLER_INSTALLED, /* Event handler installed */
9696 EC_FLAGS_EC_HANDLER_INSTALLED, /* OpReg handler installed */
97+ EC_FLAGS_EC_REG_CALLED, /* OpReg ACPI _REG method called */
9798 EC_FLAGS_QUERY_METHODS_INSTALLED, /* _Qxx handlers installed */
9899 EC_FLAGS_STARTED, /* Driver is started */
99100 EC_FLAGS_STOPPED, /* Driver is stopped */
@@ -1446,6 +1447,7 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec) · 1346 unmodified lines
14461447 * ec_install_handlers - Install service callbacks and register query methods.
14471448 * @ec: Target EC.
14481449 * @device: ACPI device object corresponding to @ec.
1450+ * @call_reg: If _REG should be called to notify OpRegion availability
14491451 *
14501452 * Install a handler for the EC address space type unless it has been installed
14511453 * already. If @device is not NULL, also look for EC query methods in the
@@ -1458,7 +1460,8 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec) · 6 unmodified lines
14581460 * -EPROBE_DEFER if GPIO IRQ acquisition needs to be deferred,
14591461 * or 0 (success) otherwise.
14601462 */
1461−static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device)
1463+static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device,
1464+ bool call_reg)
14621465 {
14631466 acpi_status status;
14641467
@@ -1466,15 +1469,21 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device) · 1 unmodified line
14661469
14671470 if (!test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
14681471 acpi_ec_enter_noirq(ec);
1469− status = acpi_install_address_space_handler(ec->handle,
1470− ACPI_ADR_SPACE_EC,
1471− &acpi_ec_space_handler,
1472− NULL, ec);
1472+ status = acpi_install_address_space_handler_no_reg(ec->handle,
1473+ ACPI_ADR_SPACE_EC,
1474+ &acpi_ec_space_handler,
1475+ NULL, ec);
14731476 if (ACPI_FAILURE(status)) {
14741477 acpi_ec_stop(ec, false);
14751478 return -ENODEV;
14761479 }
14771480 set_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
1481+ ec->address_space_handler_holder = ec->handle;
1482+ }
1483+
1484+ if (call_reg && !test_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags)) {
1485+ acpi_execute_reg_methods(ec->handle, ACPI_ADR_SPACE_EC);
1486+ set_bit(EC_FLAGS_EC_REG_CALLED, &ec->flags);
14781487 }
14791488
14801489 if (!device)
@@ -1526,7 +1535,8 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device) · 45 unmodified lines
15261535 static void ec_remove_handlers(struct acpi_ec *ec)
15271536 {
15281537 if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) {
1529− if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
1538+ if (ACPI_FAILURE(acpi_remove_address_space_handler(
1539+ ec->address_space_handler_holder,
15301540 ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
15311541 pr_err("failed to remove space handler\n");
15321542 clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags);
@@ -1562,11 +1572,11 @@ static void ec_remove_handlers(struct acpi_ec *ec) · 29 unmodified lines
15621572 }
15631573 }
15641574
1565−static int acpi_ec_setup(struct acpi_ec *ec, struct acpi_device *device)
1575+static int acpi_ec_setup(struct acpi_ec *ec, struct acpi_device *device, bool call_reg)
15661576 {
15671577 int ret;
15681578
1569− ret = ec_install_handlers(ec, device);
1579+ ret = ec_install_handlers(ec, device, call_reg);
15701580 if (ret)
15711581 return ret;
15721582
@@ -1631,7 +1641,7 @@ static int acpi_ec_add(struct acpi_device *device) · 58 unmodified lines
16311641 }
16321642 }
16331643
1634− ret = acpi_ec_setup(ec, device);
1644+ ret = acpi_ec_setup(ec, device, true);
16351645 if (ret)
16361646 goto err;
16371647
@@ -1750,7 +1760,7 @@ void __init acpi_ec_dsdt_probe(void) · 112 unmodified lines
17501760 * At this point, the GPE is not fully initialized, so do not to
17511761 * handle the events.
17521762 */
1753− ret = acpi_ec_setup(ec, NULL);
1763+ ret = acpi_ec_setup(ec, NULL, true);
17541764 if (ret) {
17551765 acpi_ec_free(ec);
17561766 return;
@@ -1944,7 +1954,7 @@ void __init acpi_ec_ecdt_probe(void) · 187 unmodified lines
19441954 * At this point, the namespace is not initialized, so do not find
19451955 * the namespace objects, or handle the events.
19461956 */
1947− ret = acpi_ec_setup(ec, NULL);
1957+ ret = acpi_ec_setup(ec, NULL, false);
19481958 if (ret) {
19491959 acpi_ec_free(ec);
19501960 goto out;
drivers/acpi/internal.h+1−0
@@ -173,6 +173,7 @@ enum acpi_ec_event_state { · 172 unmodified lines
173173
174174 struct acpi_ec {
175175 acpi_handle handle;
176+ acpi_handle address_space_handler_holder;
176177 int gpe;
177178 int irq;
178179 unsigned long command_addr;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t