10b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/* Copyright (c) 2015, The Linux Foundataion. All rights reserved.
20b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*
30b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* Redistribution and use in source and binary forms, with or without
40b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* modification, are permitted provided that the following conditions are
50b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* met:
60b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*     * Redistributions of source code must retain the above copyright
70b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*       notice, this list of conditions and the following disclaimer.
80b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*     * Redistributions in binary form must reproduce the above
90b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*       copyright notice, this list of conditions and the following
100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*       disclaimer in the documentation and/or other materials provided
110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*       with the distribution.
120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*     * Neither the name of The Linux Foundation nor the names of its
130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*       contributors may be used to endorse or promote products derived
140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*       from this software without specific prior written permission.
150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*
160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*
280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam*/
290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <stdio.h>
310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <fcntl.h>
320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <linux/media.h>
330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <media/msmb_camera.h>
340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <media/msm_cam_sensor.h>
350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include <utils/Log.h>
360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include "HAL3/QCamera3HWI.h"
380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#include "QCameraFlash.h"
390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam#define STRING_LENGTH_OF_64_BIT_NUMBER 21
410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamvolatile uint32_t gCamHal3LogLevel = 1;
430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamnamespace qcamera {
450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : getInstance
480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Get and create the QCameraFlash singleton.
500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None
520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     : None
540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd TamQCameraFlash& QCameraFlash::getInstance()
560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    static QCameraFlash flashInstance;
580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return flashInstance;
590b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : QCameraFlash
630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: default constructor of QCameraFlash
650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None
670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     : None
690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd TamQCameraFlash::QCameraFlash() : m_callbacks(NULL)
710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    memset(&m_flashOn, 0, sizeof(m_flashOn));
730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    memset(&m_cameraOpen, 0, sizeof(m_cameraOpen));
740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    for (int pos = 0; pos < MM_CAMERA_MAX_NUM_SENSORS; pos++) {
750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        m_flashFds[pos] = -1;
760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : ~QCameraFlash
810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: deconstructor of QCameraFlash
830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None
850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     : None
870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd TamQCameraFlash::~QCameraFlash()
890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    for (int pos = 0; pos < MM_CAMERA_MAX_NUM_SENSORS; pos++) {
910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (m_flashFds[pos] >= 0)
920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            {
930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                setFlashMode(pos, false);
940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                close(m_flashFds[pos]);
950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                m_flashFds[pos] = -1;
960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            }
970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
1010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : registerCallbacks
1020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
1030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: provide flash module with reference to callbacks to framework
1040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
1050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS : None
1060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
1070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     : None
1080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
1090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::registerCallbacks(
1100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        const camera_module_callbacks_t* callbacks)
1110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
1120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    int32_t retVal = 0;
1130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    m_callbacks = callbacks;
1140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return retVal;
1150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
1160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
1180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : initFlash
1190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
1200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Reserve and initialize the flash unit associated with a
1210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              given camera id. This function is blocking until the
1220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              operation completes or fails. Each flash unit can be "inited"
1230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              by only one process at a time.
1240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
1250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS :
1260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   @camera_id : Camera id of the flash.
1270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
1280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     :
1290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   0        : success
1300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EBUSY   : The flash unit or the resource needed to turn on the
1310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              the flash is busy, typically because the flash is
1320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              already in use.
1330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EINVAL  : No flash present at camera_id.
1340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
1350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::initFlash(const int camera_id)
1360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
1370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    int32_t retVal = 0;
1380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    bool hasFlash = false;
1390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    char flashNode[QCAMERA_MAX_FILEPATH_LENGTH];
1400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    char flashPath[QCAMERA_MAX_FILEPATH_LENGTH] = "/dev/";
1410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) {
1430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: Invalid camera id: %d", __func__, camera_id);
1440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        return -EINVAL;
1450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
1460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    QCamera3HardwareInterface::getFlashInfo(camera_id,
1480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            hasFlash,
1490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            flashNode);
1500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    strlcat(flashPath,
1520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            flashNode,
1530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            sizeof(flashPath));
1540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    if (!hasFlash) {
1560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: No flash available for camera id: %d",
1570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                __func__,
1580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                camera_id);
159a4bd7fb36dc2ca78aa0433a537b4f4a88a22f4c0Shuzhen Wang        retVal = -ENOSYS;
1600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (m_cameraOpen[camera_id]) {
1610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: Camera in use for camera id: %d",
1620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                __func__,
1630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                camera_id);
1640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EBUSY;
1650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (m_flashFds[camera_id] >= 0) {
1660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        CDBG("%s: Flash is already inited for camera id: %d",
1670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                __func__,
1680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                camera_id);
1690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else {
1700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        m_flashFds[camera_id] = open(flashPath, O_RDWR | O_NONBLOCK);
1710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (m_flashFds[camera_id] < 0) {
1730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            ALOGE("%s: Unable to open node '%s'",
1740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    __func__,
1750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    flashPath);
1760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            retVal = -EBUSY;
1770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        } else {
1780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            struct msm_flash_cfg_data_t cfg;
1790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            struct msm_flash_init_info_t init_info;
1800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            memset(&cfg, 0, sizeof(struct msm_flash_cfg_data_t));
1810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            memset(&init_info, 0, sizeof(struct msm_flash_init_info_t));
1820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            init_info.flash_driver_type = FLASH_DRIVER_DEFAULT;
1830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            cfg.cfg.flash_init_info = &init_info;
1840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            cfg.cfg_type = CFG_FLASH_INIT;
1850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            retVal = ioctl(m_flashFds[camera_id],
1860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    VIDIOC_MSM_FLASH_CFG,
1870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    &cfg);
1880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            if (retVal < 0) {
1890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                ALOGE("%s: Unable to init flash for camera id: %d",
1900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                        __func__,
1910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                        camera_id);
1920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                close(m_flashFds[camera_id]);
1930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                m_flashFds[camera_id] = -1;
1940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            }
1950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
1960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            /* wait for PMIC to init */
1970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            usleep(5000);
1980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        }
1990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
2000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    CDBG("%s: X, retVal = %d", __func__, retVal);
2020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return retVal;
2030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
2040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
2060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : setFlashMode
2070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
2080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Turn on or off the flash associated with a given handle.
2090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              This function is blocking until the operation completes or
2100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              fails.
2110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
2120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS :
2130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   @camera_id  : Camera id of the flash
2140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   @on         : Whether to turn flash on (true) or off (false)
2150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
2160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     :
2170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   0        : success
2180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EINVAL  : No camera present at camera_id, or it is not inited.
2190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EALREADY: Flash is already in requested state
2200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
2210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::setFlashMode(const int camera_id, const bool mode)
2220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
2230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    int32_t retVal = 0;
2240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    struct msm_flash_cfg_data_t cfg;
2250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) {
2270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: Invalid camera id: %d", __func__, camera_id);
2280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EINVAL;
2290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (mode == m_flashOn[camera_id]) {
2300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        CDBG("%s: flash %d is already in requested state: %d",
2310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                __func__,
2320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                camera_id,
2330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                mode);
2340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EALREADY;
2350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (m_flashFds[camera_id] < 0) {
2360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: called for uninited flash: %d", __func__, camera_id);
2370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EINVAL;
2380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }  else {
2390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        memset(&cfg, 0, sizeof(struct msm_flash_cfg_data_t));
2400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        for (int i = 0; i < MAX_LED_TRIGGERS; i++)
2410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            cfg.flash_current[i] = QCAMERA_TORCH_CURRENT_VALUE;
2420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        cfg.cfg_type = mode ? CFG_FLASH_LOW: CFG_FLASH_OFF;
2430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = ioctl(m_flashFds[camera_id],
2450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                        VIDIOC_MSM_FLASH_CFG,
2460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                        &cfg);
2470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (retVal < 0)
2480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            ALOGE("%s: Unable to change flash mode to %d for camera id: %d",
2490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    __func__, mode, camera_id);
2500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        else
2510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            m_flashOn[camera_id] = mode;
2520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
2530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return retVal;
2540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
2550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
2570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : deinitFlash
2580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
2590b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Release the flash unit associated with a given camera
2600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              position. This function is blocking until the operation
2610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              completes or fails.
2620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
2630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS :
2640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   @camera_id : Camera id of the flash.
2650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
2660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     :
2670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   0        : success
2680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EINVAL  : No camera present at camera_id or not inited.
2690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
2700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::deinitFlash(const int camera_id)
2710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
2720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    int32_t retVal = 0;
2730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) {
2750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: Invalid camera id: %d", __func__, camera_id);
2760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EINVAL;
2770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (m_flashFds[camera_id] < 0) {
2780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: called deinitFlash for uninited flash", __func__);
2790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EINVAL;
2800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else {
2810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        setFlashMode(camera_id, false);
2820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        struct msm_flash_cfg_data_t cfg;
2840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        cfg.cfg_type = CFG_FLASH_RELEASE;
2850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = ioctl(m_flashFds[camera_id],
2860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                VIDIOC_MSM_FLASH_CFG,
2870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                &cfg);
2880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (retVal < 0) {
2890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            ALOGE("%s: Failed to release flash for camera id: %d",
2900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    __func__,
2910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    camera_id);
2920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        }
2930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        close(m_flashFds[camera_id]);
2950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        m_flashFds[camera_id] = -1;
2960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
2970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
2980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return retVal;
2990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
3000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
3020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : reserveFlashForCamera
3030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
3040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Give control of the flash to the camera, and notify
3050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              framework that the flash has become unavailable.
3060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
3070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS :
3080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   @camera_id : Camera id of the flash.
3090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
3100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     :
3110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   0        : success
3120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EINVAL  : No camera present at camera_id or not inited.
3130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -ENOSYS  : No callback available for torch_mode_status_change.
3140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
3150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::reserveFlashForCamera(const int camera_id)
3160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
3170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    int32_t retVal = 0;
3180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) {
3200b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: Invalid camera id: %d", __func__, camera_id);
3210b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EINVAL;
3220b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (m_cameraOpen[camera_id]) {
3230b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        CDBG("%s: Flash already reserved for camera id: %d",
3240b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                __func__,
3250b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                camera_id);
3260b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else {
3270b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (m_flashOn[camera_id]) {
3280b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            setFlashMode(camera_id, false);
3290b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            deinitFlash(camera_id);
3300b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        }
3310b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        m_cameraOpen[camera_id] = true;
3320b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3330b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        bool hasFlash = false;
3340b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        char flashNode[QCAMERA_MAX_FILEPATH_LENGTH];
3350b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3360b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        QCamera3HardwareInterface::getFlashInfo(camera_id,
3370b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                hasFlash,
3380b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                flashNode);
3390b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3400b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (m_callbacks == NULL ||
3410b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                m_callbacks->torch_mode_status_change == NULL) {
3420b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            ALOGE("%s: Callback is not defined!", __func__);
3430b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            retVal = -ENOSYS;
3440b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        } else if (!hasFlash) {
3450b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            CDBG("%s: Suppressing callback "
3460b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    "because no flash exists for camera id: %d",
3470b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    __func__,
3480b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    camera_id);
3490b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        } else {
3500b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            char cameraIdStr[STRING_LENGTH_OF_64_BIT_NUMBER];
3510b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            snprintf(cameraIdStr, STRING_LENGTH_OF_64_BIT_NUMBER,
3520b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    "%d", camera_id);
3530b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            m_callbacks->torch_mode_status_change(m_callbacks,
3540b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    cameraIdStr,
3550b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    TORCH_MODE_STATUS_NOT_AVAILABLE);
3560b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        }
3570b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
3580b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3590b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return retVal;
3600b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
3610b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3620b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam/*===========================================================================
3630b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * FUNCTION   : releaseFlashFromCamera
3640b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
3650b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * DESCRIPTION: Release control of the flash from the camera, and notify
3660b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *              framework that the flash has become available.
3670b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
3680b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * PARAMETERS :
3690b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   @camera_id : Camera id of the flash.
3700b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *
3710b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam * RETURN     :
3720b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   0        : success
3730b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -EINVAL  : No camera present at camera_id or not inited.
3740b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *   -ENOSYS  : No callback available for torch_mode_status_change.
3750b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam *==========================================================================*/
3760b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tamint32_t QCameraFlash::releaseFlashFromCamera(const int camera_id)
3770b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam{
3780b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    int32_t retVal = 0;
3790b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3800b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    if (camera_id < 0 || camera_id >= MM_CAMERA_MAX_NUM_SENSORS) {
3810b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        ALOGE("%s: Invalid camera id: %d", __func__, camera_id);
3820b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        retVal = -EINVAL;
3830b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else if (!m_cameraOpen[camera_id]) {
3840b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        CDBG("%s: Flash not reserved for camera id: %d",
3850b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                __func__,
3860b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                camera_id);
3870b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    } else {
3880b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        m_cameraOpen[camera_id] = false;
3890b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3900b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        bool hasFlash = false;
3910b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        char flashNode[QCAMERA_MAX_FILEPATH_LENGTH];
3920b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3930b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        QCamera3HardwareInterface::getFlashInfo(camera_id,
3940b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                hasFlash,
3950b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                flashNode);
3960b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
3970b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        if (m_callbacks == NULL ||
3980b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                m_callbacks->torch_mode_status_change == NULL) {
3990b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            ALOGE("%s: Callback is not defined!", __func__);
4000b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            retVal = -ENOSYS;
4010b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        } else if (!hasFlash) {
4020b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            CDBG("%s: Suppressing callback "
4030b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    "because no flash exists for camera id: %d",
4040b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    __func__,
4050b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    camera_id);
4060b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        } else {
4070b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            char cameraIdStr[STRING_LENGTH_OF_64_BIT_NUMBER];
4080b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            snprintf(cameraIdStr, STRING_LENGTH_OF_64_BIT_NUMBER,
4090b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    "%d", camera_id);
4100b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam            m_callbacks->torch_mode_status_change(m_callbacks,
4110b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    cameraIdStr,
4120b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam                    TORCH_MODE_STATUS_AVAILABLE_OFF);
4130b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam        }
4140b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    }
4150b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
4160b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam    return retVal;
4170b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}
4180b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam
4190b22217da5945fcfef82ce2c0e0ccb2de2fb63ecEd Tam}; // namespace qcamera
420