Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27afb47f authored by Connor O'Brien's avatar Connor O'Brien
Browse files

Fix failure to load power HAL implementation



Some working implementations of the libhardware power HAL do not
implement an open method. Change the HIDL implementation to not rely
on that method being available.

Test: Flashed marlin with modified power.marlin that omits an open()
implementation; power HAL loads successfully and passes VTS
Bug: 37245218
Signed-off-by: default avatarConnor O'Brien <connoro@google.com>

Change-Id: Icc77b3011a0e44330062aa51ae49e39ad349a2a5
parent 61fd0563
Loading
Loading
Loading
Loading
+18 −16
Original line number Diff line number Diff line
@@ -145,26 +145,28 @@ done:
}

IPower* HIDL_FETCH_IPower(const char* /* name */) {
    int ret = 0;
    const hw_module_t* hw_module = NULL;
    power_module_t *power_module;
    ret = hw_get_module(POWER_HARDWARE_MODULE_ID, &hw_module);
    if (ret == 0 && hw_module->methods->open) {
        ret = hw_module->methods->open(hw_module, POWER_HARDWARE_MODULE_ID,
                reinterpret_cast<hw_device_t**>(&power_module));
        if (ret == 0) {
            return new Power(power_module);
        }
        else {
            ALOGE("Passthrough failed to load legacy power HAL.");
    const hw_module_t* hw_module = nullptr;
    power_module_t* power_module = nullptr;
    int err = hw_get_module(POWER_HARDWARE_MODULE_ID, &hw_module);
    if (err) {
        ALOGE("hw_get_module %s failed: %d", POWER_HARDWARE_MODULE_ID, err);
        return nullptr;
    }
    }
    else {
        ALOGE ("hw_get_module %s failed: %d", POWER_HARDWARE_MODULE_ID, ret);

    if (!hw_module->methods || !hw_module->methods->open) {
        power_module = reinterpret_cast<power_module_t*>(
            const_cast<hw_module_t*>(hw_module));
    } else {
        err = hw_module->methods->open(
            hw_module, POWER_HARDWARE_MODULE_ID,
            reinterpret_cast<hw_device_t**>(&power_module));
        if (err) {
            ALOGE("Passthrough failed to load legacy HAL.");
            return nullptr;
        }
    }
    return new Power(power_module);
}

} // namespace implementation
}  // namespace V1_0