166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCameraPerf" 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// To remove 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <cutils/properties.h> 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h> 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <dlfcn.h> 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraPerf.h" 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraTrace.h" 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraPerfLock constructor 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialize member variables 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPerfLock::QCameraPerfLock() : 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_acq(NULL), 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_rel(NULL), 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDlHandle(NULL), 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockEnable(0), 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandle(-1), 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandleTimed(-1), 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mTimerSet(0), 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockTimeout(0), 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStartTimeofLock(0) 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraPerfLock destructor 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: class desctructor 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPerfLock::~QCameraPerfLock() 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin lock_deinit(); 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lock_init 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: opens the performance lib and initilizes the perf lock functions 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPerfLock::lock_init() 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const char *rc; 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char value[PROPERTY_VALUE_MAX]; 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Clear the list of active power hints 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActivePowerHints.clear(); 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHint = static_cast<power_hint_t>(0); 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHintEnable = false; 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.perflock.enable", value, "1"); 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockEnable = atoi(value); 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef HAS_MULTIMEDIA_HINTS 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) { 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("%s module not found", POWER_HARDWARE_MODULE_ID); 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable) { 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_acq = NULL; 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_rel = NULL; 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandle = -1; 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Retrieve name of vendor extension library */ 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (property_get("ro.vendor.extension_library", value, NULL) <= 0) { 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto cleanup; 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDlHandle = dlopen(value, RTLD_NOW | RTLD_LOCAL); 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDlHandle == NULL) { 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto cleanup; 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dlerror(); 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_acq = (int (*) (int, int, int[], int))dlsym(mDlHandle, "perf_lock_acq"); 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((rc = dlerror()) != NULL) { 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to perf_lock_acq function handle"); 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto cleanup; 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_rel = (int (*) (int))dlsym(mDlHandle, "perf_lock_rel"); 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((rc = dlerror()) != NULL) { 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to perf_lock_rel function handle"); 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto cleanup; 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjincleanup: 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_acq = NULL; 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_rel = NULL; 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockEnable = 0; 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDlHandle) { 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dlclose(mDlHandle); 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDlHandle = NULL; 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lock_deinit 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deinitialize the perf lock parameters 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPerfLock::lock_deinit() 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable) { 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 180d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 181d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mActivePowerHints.empty() == false) { 182d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Disable the active power hint 183d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mCurrentPowerHint = *mActivePowerHints.begin(); 184d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch powerHintInternal(mCurrentPowerHint, false); 185d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mActivePowerHints.clear(); 186d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 187d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 188d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if ((NULL != perf_lock_rel) && (mPerfLockHandleTimed >= 0)) { 189d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (*perf_lock_rel)(mPerfLockHandleTimed); 190d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 191d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 192d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if ((NULL != perf_lock_rel) && (mPerfLockHandle >= 0)) { 193d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch (*perf_lock_rel)(mPerfLockHandle); 194d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 195d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mDlHandle) { 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_acq = NULL; 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin perf_lock_rel = NULL; 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dlclose(mDlHandle); 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mDlHandle = NULL; 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockEnable = 0; 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isTimerReset 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Check if timout duration is reached 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true if timeout reached 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * false if timeout not reached 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraPerfLock::isTimerReset() 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable && mTimerSet) { 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t timeDiff = systemTime() - mStartTimeofLock; 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ns2ms(timeDiff) > (uint32_t)mPerfLockTimeout) { 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin resetTimer(); 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return true; 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : resetTimer 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Reset the timer used in timed perf lock 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPerfLock::resetTimer() 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockTimeout = 0; 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mTimerSet = 0; 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : start_timer 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the start of the timer 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @timer_val: timer duration in milliseconds 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPerfLock::startTimer(uint32_t timer_val) 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStartTimeofLock = systemTime(); 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mTimerSet = 1; 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockTimeout = timer_val; 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lock_acq_timed 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Acquire the performance lock for the specified duration. 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * If an existing lock timeout has not elapsed, extend the 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * lock further for the specified duration 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @timer_val: lock duration 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPerfLock::lock_acq_timed(int32_t timer_val) 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = -1; 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable) { 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t perf_lock_params[] = { 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ALL_CPUS_PWR_CLPS_DIS, 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CPU0_MIN_FREQ_TURBO_MAX, 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CPU4_MIN_FREQ_TURBO_MAX 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }; 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mTimerSet) { 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin nsecs_t curElapsedTime = systemTime() - mStartTimeofLock; 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t pendingTimeout = mPerfLockTimeout - ns2ms(curElapsedTime); 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin timer_val += pendingTimeout; 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin startTimer(timer_val); 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Disable power hint when acquiring the perf lock 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCurrentPowerHintEnable) { 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("mCurrentPowerHintEnable %d" ,mCurrentPowerHintEnable); 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(mCurrentPowerHint, false); 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != perf_lock_acq) && (mPerfLockHandleTimed < 0)) { 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = (*perf_lock_acq)(mPerfLockHandleTimed, timer_val, perf_lock_params, 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(perf_lock_params) / sizeof(int32_t)); 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("ret %d", ret); 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret < 0) { 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to acquire lock"); 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandleTimed = ret; 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("perf_handle_acq %d ", mPerfLockHandleTimed); 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lock_acq 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: acquire the performance lock 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPerfLock::lock_acq() 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = -1; 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable) { 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t perf_lock_params[] = { 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ALL_CPUS_PWR_CLPS_DIS, 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CPU0_MIN_FREQ_TURBO_MAX, 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CPU4_MIN_FREQ_TURBO_MAX 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin }; 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Disable power hint when acquiring the perf lock 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCurrentPowerHintEnable) { 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(mCurrentPowerHint, false); 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != perf_lock_acq) && (mPerfLockHandle < 0)) { 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = (*perf_lock_acq)(mPerfLockHandle, ONE_SEC, perf_lock_params, 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(perf_lock_params) / sizeof(int32_t)); 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("ret %d", ret); 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret < 0) { 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to acquire lock"); 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandle = ret; 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("perf_handle_acq %d ", mPerfLockHandle); 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lock_rel_timed 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release the performance lock 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPerfLock::lock_rel_timed() 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = -1; 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable) { 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockHandleTimed < 0) { 395d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGW("mPerfLockHandle < 0,check if lock is acquired"); 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("perf_handle_rel %d ", mPerfLockHandleTimed); 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != perf_lock_rel) && (0 <= mPerfLockHandleTimed)) { 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = (*perf_lock_rel)(mPerfLockHandleTimed); 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret < 0) { 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to release lock"); 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandleTimed = -1; 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin resetTimer(); 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mCurrentPowerHintEnable == 1) && (mTimerSet == 0)) { 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(mCurrentPowerHint, mCurrentPowerHintEnable); 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : lock_rel 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release the performance lock 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPerfLock::lock_rel() 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret = -1; 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin Mutex::Autolock lock(mLock); 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockEnable) { 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPerfLockHandle < 0) { 437d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGW("mPerfLockHandle < 0,check if lock is acquired"); 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("perf_handle_rel %d ", mPerfLockHandle); 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != perf_lock_rel) && (0 <= mPerfLockHandle)) { 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = (*perf_lock_rel)(mPerfLockHandle); 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret < 0) { 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("failed to release lock"); 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPerfLockHandle = -1; 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCurrentPowerHintEnable == 1) { 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(mCurrentPowerHint, mCurrentPowerHintEnable); 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : powerHintInternal 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Sets the requested power hint and state to power HAL. 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * hint : Power hint 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * enable : Enable power hint if set to 1. Disable if set to 0. 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPerfLock::powerHintInternal(power_hint_t hint, bool enable) 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef HAS_MULTIMEDIA_HINTS 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_pPowerModule != NULL) { 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enable == true) { 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pPowerModule->powerHint(m_pPowerModule, hint, (void *)"state=1"); 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pPowerModule->powerHint(m_pPowerModule, hint, (void *)"state=0"); 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : powerHint 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Updates the list containing active/enabled power hints. 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * If needed, calls the internal powerHint function with 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * requested power hint and state. 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * hint : Power hint 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * enable : Enable power hint if set to 1. Disable if set to 0. 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : void 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPerfLock::powerHint(power_hint_t hint, bool enable) 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef HAS_MULTIMEDIA_HINTS 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (enable == true) { 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((hint != mCurrentPowerHint) || (enable != mCurrentPowerHintEnable)) { 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Disable the current active power hint 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCurrentPowerHintEnable == true) { 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(mCurrentPowerHint, false); 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Push the new power hint at the head of the active power hint list 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mActivePowerHints.push_front(hint); 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Set the new power hint 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHint = hint; 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHintEnable = enable; 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(hint, enable); 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Remove the power hint from the list 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (List<power_hint_t>::iterator it = mActivePowerHints.begin(); 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin it != mActivePowerHints.end(); ++it) { 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (*it == hint) { 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (it != mActivePowerHints.begin()) { 517d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGW("Request to remove the previous power hint: %d instead of " 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "currently active power hint: %d", static_cast<int>(hint), 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin static_cast<int>(mCurrentPowerHint)); 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 521d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mActivePowerHints.erase(it); 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hint == mCurrentPowerHint) { 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Disable the power hint 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(hint, false); 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If the active power hint list is not empty, 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // restore the previous power hint from the head of the list 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mActivePowerHints.empty() == false) { 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHint = *mActivePowerHints.begin(); 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHintEnable = true; 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin powerHintInternal(mCurrentPowerHint, true); 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHint = static_cast<power_hint_t>(0); 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurrentPowerHintEnable = false; 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 546