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 Original line Diff line number Diff line
@@ -145,26 +145,28 @@ done:
}
}


IPower* HIDL_FETCH_IPower(const char* /* name */) {
IPower* HIDL_FETCH_IPower(const char* /* name */) {
    int ret = 0;
    const hw_module_t* hw_module = nullptr;
    const hw_module_t* hw_module = NULL;
    power_module_t* power_module = nullptr;
    power_module_t *power_module;
    int err = hw_get_module(POWER_HARDWARE_MODULE_ID, &hw_module);
    ret = hw_get_module(POWER_HARDWARE_MODULE_ID, &hw_module);
    if (err) {
    if (ret == 0 && hw_module->methods->open) {
        ALOGE("hw_get_module %s failed: %d", POWER_HARDWARE_MODULE_ID, err);
        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.");
        return nullptr;
        return nullptr;
    }
    }
    }

    else {
    if (!hw_module->methods || !hw_module->methods->open) {
        ALOGE ("hw_get_module %s failed: %d", POWER_HARDWARE_MODULE_ID, ret);
        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 nullptr;
        }
        }
    }
    }
    return new Power(power_module);
}


} // namespace implementation
} // namespace implementation
}  // namespace V1_0
}  // namespace V1_0