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