Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.c +41 −19 Original line number Diff line number Diff line Loading @@ -357,6 +357,27 @@ static long msm_isp_dqevent(struct file *file, struct v4l2_fh *vfh, void *arg) file->f_flags & O_NONBLOCK); if (rc) return rc; if (isp_event.type == ISP_EVENT_SOF_UPDATE_NANOSEC) { struct msm_isp_event_data_nanosec *event_data_nanosec; struct msm_isp_event_data_nanosec *event_data_nanosec_user; event_data_nanosec = (struct msm_isp_event_data_nanosec *) isp_event.u.data; isp_event_user = (struct v4l2_event *)arg; memcpy(isp_event_user, &isp_event, sizeof(*isp_event_user)); event_data_nanosec_user = (struct msm_isp_event_data_nanosec *) isp_event_user->u.data; memset(event_data_nanosec_user, 0, sizeof(struct msm_isp_event_data_nanosec)); event_data_nanosec_user->nano_timestamp = event_data_nanosec->nano_timestamp; event_data_nanosec_user->frame_id = event_data_nanosec->frame_id; } else { event_data = (struct msm_isp_event_data *) isp_event.u.data; isp_event_user = (struct v4l2_event *)arg; Loading @@ -377,6 +398,7 @@ static long msm_isp_dqevent(struct file *file, struct v4l2_fh *vfh, void *arg) event_data32->frame_id = event_data->frame_id; memcpy(&(event_data32->u), &(event_data->u), sizeof(event_data32->u)); } } else { rc = v4l2_event_dequeue(vfh, arg, file->f_flags & O_NONBLOCK); Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.h +5 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,8 @@ struct msm_isp_timestamp { struct timeval vt_time; /*Wall clock for userspace event*/ struct timeval event_time; /* event time in nanosec*/ uint64_t buf_time_ns; }; struct msm_vfe_irq_ops { Loading Loading @@ -874,6 +876,9 @@ struct vfe_device { /* irq info */ uint32_t dual_irq_mask; uint32_t irq_sof_id; /* nano sec timestamp */ uint32_t nanosec_ts_enable; }; struct vfe_parent_device { Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +13 −0 Original line number Diff line number Diff line Loading @@ -1150,6 +1150,19 @@ void msm_isp_notify(struct vfe_device *vfe_dev, uint32_t event_type, break; } if ((vfe_dev->nanosec_ts_enable) && (event_type == ISP_EVENT_SOF) && (frame_src == VFE_PIX_0)) { struct msm_isp_event_data_nanosec event_data_nanosec; event_data_nanosec.frame_id = vfe_dev->axi_data.src_info[frame_src].frame_id; event_data_nanosec.nano_timestamp = ts->buf_time_ns; msm_isp_send_event_update_nanosec(vfe_dev, ISP_EVENT_SOF_UPDATE_NANOSEC, &event_data_nanosec); } event_data.frame_id = vfe_dev->axi_data.src_info[frame_src].frame_id; event_data.timestamp = ts->event_time; event_data.mono_timestamp = ts->buf_time; Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +35 −1 Original line number Diff line number Diff line Loading @@ -218,6 +218,8 @@ void msm_isp_get_timestamp(struct msm_isp_timestamp *time_stamp, get_monotonic_boottime(&ts); time_stamp->buf_time.tv_sec = ts.tv_sec; time_stamp->buf_time.tv_usec = ts.tv_nsec/1000; time_stamp->buf_time_ns = ((uint64_t)ts.tv_sec * 1000000000) + ts.tv_nsec; } } Loading Loading @@ -265,6 +267,9 @@ static inline u32 msm_isp_evt_mask_to_isp_event(u32 evt_mask) case ISP_EVENT_MASK_INDEX_BUF_FATAL_ERROR: evt_id = ISP_EVENT_BUF_FATAL_ERROR; break; case ISP_EVENT_MASK_INDEX_SOF_UPDATE_NANOSEC: evt_id = ISP_EVENT_SOF_UPDATE_NANOSEC; break; default: evt_id = ISP_EVENT_SUBS_MASK_NONE; break; Loading Loading @@ -294,6 +299,7 @@ static inline int msm_isp_subscribe_event_mask(struct v4l2_fh *fh, } } } else if (evt_mask_index == ISP_EVENT_MASK_INDEX_SOF || evt_mask_index == ISP_EVENT_MASK_INDEX_SOF_UPDATE_NANOSEC || evt_mask_index == ISP_EVENT_MASK_INDEX_REG_UPDATE || evt_mask_index == ISP_EVENT_MASK_INDEX_STREAM_UPDATE_DONE) { for (interface = 0; interface < VFE_SRC_MAX; interface++) { Loading Loading @@ -339,7 +345,7 @@ static inline int msm_isp_process_event_subscription(struct v4l2_fh *fh, } for (evt_mask_index = ISP_EVENT_MASK_INDEX_STATS_NOTIFY; evt_mask_index <= ISP_EVENT_MASK_INDEX_BUF_FATAL_ERROR; evt_mask_index <= ISP_EVENT_MASK_INDEX_SOF_UPDATE_NANOSEC; evt_mask_index++) { if (evt_mask & (1<<evt_mask_index)) { evt_id = msm_isp_evt_mask_to_isp_event(evt_mask_index); Loading Loading @@ -537,6 +543,14 @@ static int msm_isp_set_dual_vfe_sync_mode( vfe_dev->dual_vfe_sync_enable = mode->enable; return 0; } static int msm_isp_nano_sec_timestamp( struct vfe_device *vfe_dev, void *arg) { struct msm_vfe_nano_sec_timestamp *mode = arg; vfe_dev->nanosec_ts_enable = mode->enable; return 0; } int msm_isp_cfg_input(struct vfe_device *vfe_dev, void *arg) { int rc = 0; Loading Loading @@ -1072,6 +1086,11 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd, rc = msm_isp_set_dual_vfe_sync_mode(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; case VIDIOC_MSM_ISP_NANOSEC_TIMESTAMP: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_nano_sec_timestamp(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; default: pr_err_ratelimited("%s: Invalid ISP command %x\n", __func__, cmd); Loading Loading @@ -1572,6 +1591,21 @@ int msm_isp_send_event(struct vfe_device *vfe_dev, return 0; } int msm_isp_send_event_update_nanosec(struct vfe_device *vfe_dev, uint32_t event_type, struct msm_isp_event_data_nanosec *event_data) { struct v4l2_event isp_event; memset(&isp_event, 0, sizeof(struct v4l2_event)); isp_event.id = 0; isp_event.type = event_type; memcpy(&isp_event.u.data[0], event_data, sizeof(struct msm_isp_event_data_nanosec)); v4l2_event_queue(vfe_dev->subdev.sd.devnode, &isp_event); return 0; } #define CAL_WORD(width, M, N) ((width * M + N - 1) / N) int msm_isp_cal_word_per_line(uint32_t output_format, Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ int msm_isp_unsubscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, int msm_isp_proc_cmd(struct vfe_device *vfe_dev, void *arg); int msm_isp_send_event(struct vfe_device *vfe_dev, uint32_t type, struct msm_isp_event_data *event_data); int msm_isp_send_event_update_nanosec(struct vfe_device *vfe_dev, uint32_t type, struct msm_isp_event_data_nanosec *event_data); int msm_isp_cal_word_per_line(uint32_t output_format, uint32_t pixel_per_line); int msm_isp_get_bit_per_pixel(uint32_t output_format); Loading Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.c +41 −19 Original line number Diff line number Diff line Loading @@ -357,6 +357,27 @@ static long msm_isp_dqevent(struct file *file, struct v4l2_fh *vfh, void *arg) file->f_flags & O_NONBLOCK); if (rc) return rc; if (isp_event.type == ISP_EVENT_SOF_UPDATE_NANOSEC) { struct msm_isp_event_data_nanosec *event_data_nanosec; struct msm_isp_event_data_nanosec *event_data_nanosec_user; event_data_nanosec = (struct msm_isp_event_data_nanosec *) isp_event.u.data; isp_event_user = (struct v4l2_event *)arg; memcpy(isp_event_user, &isp_event, sizeof(*isp_event_user)); event_data_nanosec_user = (struct msm_isp_event_data_nanosec *) isp_event_user->u.data; memset(event_data_nanosec_user, 0, sizeof(struct msm_isp_event_data_nanosec)); event_data_nanosec_user->nano_timestamp = event_data_nanosec->nano_timestamp; event_data_nanosec_user->frame_id = event_data_nanosec->frame_id; } else { event_data = (struct msm_isp_event_data *) isp_event.u.data; isp_event_user = (struct v4l2_event *)arg; Loading @@ -377,6 +398,7 @@ static long msm_isp_dqevent(struct file *file, struct v4l2_fh *vfh, void *arg) event_data32->frame_id = event_data->frame_id; memcpy(&(event_data32->u), &(event_data->u), sizeof(event_data32->u)); } } else { rc = v4l2_event_dequeue(vfh, arg, file->f_flags & O_NONBLOCK); Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.h +5 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,8 @@ struct msm_isp_timestamp { struct timeval vt_time; /*Wall clock for userspace event*/ struct timeval event_time; /* event time in nanosec*/ uint64_t buf_time_ns; }; struct msm_vfe_irq_ops { Loading Loading @@ -874,6 +876,9 @@ struct vfe_device { /* irq info */ uint32_t dual_irq_mask; uint32_t irq_sof_id; /* nano sec timestamp */ uint32_t nanosec_ts_enable; }; struct vfe_parent_device { Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +13 −0 Original line number Diff line number Diff line Loading @@ -1150,6 +1150,19 @@ void msm_isp_notify(struct vfe_device *vfe_dev, uint32_t event_type, break; } if ((vfe_dev->nanosec_ts_enable) && (event_type == ISP_EVENT_SOF) && (frame_src == VFE_PIX_0)) { struct msm_isp_event_data_nanosec event_data_nanosec; event_data_nanosec.frame_id = vfe_dev->axi_data.src_info[frame_src].frame_id; event_data_nanosec.nano_timestamp = ts->buf_time_ns; msm_isp_send_event_update_nanosec(vfe_dev, ISP_EVENT_SOF_UPDATE_NANOSEC, &event_data_nanosec); } event_data.frame_id = vfe_dev->axi_data.src_info[frame_src].frame_id; event_data.timestamp = ts->event_time; event_data.mono_timestamp = ts->buf_time; Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +35 −1 Original line number Diff line number Diff line Loading @@ -218,6 +218,8 @@ void msm_isp_get_timestamp(struct msm_isp_timestamp *time_stamp, get_monotonic_boottime(&ts); time_stamp->buf_time.tv_sec = ts.tv_sec; time_stamp->buf_time.tv_usec = ts.tv_nsec/1000; time_stamp->buf_time_ns = ((uint64_t)ts.tv_sec * 1000000000) + ts.tv_nsec; } } Loading Loading @@ -265,6 +267,9 @@ static inline u32 msm_isp_evt_mask_to_isp_event(u32 evt_mask) case ISP_EVENT_MASK_INDEX_BUF_FATAL_ERROR: evt_id = ISP_EVENT_BUF_FATAL_ERROR; break; case ISP_EVENT_MASK_INDEX_SOF_UPDATE_NANOSEC: evt_id = ISP_EVENT_SOF_UPDATE_NANOSEC; break; default: evt_id = ISP_EVENT_SUBS_MASK_NONE; break; Loading Loading @@ -294,6 +299,7 @@ static inline int msm_isp_subscribe_event_mask(struct v4l2_fh *fh, } } } else if (evt_mask_index == ISP_EVENT_MASK_INDEX_SOF || evt_mask_index == ISP_EVENT_MASK_INDEX_SOF_UPDATE_NANOSEC || evt_mask_index == ISP_EVENT_MASK_INDEX_REG_UPDATE || evt_mask_index == ISP_EVENT_MASK_INDEX_STREAM_UPDATE_DONE) { for (interface = 0; interface < VFE_SRC_MAX; interface++) { Loading Loading @@ -339,7 +345,7 @@ static inline int msm_isp_process_event_subscription(struct v4l2_fh *fh, } for (evt_mask_index = ISP_EVENT_MASK_INDEX_STATS_NOTIFY; evt_mask_index <= ISP_EVENT_MASK_INDEX_BUF_FATAL_ERROR; evt_mask_index <= ISP_EVENT_MASK_INDEX_SOF_UPDATE_NANOSEC; evt_mask_index++) { if (evt_mask & (1<<evt_mask_index)) { evt_id = msm_isp_evt_mask_to_isp_event(evt_mask_index); Loading Loading @@ -537,6 +543,14 @@ static int msm_isp_set_dual_vfe_sync_mode( vfe_dev->dual_vfe_sync_enable = mode->enable; return 0; } static int msm_isp_nano_sec_timestamp( struct vfe_device *vfe_dev, void *arg) { struct msm_vfe_nano_sec_timestamp *mode = arg; vfe_dev->nanosec_ts_enable = mode->enable; return 0; } int msm_isp_cfg_input(struct vfe_device *vfe_dev, void *arg) { int rc = 0; Loading Loading @@ -1072,6 +1086,11 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd, rc = msm_isp_set_dual_vfe_sync_mode(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; case VIDIOC_MSM_ISP_NANOSEC_TIMESTAMP: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_nano_sec_timestamp(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; default: pr_err_ratelimited("%s: Invalid ISP command %x\n", __func__, cmd); Loading Loading @@ -1572,6 +1591,21 @@ int msm_isp_send_event(struct vfe_device *vfe_dev, return 0; } int msm_isp_send_event_update_nanosec(struct vfe_device *vfe_dev, uint32_t event_type, struct msm_isp_event_data_nanosec *event_data) { struct v4l2_event isp_event; memset(&isp_event, 0, sizeof(struct v4l2_event)); isp_event.id = 0; isp_event.type = event_type; memcpy(&isp_event.u.data[0], event_data, sizeof(struct msm_isp_event_data_nanosec)); v4l2_event_queue(vfe_dev->subdev.sd.devnode, &isp_event); return 0; } #define CAL_WORD(width, M, N) ((width * M + N - 1) / N) int msm_isp_cal_word_per_line(uint32_t output_format, Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h +2 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,8 @@ int msm_isp_unsubscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, int msm_isp_proc_cmd(struct vfe_device *vfe_dev, void *arg); int msm_isp_send_event(struct vfe_device *vfe_dev, uint32_t type, struct msm_isp_event_data *event_data); int msm_isp_send_event_update_nanosec(struct vfe_device *vfe_dev, uint32_t type, struct msm_isp_event_data_nanosec *event_data); int msm_isp_cal_word_per_line(uint32_t output_format, uint32_t pixel_per_line); int msm_isp_get_bit_per_pixel(uint32_t output_format); Loading