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