Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36d43655 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: Add new sof event to include nanosecond timestamp"

parents 8f6d5e33 463b3b0e
Loading
Loading
Loading
Loading
+41 −19
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+5 −0
Original line number Diff line number Diff line
@@ -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 {
@@ -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 {
+13 −0
Original line number Diff line number Diff line
@@ -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;
+35 −1
Original line number Diff line number Diff line
@@ -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;
	}
}

@@ -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;
@@ -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++) {
@@ -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);
@@ -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;
@@ -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);
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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