16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <pthread.h> 316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <errno.h> 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/ioctl.h> 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/types.h> 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/stat.h> 356a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab#include <sys/prctl.h> 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <fcntl.h> 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <poll.h> 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cam_semaphore.h> 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_camera_dbg.h" 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_camera_interface.h" 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_camera.h" 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef enum { 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* poll entries updated */ 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED, 47b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab /* poll entries updated */ 48b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC, 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* exit */ 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MM_CAMERA_PIPE_CMD_EXIT, 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* max count */ 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MM_CAMERA_PIPE_CMD_MAX 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} mm_camera_pipe_cmd_type_t; 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef enum { 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MM_CAMERA_POLL_TASK_STATE_STOPPED, 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MM_CAMERA_POLL_TASK_STATE_POLL, /* polling pid in polling state. */ 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev MM_CAMERA_POLL_TASK_STATE_MAX 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} mm_camera_poll_task_state_type_t; 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t cmd; 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_event_t event; 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} mm_camera_sig_evt_t; 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 66b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 67b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab/*=========================================================================== 68b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * FUNCTION : mm_camera_poll_sig_async 69b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * 70b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * DESCRIPTION: Asynchoronous call to send a command through pipe. 71b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * 72b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * PARAMETERS : 73b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * @poll_cb : ptr to poll thread object 74b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * @cmd : command to be sent 75b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * 76b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * RETURN : int32_t type of status 77b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * 0 -- success 78b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab * -1 -- failure 79b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab *==========================================================================*/ 80b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftabstatic int32_t mm_camera_poll_sig_async(mm_camera_poll_thread_t *poll_cb, 81b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab uint32_t cmd) 82b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab{ 83b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab /* send through pipe */ 84b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab /* get the mutex */ 85b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab mm_camera_sig_evt_t cmd_evt; 86b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab int len; 87b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 88b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab CDBG("%s: E cmd = %d", __func__,cmd); 89b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab memset(&cmd_evt, 0, sizeof(cmd_evt)); 90b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab cmd_evt.cmd = cmd; 91b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab pthread_mutex_lock(&poll_cb->mutex); 92b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab /* reset the statue to false */ 93b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab poll_cb->status = FALSE; 94b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab /* send cmd to worker */ 95b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 96b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab len = write(poll_cb->pfds[1], &cmd_evt, sizeof(cmd_evt)); 97b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab if(len < 1) { 98b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab CDBG_ERROR("%s: len = %d, errno = %d", __func__, len, errno); 99b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab /* Avoid waiting for the signal */ 100b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab pthread_mutex_unlock(&poll_cb->mutex); 101b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab return 0; 102b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab } 103b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab CDBG("%s: begin IN mutex write done, len = %d", __func__, len); 104b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab pthread_mutex_unlock(&poll_cb->mutex); 105b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab CDBG("%s: X", __func__); 106b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab return 0; 107b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab} 108b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 109b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 110b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 111b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_sig 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: synchorinzed call to send a command through pipe. 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cmd : command to be sent 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 0 -- success 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * -1 -- failure 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic int32_t mm_camera_poll_sig(mm_camera_poll_thread_t *poll_cb, 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t cmd) 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* send through pipe */ 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* get the mutex */ 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_sig_evt_t cmd_evt; 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int len; 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: E cmd = %d", __func__,cmd); 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cmd_evt, 0, sizeof(cmd_evt)); 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cmd_evt.cmd = cmd; 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&poll_cb->mutex); 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* reset the statue to false */ 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->status = FALSE; 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* send cmd to worker */ 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev len = write(poll_cb->pfds[1], &cmd_evt, sizeof(cmd_evt)); 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(len < 1) { 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: len = %d, errno = %d", __func__, len, errno); 144744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy /* Avoid waiting for the signal */ 145744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pthread_mutex_unlock(&poll_cb->mutex); 146744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy return 0; 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: begin IN mutex write done, len = %d", __func__, len); 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* wait till worker task gives positive signal */ 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (FALSE == poll_cb->status) { 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: wait", __func__); 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_wait(&poll_cb->cond_v, &poll_cb->mutex); 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* done */ 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&poll_cb->mutex); 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: X", __func__); 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return 0; 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_sig 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: signal the status of done 1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void mm_camera_poll_sig_done(mm_camera_poll_thread_t *poll_cb) 1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&poll_cb->mutex); 1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->status = TRUE; 1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_signal(&poll_cb->cond_v); 1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: done, in mutex", __func__); 1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&poll_cb->mutex); 1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_set_state 1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set a polling state 1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @state : polling state (stopped/polling) 1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void mm_camera_poll_set_state(mm_camera_poll_thread_t *poll_cb, 1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_task_state_type_t state) 1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->state = state; 1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_proc_pipe 1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: polling thread routine to process pipe 2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void mm_camera_poll_proc_pipe(mm_camera_poll_thread_t *poll_cb) 2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ssize_t read_len; 2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int i; 2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_sig_evt_t cmd_evt; 2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev read_len = read(poll_cb->pfds[0], &cmd_evt, sizeof(cmd_evt)); 2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: read_fd = %d, read_len = %d, expect_len = %d cmd = %d", 2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, poll_cb->pfds[0], (int)read_len, (int)sizeof(cmd_evt), cmd_evt.cmd); 2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (cmd_evt.cmd) { 2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED: 216b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab case MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC: 2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* we always have index 0 for pipe read */ 2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->num_fds = 0; 2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].fd = poll_cb->pfds[0]; 2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].events = POLLIN|POLLRDNORM|POLLPRI; 2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->num_fds++; 2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (MM_CAMERA_POLL_TYPE_EVT == poll_cb->poll_type) { 2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (poll_cb->poll_entries[0].fd > 0) { 2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* fd is valid, we update poll_fds */ 2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].fd = poll_cb->poll_entries[0].fd; 2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].events = POLLIN|POLLRDNORM|POLLPRI; 2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->num_fds++; 2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (MM_CAMERA_POLL_TYPE_DATA == poll_cb->poll_type) { 2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for(i = 0; i < MAX_STREAM_NUM_IN_BUNDLE; i++) { 2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(poll_cb->poll_entries[i].fd > 0) { 2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* fd is valid, we update poll_fds to this fd */ 2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].fd = poll_cb->poll_entries[i].fd; 2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].events = POLLIN|POLLRDNORM|POLLPRI; 2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->num_fds++; 2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* fd is invalid, we set the entry to -1 to prevent polling. 2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * According to spec, polling will not poll on entry with fd=-1. 2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * If this is not the case, we need to skip these invalid fds 2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * when updating this array. 2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * We still keep fd=-1 in this array because this makes easier to 2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * map cb associated with this fd once incoming data avail by directly 2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * using the index-1(0 is reserved for pipe read, so need to reduce index by 1) */ 2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].fd = -1; 2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds].events = 0; 2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->num_fds++; 2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 251b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab if (cmd_evt.cmd != MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC) 252b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab mm_camera_poll_sig_done(poll_cb); 2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_PIPE_CMD_EXIT: 2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_set_state(poll_cb, MM_CAMERA_POLL_TASK_STATE_STOPPED); 2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_sig_done(poll_cb); 2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_fn 2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: polling thread routine 2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void *mm_camera_poll_fn(mm_camera_poll_thread_t *poll_cb) 2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = 0, i; 2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: poll type = %d, num_fd = %d poll_cb = %p\n", 2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, poll_cb->poll_type, poll_cb->num_fds,poll_cb); 2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev do { 2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for(i = 0; i < poll_cb->num_fds; i++) { 2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[i].events = POLLIN|POLLRDNORM|POLLPRI; 2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = poll(poll_cb->poll_fds, poll_cb->num_fds, poll_cb->timeoutms); 2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc > 0) { 2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ((poll_cb->poll_fds[0].revents & POLLIN) && 2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (poll_cb->poll_fds[0].revents & POLLRDNORM)) { 2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* if we have data on pipe, we only process pipe in this iteration */ 2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: cmd received on pipe\n", __func__); 2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_proc_pipe(poll_cb); 2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for(i=1; i<poll_cb->num_fds; i++) { 2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* Checking for ctrl events */ 2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ((poll_cb->poll_type == MM_CAMERA_POLL_TYPE_EVT) && 2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (poll_cb->poll_fds[i].revents & POLLPRI)) { 2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: mm_camera_evt_notify\n", __func__); 2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != poll_cb->poll_entries[i-1].notify_cb) { 2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[i-1].notify_cb(poll_cb->poll_entries[i-1].user_data); 2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ((MM_CAMERA_POLL_TYPE_DATA == poll_cb->poll_type) && 3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (poll_cb->poll_fds[i].revents & POLLIN) && 3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (poll_cb->poll_fds[i].revents & POLLRDNORM)) { 3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: mm_stream_data_notify\n", __func__); 3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != poll_cb->poll_entries[i-1].notify_cb) { 3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[i-1].notify_cb(poll_cb->poll_entries[i-1].user_data); 3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* in error case sleep 10 us and then continue. hard coded here */ 3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev usleep(10); 3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev continue; 3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } while (poll_cb->state == MM_CAMERA_POLL_TASK_STATE_POLL); 3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_thread 3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: polling thread entry function 3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : ptr to poll thread object 3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void *mm_camera_poll_thread(void *data) 3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3336a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab prctl(PR_SET_NAME, (unsigned long)"mm_cam_poll_th", 0, 0, 0); 3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_thread_t *poll_cb = (mm_camera_poll_thread_t *)data; 3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* add pipe read fd into poll first */ 3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_fds[poll_cb->num_fds++].fd = poll_cb->pfds[0]; 3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_sig_done(poll_cb); 3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_set_state(poll_cb, MM_CAMERA_POLL_TASK_STATE_POLL); 3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mm_camera_poll_fn(poll_cb); 3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_thread 3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: notify the polling thread that entries for polling fd have 3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * been updated 3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_poll_thread_notify_entries_updated(mm_camera_poll_thread_t * poll_cb) 3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* send poll entries updated signal to poll thread */ 3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED); 3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_thread_add_poll_fd 3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a new fd into polling thread 3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @handler : stream handle if channel data polling thread, 3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 0 if event polling thread 3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @fd : file descriptor need to be added into polling thread 3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @notify_cb : callback function to handle if any notify from fd 3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @userdata : user data ptr 37350906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang * @call_type : Whether its Synchronous or Asynchronous call 3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_poll_thread_add_poll_fd(mm_camera_poll_thread_t * poll_cb, 3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t handler, 3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t fd, 3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_notify_t notify_cb, 38150906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang void* userdata, 38250906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang mm_camera_call_type_t call_type) 3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = -1; 3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t idx = 0; 3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (MM_CAMERA_POLL_TYPE_DATA == poll_cb->poll_type) { 3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* get stream idx from handler if CH type */ 3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev idx = mm_camera_util_get_index_by_handler(handler); 3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* for EVT type, only idx=0 is valid */ 3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev idx = 0; 3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (MAX_STREAM_NUM_IN_BUNDLE > idx) { 3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].fd = fd; 3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].handler = handler; 3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].notify_cb = notify_cb; 3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].user_data = userdata; 4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* send poll entries updated signal to poll thread */ 40150906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang if (call_type == mm_camera_sync_call ) { 40250906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED); 40350906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang } else { 40450906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang rc = mm_camera_poll_sig_async(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC ); 40550906e4f6b6c8058ae8d2c59eccf142918621904Shuzhen Wang } 4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: invalid handler %d (%d)", 4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, handler, idx); 4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : mm_camera_poll_thread_del_poll_fd 4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: delete a fd from polling thread 4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @poll_cb : ptr to poll thread object 4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @handler : stream handle if channel data polling thread, 4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 0 if event polling thread 4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_poll_thread_del_poll_fd(mm_camera_poll_thread_t * poll_cb, 426b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab uint32_t handler, 427b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab mm_camera_call_type_t call_type) 4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = -1; 4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t idx = 0; 4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (MM_CAMERA_POLL_TYPE_DATA == poll_cb->poll_type) { 4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* get stream idx from handler if CH type */ 4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev idx = mm_camera_util_get_index_by_handler(handler); 4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* for EVT type, only idx=0 is valid */ 4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev idx = 0; 4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ((MAX_STREAM_NUM_IN_BUNDLE > idx) && 4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (handler == poll_cb->poll_entries[idx].handler)) { 4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* reset poll entry */ 4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].fd = -1; /* set fd to invalid */ 4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].handler = 0; 4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_entries[idx].notify_cb = NULL; 4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* send poll entries updated signal to poll thread */ 448b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab if (call_type == mm_camera_sync_call ) { 449b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED); 450b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab } else { 451b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab rc = mm_camera_poll_sig_async(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC ); 452b16c077cdee23becd2ec0c353b8edde1368a8001Mansoor Aftab } 4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: invalid handler %d (%d)", 4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, handler, idx); 4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 461cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchevstatic pthread_mutex_t constr_destr_lock = PTHREAD_MUTEX_INITIALIZER; 462cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev 4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_poll_thread_launch(mm_camera_poll_thread_t * poll_cb, 4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_thread_type_t poll_type) 4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 467cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev 468cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev pthread_mutex_lock(&constr_destr_lock); 469cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev 4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->poll_type = poll_type; 4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->pfds[0] = 0; 4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->pfds[1] = 0; 4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pipe(poll_cb->pfds); 4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(rc < 0) { 4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: pipe open rc=%d\n", __func__, rc); 477cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev pthread_mutex_unlock(&constr_destr_lock); 4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -1; 4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->timeoutms = -1; /* Infinite seconds */ 4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: poll_type = %d, read fd = %d, write fd = %d timeout = %d", 4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, poll_cb->poll_type, 4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->pfds[0], poll_cb->pfds[1],poll_cb->timeoutms); 4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_init(&poll_cb->mutex, NULL); 4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_init(&poll_cb->cond_v, NULL); 4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* launch the thread */ 4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&poll_cb->mutex); 4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev poll_cb->status = 0; 4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_create(&poll_cb->pid, NULL, mm_camera_poll_thread, (void *)poll_cb); 4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(!poll_cb->status) { 4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_wait(&poll_cb->cond_v, &poll_cb->mutex); 4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&poll_cb->mutex); 4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: End",__func__); 499cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev pthread_mutex_unlock(&constr_destr_lock); 5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb) 5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 506cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev 507cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev pthread_mutex_lock(&constr_destr_lock); 508cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev 5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(MM_CAMERA_POLL_TASK_STATE_STOPPED == poll_cb->state) { 5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: err, poll thread is not running.\n", __func__); 511cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev goto done; 5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* send exit signal to poll thread */ 5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_EXIT); 5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* wait until poll thread exits */ 5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pthread_join(poll_cb->pid, NULL) != 0) { 5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: pthread dead already\n", __func__); 5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* close pipe */ 5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(poll_cb->pfds[0]) { 5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev close(poll_cb->pfds[0]); 5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(poll_cb->pfds[1]) { 5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev close(poll_cb->pfds[1]); 5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_destroy(&poll_cb->mutex); 5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_cond_destroy(&poll_cb->cond_v); 5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(poll_cb, 0, sizeof(mm_camera_poll_thread_t)); 532cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchevdone: 533cec66ac86f708fc88b0a812d9dacad1e2791402aIliyan Malchev pthread_mutex_unlock(&constr_destr_lock); 5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void *mm_camera_cmd_thread(void *data) 5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int running = 1; 5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret; 5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_cmd_thread_t *cmd_thread = 5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (mm_camera_cmd_thread_t *)data; 5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_cmdcb_t* node = NULL; 5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev do { 5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev do { 5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = cam_sem_wait(&cmd_thread->cmd_sem); 5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret != 0 && errno != EINVAL) { 5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: cam_sem_wait error (%s)", 5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, strerror(errno)); 5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } while (ret != 0); 5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* we got notified about new cmd avail in cmd queue */ 5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node = (mm_camera_cmdcb_t*)cam_queue_deq(&cmd_thread->cmd_queue); 5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev while (node != NULL) { 5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (node->cmd_type) { 5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_CMD_TYPE_EVT_CB: 5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_CMD_TYPE_DATA_CB: 5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_CMD_TYPE_REQ_DATA_CB: 5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB: 563744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy case MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY: 5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_CMD_TYPE_FLUSH_QUEUE: 5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != cmd_thread->cb) { 5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cmd_thread->cb(node, cmd_thread->user_data); 5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case MM_CAMERA_CMD_TYPE_EXIT: 5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev running = 0; 5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(node); 5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node = (mm_camera_cmdcb_t*)cam_queue_deq(&cmd_thread->cmd_queue); 5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } /* (node != NULL) */ 5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } while (running); 5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_cmd_thread_launch(mm_camera_cmd_thread_t * cmd_thread, 5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_cmd_cb_t cb, 5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void* user_data) 5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_sem_init(&cmd_thread->cmd_sem, 0); 5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_queue_init(&cmd_thread->cmd_queue); 5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cmd_thread->cb = cb; 5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cmd_thread->user_data = user_data; 5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* launch the thread */ 5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_create(&cmd_thread->cmd_pid, 5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, 5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_cmd_thread, 5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (void *)cmd_thread); 5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6006a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftabint32_t mm_camera_cmd_thread_name(const char* name) 6016a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab{ 6026a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab int32_t rc = 0; 6036a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab /* name the thread */ 6046a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab prctl(PR_SET_NAME, (unsigned long)name, 0, 0, 0); 6056a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab return rc; 6066a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab} 6076a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab 6086a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab 6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_cmd_thread_stop(mm_camera_cmd_thread_t * cmd_thread) 6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_cmdcb_t* node = (mm_camera_cmdcb_t *)malloc(sizeof(mm_camera_cmdcb_t)); 6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == node) { 6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG_ERROR("%s: No memory for mm_camera_cmdcb_t", __func__); 6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -1; 6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(node, 0, sizeof(mm_camera_cmdcb_t)); 6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node->cmd_type = MM_CAMERA_CMD_TYPE_EXIT; 6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_queue_enq(&cmd_thread->cmd_queue, node); 6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_sem_post(&cmd_thread->cmd_sem); 6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev /* wait until cmd thread exits */ 6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pthread_join(cmd_thread->cmd_pid, NULL) != 0) { 6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CDBG("%s: pthread dead already\n", __func__); 6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_cmd_thread_destroy(mm_camera_cmd_thread_t * cmd_thread) 6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_queue_deinit(&cmd_thread->cmd_queue); 6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_sem_destroy(&cmd_thread->cmd_sem); 6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(cmd_thread, 0, sizeof(mm_camera_cmd_thread_t)); 6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread) 6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mm_camera_cmd_thread_stop(cmd_thread); 6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (0 == rc) { 6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mm_camera_cmd_thread_destroy(cmd_thread); 6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 649