/* * Copyright (c) 2019-2020 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. */ #define LOG_TAG "android.hardware.power-service-qti" #include "Power.h" #include #include #include #include #include #include using ::aidl::android::hardware::power::BnPower; using ::aidl::android::hardware::power::Boost; using ::aidl::android::hardware::power::IPower; using ::aidl::android::hardware::power::Mode; using ::ndk::ScopedAStatus; using ::ndk::SharedRefBase; namespace aidl { namespace android { namespace hardware { namespace power { namespace impl { #ifdef MODE_EXT extern bool isDeviceSpecificModeSupported(Mode type, bool* _aidl_return); extern bool setDeviceSpecificMode(Mode type, bool enabled); #endif void setInteractive(bool interactive) { set_interactive(interactive ? 1 : 0); } ndk::ScopedAStatus Power::setMode(Mode type, bool enabled) { LOG(INFO) << "Power setMode: " << static_cast(type) << " to: " << enabled; #ifdef MODE_EXT if (setDeviceSpecificMode(type, enabled)) { return ndk::ScopedAStatus::ok(); } #endif switch (type) { #ifdef TAP_TO_WAKE_NODE case Mode::DOUBLE_TAP_TO_WAKE: ::android::base::WriteStringToFile(enabled ? "1" : "0", TAP_TO_WAKE_NODE, true); break; #else case Mode::DOUBLE_TAP_TO_WAKE: #endif case Mode::LOW_POWER: case Mode::EXPENSIVE_RENDERING: case Mode::DEVICE_IDLE: case Mode::DISPLAY_INACTIVE: case Mode::AUDIO_STREAMING_LOW_LATENCY: case Mode::CAMERA_STREAMING_SECURE: case Mode::CAMERA_STREAMING_LOW: case Mode::CAMERA_STREAMING_MID: case Mode::CAMERA_STREAMING_HIGH: case Mode::VR: LOG(INFO) << "Mode " << static_cast(type) << "Not Supported"; break; case Mode::LAUNCH: power_hint(POWER_HINT_LAUNCH, enabled ? &enabled : NULL); break; case Mode::INTERACTIVE: setInteractive(enabled); break; case Mode::SUSTAINED_PERFORMANCE: case Mode::FIXED_PERFORMANCE: power_hint(POWER_HINT_SUSTAINED_PERFORMANCE, NULL); break; default: LOG(INFO) << "Mode " << static_cast(type) << "Not Supported"; break; } return ndk::ScopedAStatus::ok(); } ndk::ScopedAStatus Power::isModeSupported(Mode type, bool* _aidl_return) { LOG(INFO) << "Power isModeSupported: " << static_cast(type); #ifdef MODE_EXT if (isDeviceSpecificModeSupported(type, _aidl_return)) { return ndk::ScopedAStatus::ok(); } #endif switch (type) { #ifdef TAP_TO_WAKE_NODE case Mode::DOUBLE_TAP_TO_WAKE: #endif case Mode::LAUNCH: case Mode::INTERACTIVE: case Mode::SUSTAINED_PERFORMANCE: case Mode::FIXED_PERFORMANCE: *_aidl_return = true; break; default: *_aidl_return = false; break; } return ndk::ScopedAStatus::ok(); } ndk::ScopedAStatus Power::setBoost(Boost type, int32_t durationMs) { LOG(VERBOSE) << "Power setBoost: " << static_cast(type) << ", duration: " << durationMs; switch (type) { case Boost::INTERACTION: power_hint(POWER_HINT_INTERACTION, &durationMs); break; default: LOG(INFO) << "Boost " << static_cast(type) << "Not Supported"; break; } return ndk::ScopedAStatus::ok(); } ndk::ScopedAStatus Power::isBoostSupported(Boost type, bool* _aidl_return) { LOG(INFO) << "Power isBoostSupported: " << static_cast(type); switch (type) { case Boost::INTERACTION: *_aidl_return = true; break; default: *_aidl_return = false; break; } return ndk::ScopedAStatus::ok(); } } // namespace impl } // namespace power } // namespace hardware } // namespace android } // namespace aidl