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

Commit 42e87818 authored by Vijay Kumar TM's avatar Vijay Kumar TM Committed by Gerrit - the friendly Code Review server
Browse files

mm-camera2:isp2: Release buffer lock after use



At start axi stream, we are acquiring the
buffer lock and releasing after completing
the stream configuration operations. In case
of live snapshot,this is causing the buffer
operations to halt and leading to sof freeze.

CRs-Fixed: 2149998
Change-Id: I7f57c8befc85c105a5690ac71e0276f42b9f1929
Signed-off-by: default avatarMeera Gande <mgande@codeaurora.org>
Signed-off-by: default avatarVijay Kumar TM <vtmuni@codeaurora.org>
parent 829d7d99
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -2877,10 +2877,11 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev,
		vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id = 0;
		vfe_dev->axi_data.src_info[VFE_PIX_0].eof_id = 0;
	}

	mutex_lock(&vfe_dev->buf_mgr->lock);
	for (i = 0; i < stream_cfg_cmd->num_streams; i++) {
		if (HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i]) >=
			VFE_AXI_SRC_MAX) {
			mutex_unlock(&vfe_dev->buf_mgr->lock);
			return -EINVAL;
		}
		stream_info = &axi_data->stream_info[
@@ -2890,6 +2891,7 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev,
				SRC_TO_INTF(stream_info->stream_src)].active;
		else {
			ISP_DBG("%s: invalid src info index\n", __func__);
			mutex_unlock(&vfe_dev->buf_mgr->lock);
			return -EINVAL;
		}

@@ -2903,6 +2905,7 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev,
				HANDLE_TO_IDX(
				stream_cfg_cmd->stream_handle[i]));
			spin_unlock_irqrestore(&stream_info->lock, flags);
			mutex_unlock(&vfe_dev->buf_mgr->lock);
			return rc;
		}
		spin_unlock_irqrestore(&stream_info->lock, flags);
@@ -2959,6 +2962,7 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev,
			}
		}
	}
	mutex_unlock(&vfe_dev->buf_mgr->lock);
	msm_isp_update_stream_bandwidth(vfe_dev, stream_cfg_cmd->hw_state);
	vfe_dev->hw_info->vfe_ops.axi_ops.reload_wm(vfe_dev,
		vfe_dev->vfe_base, wm_reload_mask);
+7 −1
Original line number Diff line number Diff line
/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -683,6 +683,8 @@ static int msm_isp_start_stats_stream(struct vfe_device *vfe_dev,
			stream_cfg_cmd->num_streams);
		return -EINVAL;
	}
	mutex_lock(&vfe_dev->buf_mgr->lock);

	num_stats_comp_mask =
		vfe_dev->hw_info->stats_hw_info->num_stats_comp_mask;
	rc = vfe_dev->hw_info->vfe_ops.stats_ops.check_streams(
@@ -695,6 +697,7 @@ static int msm_isp_start_stats_stream(struct vfe_device *vfe_dev,

		if (idx >= vfe_dev->hw_info->stats_hw_info->num_stats_type) {
			pr_err("%s Invalid stats index %d", __func__, idx);
			mutex_unlock(&vfe_dev->buf_mgr->lock);
			return -EINVAL;
		}

@@ -710,11 +713,13 @@ static int msm_isp_start_stats_stream(struct vfe_device *vfe_dev,
			pr_err("%s: comp grp %d exceed max %d\n",
				__func__, stream_info->composite_flag,
				num_stats_comp_mask);
			mutex_unlock(&vfe_dev->buf_mgr->lock);
			return -EINVAL;
		}
		rc = msm_isp_init_stats_ping_pong_reg(vfe_dev, stream_info);
		if (rc < 0) {
			pr_err("%s: No buffer for stream%d\n", __func__, idx);
			mutex_unlock(&vfe_dev->buf_mgr->lock);
			return rc;
		}
		if (!stream_info->composite_flag)
@@ -739,6 +744,7 @@ static int msm_isp_start_stats_stream(struct vfe_device *vfe_dev,
			stats_data->num_active_stream);

	}
	mutex_unlock(&vfe_dev->buf_mgr->lock);

	if (vfe_dev->axi_data.src_info[VFE_PIX_0].active) {
		rc = msm_isp_stats_wait_for_cfg_done(vfe_dev);
+0 −4
Original line number Diff line number Diff line
@@ -886,9 +886,7 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd,
		break;
	case VIDIOC_MSM_ISP_CFG_STREAM:
		mutex_lock(&vfe_dev->core_mutex);
		mutex_lock(&vfe_dev->buf_mgr->lock);
		rc = msm_isp_cfg_axi_stream(vfe_dev, arg);
		mutex_unlock(&vfe_dev->buf_mgr->lock);
		mutex_unlock(&vfe_dev->core_mutex);
		break;
	case VIDIOC_MSM_ISP_CFG_HW_STATE:
@@ -1002,9 +1000,7 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd,
		break;
	case VIDIOC_MSM_ISP_CFG_STATS_STREAM:
		mutex_lock(&vfe_dev->core_mutex);
		mutex_lock(&vfe_dev->buf_mgr->lock);
		rc = msm_isp_cfg_stats_stream(vfe_dev, arg);
		mutex_unlock(&vfe_dev->buf_mgr->lock);
		mutex_unlock(&vfe_dev->core_mutex);
		break;
	case VIDIOC_MSM_ISP_UPDATE_STATS_STREAM: