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

Commit 73792162 authored by Vladislav Hristov's avatar Vladislav Hristov Committed by Petar Sivenov
Browse files

msm: camera: Add support for multiple SOF events.



Multiple SOF events are required when running multiple HW streams on a
single VFE, and the user space needs to distinguish between different
SOFs in the different streams. Such situation can occur, when we have
one or more RDI streams in parallel with a PIX stream.

Change-Id: I1a1c5a21fb098fa76071799d183bbe6e4558b51c
Signed-off-by: default avatarVladislav Hristov <vhrist@codeaurora.org>
parent 32bb8330
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -368,15 +368,16 @@ static void msm_vfe40_process_camif_irq(struct vfe_device *vfe_dev,
	uint32_t irq_status0, uint32_t irq_status1,
	struct msm_isp_timestamp *ts)
{
	int cnt;

	if (!(irq_status0 & 0xF))
		return;

	if (irq_status0 & (1 << 0)) {
		ISP_DBG("%s: SOF IRQ\n", __func__);
		if (vfe_dev->axi_data.src_info[VFE_PIX_0].raw_stream_count > 0
			&& vfe_dev->axi_data.src_info[VFE_PIX_0].
			pix_stream_count == 0) {
			msm_isp_sof_notify(vfe_dev, VFE_PIX_0, ts);
		cnt = vfe_dev->axi_data.src_info[VFE_PIX_0].raw_stream_count;
		if (cnt > 0) {
			msm_isp_sof_notify(vfe_dev, VFE_RAW_0, ts);
			if (vfe_dev->axi_data.stream_update)
				msm_isp_axi_stream_update(vfe_dev);
			msm_isp_update_framedrop_reg(vfe_dev);
+1 −1
Original line number Diff line number Diff line
@@ -424,7 +424,7 @@ void msm_isp_sof_notify(struct vfe_device *vfe_dev,
	sof_event.frame_id = vfe_dev->axi_data.src_info[frame_src].frame_id;
	sof_event.timestamp = ts->event_time;
	sof_event.mono_timestamp = ts->buf_time;
	msm_isp_send_event(vfe_dev, ISP_EVENT_SOF, &sof_event);
	msm_isp_send_event(vfe_dev, ISP_EVENT_SOF + frame_src, &sof_event);
}

void msm_isp_calculate_framedrop(
+4 −4
Original line number Diff line number Diff line
@@ -301,8 +301,6 @@ enum msm_isp_event_idx {
	ISP_WM_BUS_OVERFLOW = 4,
	ISP_STATS_OVERFLOW  = 5,
	ISP_CAMIF_ERROR     = 6,
	ISP_SOF             = 7,
	ISP_EOF             = 8,
	ISP_BUF_DONE        = 9,
	ISP_EVENT_MAX       = 10
};
@@ -311,6 +309,8 @@ enum msm_isp_event_idx {
#define ISP_EVENT_BASE            (V4L2_EVENT_PRIVATE_START)
#define ISP_BUF_EVENT_BASE        (ISP_EVENT_BASE + (1 << ISP_EVENT_OFFSET))
#define ISP_STATS_EVENT_BASE      (ISP_EVENT_BASE + (2 << ISP_EVENT_OFFSET))
#define ISP_SOF_EVENT_BASE        (ISP_EVENT_BASE + (3 << ISP_EVENT_OFFSET))
#define ISP_EOF_EVENT_BASE        (ISP_EVENT_BASE + (4 << ISP_EVENT_OFFSET))
#define ISP_EVENT_REG_UPDATE      (ISP_EVENT_BASE + ISP_REG_UPDATE)
#define ISP_EVENT_START_ACK       (ISP_EVENT_BASE + ISP_START_ACK)
#define ISP_EVENT_STOP_ACK        (ISP_EVENT_BASE + ISP_STOP_ACK)
@@ -318,8 +318,8 @@ enum msm_isp_event_idx {
#define ISP_EVENT_WM_BUS_OVERFLOW (ISP_EVENT_BASE + ISP_WM_BUS_OVERFLOW)
#define ISP_EVENT_STATS_OVERFLOW  (ISP_EVENT_BASE + ISP_STATS_OVERFLOW)
#define ISP_EVENT_CAMIF_ERROR     (ISP_EVENT_BASE + ISP_CAMIF_ERROR)
#define ISP_EVENT_SOF             (ISP_EVENT_BASE + ISP_SOF)
#define ISP_EVENT_EOF             (ISP_EVENT_BASE + ISP_EOF)
#define ISP_EVENT_SOF             (ISP_SOF_EVENT_BASE)
#define ISP_EVENT_EOF             (ISP_EOF_EVENT_BASE)
#define ISP_EVENT_BUF_DONE        (ISP_EVENT_BASE + ISP_BUF_DONE)
#define ISP_EVENT_BUF_DIVERT      (ISP_BUF_EVENT_BASE)
#define ISP_EVENT_STATS_NOTIFY    (ISP_STATS_EVENT_BASE)