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)
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,23 +1460,30 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)
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
14651468 acpi_ec_start (ec , false);
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)
15261535static 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)
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)
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)
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)
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 ;
0 commit comments