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

Commit 2bdd57ce authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm:camera:isp: Check stream state in axi irq handler"

parents 73cf6aae 60dd7ac6
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -107,7 +107,18 @@ static int msm_isp_free_buf_handle(struct msm_isp_buf_mgr *buf_mgr,
		msm_isp_get_bufq(buf_mgr, bufq_handle);
	if (!bufq)
		return -EINVAL;
	memset(bufq, 0, sizeof(struct msm_isp_bufq));

	/* Set everything except lock to 0 */
	bufq->bufq_handle = 0;
	bufq->bufs = 0;
	bufq->session_id = 0;
	bufq->stream_id = 0;
	bufq->num_bufs = 0;
	bufq->buf_type = 0;
	memset(&bufq->head, 0, sizeof(bufq->head));
	memset(&bufq->share_head, 0, sizeof(bufq->share_head));
	bufq->buf_client_count = 0;

	return 0;
}

@@ -1023,19 +1034,25 @@ static int msm_isp_release_bufq(struct msm_isp_buf_mgr *buf_mgr,
	uint32_t bufq_handle)
{
	struct msm_isp_bufq *bufq = NULL;
	unsigned long flags;
	int rc = -1;
	mutex_lock(&buf_mgr->lock);
	bufq = msm_isp_get_bufq(buf_mgr, bufq_handle);
	if (!bufq) {
		pr_err("Invalid bufq release\n");
		mutex_unlock(&buf_mgr->lock);
		return rc;
	}

	msm_isp_buf_unprepare_all(buf_mgr, bufq_handle);

	spin_lock_irqsave(&bufq->bufq_lock, flags);
	kfree(bufq->bufs);
	msm_isp_free_buf_handle(buf_mgr, bufq_handle);

	spin_unlock_irqrestore(&bufq->bufq_lock, flags);
	mutex_unlock(&buf_mgr->lock);

	return 0;
}

@@ -1043,15 +1060,19 @@ static void msm_isp_release_all_bufq(
	struct msm_isp_buf_mgr *buf_mgr)
{
	struct msm_isp_bufq *bufq = NULL;
	unsigned long flags;
	int i;
	for (i = 0; i < buf_mgr->num_buf_q; i++) {
		bufq = &buf_mgr->bufq[i];
		if (!bufq->bufq_handle)
			continue;

		msm_isp_buf_unprepare_all(buf_mgr, bufq->bufq_handle);

		spin_lock_irqsave(&bufq->bufq_lock, flags);
		kfree(bufq->bufs);
		msm_isp_free_buf_handle(buf_mgr, bufq->bufq_handle);
		spin_unlock_irqrestore(&bufq->bufq_lock, flags);
	}
}

+14 −0
Original line number Diff line number Diff line
@@ -2165,6 +2165,13 @@ void msm_isp_process_axi_irq(struct vfe_device *vfe_dev,
			}
			stream_idx = HANDLE_TO_IDX(comp_info->stream_handle);
			stream_info = &axi_data->stream_info[stream_idx];

			if (stream_info->state == INACTIVE) {
				pr_warn("%s: Warning! Stream already inactive. Drop irq handling\n",
					__func__);
				continue;
			}

			ISP_DBG("%s: stream id %x frame id: 0x%x\n", __func__,
				stream_info->stream_id, stream_info->frame_id);
			stream_info->frame_id++;
@@ -2202,6 +2209,13 @@ void msm_isp_process_axi_irq(struct vfe_device *vfe_dev,
				continue;
			}
			stream_info = &axi_data->stream_info[stream_idx];

			if (stream_info->state == INACTIVE) {
				pr_warn("%s: Warning! Stream already inactive. Drop irq handling\n",
					__func__);
				continue;
			}

			ISP_DBG("%s: stream id %x frame id: 0x%x\n", __func__,
				stream_info->stream_id, stream_info->frame_id);
			stream_info->frame_id++;
+7 −0
Original line number Diff line number Diff line
@@ -168,6 +168,13 @@ static int32_t msm_isp_stats_configure(struct vfe_device *vfe_dev,
		if (!(stats_irq_mask & (1 << i)))
			continue;
		stream_info = &vfe_dev->stats_data.stream_info[i];

		if (stream_info->state == STATS_INACTIVE) {
			pr_warn("%s: Warning! Stream already inactive. Drop irq handling\n",
				__func__);
			continue;
		}

		done_buf = NULL;
		msm_isp_stats_cfg_ping_pong_address(vfe_dev,
			stream_info, pingpong_status, &done_buf);