Camera3: Add poll fd in QBUF as asynchronous call

Without this change, there is deadlock when both Data_notify and
Qbuf are coming at same time i.e, data_notify is waiting for buf_lock
mutex which acquired by qbuf and qbuf-> Add poll fd is waiting for
data_notify to finish.

Adding Poll fd in asynchronous way i.e, POLL FD need not to wait for
data_notify cb's to finish.

Bug: 10998587
Change-Id: I574b25378639f5bc10b753af06b6d729261ee11d
diff --git a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
index 6d80db7..034aab8 100644
--- a/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
+++ b/camera/QCamera2/stack/mm-camera-interface/inc/mm_camera.h
@@ -561,7 +561,8 @@
                                 uint32_t handler,
                                 int32_t fd,
                                 mm_camera_poll_notify_t nofity_cb,
-                                void *userdata);
+                                void *userdata,
+                                mm_camera_call_type_t);
 extern int32_t mm_camera_poll_thread_del_poll_fd(
                                 mm_camera_poll_thread_t * poll_cb,
                                 uint32_t handler,
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
index 07b918e..60c5f78 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera.c
@@ -1448,7 +1448,8 @@
                                                my_obj->my_hdl,
                                                my_obj->ctrl_fd,
                                                mm_camera_event_notify,
-                                               (void*)my_obj);
+                                               (void*)my_obj,
+                                               mm_camera_sync_call);
     }
     return rc;
 }
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
index cd87fae..89e0c48 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_stream.c
@@ -1167,7 +1167,8 @@
                 my_obj->my_hdl,
                 my_obj->fd,
                 mm_stream_data_notify,
-                (void*)my_obj);
+                (void*)my_obj,
+                mm_camera_async_call);
         CDBG_HIGH("%s: Started poll on stream %p type :%d", __func__, my_obj,my_obj->stream_info->stream_type);
         if (rc < 0) {
             ALOGE("%s: add poll fd error", __func__);
diff --git a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
index 1f65ecb..074af3b 100644
--- a/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
+++ b/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_thread.c
@@ -370,6 +370,7 @@
  *   @fd        : file descriptor need to be added into polling thread
  *   @notify_cb : callback function to handle if any notify from fd
  *   @userdata  : user data ptr
+ *   @call_type : Whether its Synchronous or Asynchronous call
  *
  * RETURN     : none
  *==========================================================================*/
@@ -377,7 +378,8 @@
                                           uint32_t handler,
                                           int32_t fd,
                                           mm_camera_poll_notify_t notify_cb,
-                                          void* userdata)
+                                          void* userdata,
+                                          mm_camera_call_type_t call_type)
 {
     int32_t rc = -1;
     uint8_t idx = 0;
@@ -396,7 +398,11 @@
         poll_cb->poll_entries[idx].notify_cb = notify_cb;
         poll_cb->poll_entries[idx].user_data = userdata;
         /* send poll entries updated signal to poll thread */
-        rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
+        if (call_type == mm_camera_sync_call ) {
+            rc = mm_camera_poll_sig(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED);
+        } else {
+            rc = mm_camera_poll_sig_async(poll_cb, MM_CAMERA_PIPE_CMD_POLL_ENTRIES_UPDATED_ASYNC );
+        }
     } else {
         CDBG_ERROR("%s: invalid handler %d (%d)",
                    __func__, handler, idx);