94
94
EC_FLAGS_QUERY_ENABLED , /* Query is enabled */
95
95
EC_FLAGS_EVENT_HANDLER_INSTALLED , /* Event handler installed */
96
96
EC_FLAGS_EC_HANDLER_INSTALLED , /* OpReg handler installed */
97
+ EC_FLAGS_EC_REG_CALLED , /* OpReg ACPI _REG method called */
97
98
EC_FLAGS_QUERY_METHODS_INSTALLED , /* _Qxx handlers installed */
98
99
EC_FLAGS_STARTED , /* Driver is started */
99
100
EC_FLAGS_STOPPED , /* Driver is stopped */
@@ -1446,6 +1447,7 @@ static bool install_gpio_irq_event_handler(struct acpi_ec *ec)
1446
1447
* ec_install_handlers - Install service callbacks and register query methods.
1447
1448
* @ec: Target EC.
1448
1449
* @device: ACPI device object corresponding to @ec.
1450
+ * @call_reg: If _REG should be called to notify OpRegion availability
1449
1451
*
1450
1452
* Install a handler for the EC address space type unless it has been installed
1451
1453
* 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)
1458
1460
* -EPROBE_DEFER if GPIO IRQ acquisition needs to be deferred,
1459
1461
* or 0 (success) otherwise.
1460
1462
*/
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 )
1462
1465
{
1463
1466
acpi_status status ;
1464
1467
1465
1468
acpi_ec_start (ec , false);
1466
1469
1467
1470
if (!test_bit (EC_FLAGS_EC_HANDLER_INSTALLED , & ec -> flags )) {
1468
1471
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 );
1473
1476
if (ACPI_FAILURE (status )) {
1474
1477
acpi_ec_stop (ec , false);
1475
1478
return - ENODEV ;
1476
1479
}
1477
1480
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 );
1478
1487
}
1479
1488
1480
1489
if (!device )
@@ -1526,7 +1535,8 @@ static int ec_install_handlers(struct acpi_ec *ec, struct acpi_device *device)
1526
1535
static void ec_remove_handlers (struct acpi_ec * ec )
1527
1536
{
1528
1537
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 ,
1530
1540
ACPI_ADR_SPACE_EC , & acpi_ec_space_handler )))
1531
1541
pr_err ("failed to remove space handler\n" );
1532
1542
clear_bit (EC_FLAGS_EC_HANDLER_INSTALLED , & ec -> flags );
@@ -1562,11 +1572,11 @@ static void ec_remove_handlers(struct acpi_ec *ec)
1562
1572
}
1563
1573
}
1564
1574
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 )
1566
1576
{
1567
1577
int ret ;
1568
1578
1569
- ret = ec_install_handlers (ec , device );
1579
+ ret = ec_install_handlers (ec , device , call_reg );
1570
1580
if (ret )
1571
1581
return ret ;
1572
1582
@@ -1631,7 +1641,7 @@ static int acpi_ec_add(struct acpi_device *device)
1631
1641
}
1632
1642
}
1633
1643
1634
- ret = acpi_ec_setup (ec , device );
1644
+ ret = acpi_ec_setup (ec , device , true );
1635
1645
if (ret )
1636
1646
goto err ;
1637
1647
@@ -1750,7 +1760,7 @@ void __init acpi_ec_dsdt_probe(void)
1750
1760
* At this point, the GPE is not fully initialized, so do not to
1751
1761
* handle the events.
1752
1762
*/
1753
- ret = acpi_ec_setup (ec , NULL );
1763
+ ret = acpi_ec_setup (ec , NULL , true );
1754
1764
if (ret ) {
1755
1765
acpi_ec_free (ec );
1756
1766
return ;
@@ -1944,7 +1954,7 @@ void __init acpi_ec_ecdt_probe(void)
1944
1954
* At this point, the namespace is not initialized, so do not find
1945
1955
* the namespace objects, or handle the events.
1946
1956
*/
1947
- ret = acpi_ec_setup (ec , NULL );
1957
+ ret = acpi_ec_setup (ec , NULL , false );
1948
1958
if (ret ) {
1949
1959
acpi_ec_free (ec );
1950
1960
goto out ;
0 commit comments