/* * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Changes from Qualcomm Innovation Center are provided under the following license: * * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted (subject to the limitations in the disclaimer * below) provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * * Neither the name of Qualcomm Innovation Center, Inc.nor the * names of its contributors may be used to endorse or promote * products derived from this software without specific prior * written permission. * * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT * RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define LOG_TAG "health_impl_qti" #include #include #include #include using ::android::hardware::health::InitHealthdConfig; using ::android::hardware::health::V2_1::IHealth; using namespace std::literals; namespace { constexpr char ucsiPSYName[]{"ucsi-source-psy-soc:qcom,pmic_glink:qcom,ucsi1"}; #define RETRY_COUNT 100 void qti_healthd_board_init(struct healthd_config *hc) { int fd; unsigned char retries = RETRY_COUNT; int ret = 0; unsigned char buf; hc->ignorePowerSupplyNames.push_back(android::String8(ucsiPSYName)); retry: if (!retries) { KLOG_ERROR(LOG_TAG, "Cannot open battery/capacity, fd=%d\n", fd); return; } fd = open("/sys/class/power_supply/battery/capacity", 0440); if (fd >= 0) { KLOG_INFO(LOG_TAG, "opened battery/capacity after %d retries\n", RETRY_COUNT - retries); while (retries) { ret = read(fd, &buf, 1); if(ret >= 0) { KLOG_INFO(LOG_TAG, "Read Batt Capacity after %d retries ret : %d\n", RETRY_COUNT - retries, ret); close(fd); return; } retries--; usleep(100000); } KLOG_ERROR(LOG_TAG, "Failed to read Battery Capacity ret=%d\n", ret); close(fd); return; } retries--; usleep(100000); goto retry; } } //anonymous namespace namespace android { namespace hardware { namespace health { namespace V2_1 { namespace implementation { class HealthImpl : public Health { public: HealthImpl(std::unique_ptr&& config) : Health(std::move(config)) {} }; } // namespace implementation } // namespace V2_1 } // namespace health } // namespace hardware } // namespace android extern "C" IHealth* HIDL_FETCH_IHealth(const char* instance) { using ::android::hardware::health::V2_1::implementation::HealthImpl; if (instance != "default"sv) { return nullptr; } auto config = std::make_unique(); InitHealthdConfig(config.get()); qti_healthd_board_init(config.get()); return new HealthImpl(std::move(config)); }