int32_t mm_camera_close(mm_camera_obj_t *my_obj)
{
    int i, rc = 0;

    for(i = 0; i < MM_CAMERA_CH_MAX; i++){
        mm_camera_ch_fn(my_obj, (mm_camera_channel_type_t)i,
                                MM_CAMERA_STATE_EVT_RELEASE, NULL);
    }

    CDBG("%s : Close Threads in Cam Close",__func__);
    for(i = 0; i < MM_CAMERA_CH_MAX; i++) {
        mm_camera_poll_thread_release(my_obj,(mm_camera_channel_type_t)i);
    }
    mm_camera_poll_threads_deinit(my_obj);
    my_obj->op_mode = MM_CAMERA_OP_MODE_NOTUSED;
    if(my_obj->ctrl_fd > 0) {
        mm_camera_histo_mmap(my_obj, NULL);
        rc = close(my_obj->ctrl_fd);
        if(rc < 0) {
            /* this is a dead end. */
            CDBG("%s: !!!!FATAL ERROR!!!! ctrl_fd = %d, rc = %d",
                 __func__, my_obj->ctrl_fd, rc);
        }
        my_obj->ctrl_fd = 0;
    }
    if(my_obj->ds_fd > 0) {
        mm_camera_socket_close(my_obj->ds_fd);
        my_obj->ds_fd = 0;
    }
    return MM_CAMERA_OK;
}
void mm_camera_msm_evt_notify(mm_camera_obj_t * my_obj, int fd)
{
    struct v4l2_event ev;
    int rc;
    mm_camera_event_t *evt = NULL;

    memset(&ev, 0, sizeof(ev));
    rc = ioctl(fd, VIDIOC_DQEVENT, &ev);
    evt = (mm_camera_event_t *)ev.u.data;

    if (rc >= 0) {
//        CDBG("%s: VIDIOC_DQEVENT type = 0x%x, app event type = %d\n",
//            __func__, ev.type, evt->event_type);
        switch(evt->event_type) {
        case MM_CAMERA_EVT_TYPE_INFO:
            switch(evt->e.info.event_id) {
            case MM_CAMERA_INFO_EVT_HISTO_MEM_INFO:
                /* now mm_camear_interface2 hides the
                 * pmem mapping logic from HAL */
                mm_camera_histo_mmap(my_obj, evt);
                return;
            default:
                break;
            }
            break;
        case MM_CAMERA_EVT_TYPE_STATS:
            switch(evt->e.stats.event_id) {
            case MM_CAMERA_STATS_EVT_HISTO:
                rc = mm_camera_histo_fill_vaddr(my_obj, evt);
                if(rc != MM_CAMERA_OK) {
                    CDBG("%s:cannot find histo stat's vaddr (cookie=0x%x)",
                        __func__, evt->e.stats.e.stats_histo.cookie);
                    return;
                }
                break;
           default:
               break;
           }
           break;
        default:
            break;
        }
        mm_camera_dispatch_app_event(my_obj, evt);
    }
}