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

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

Merge "msm: isp: Handle ping pong mismatch error"

parents ccf3c894 01f5d39b
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -500,6 +500,10 @@ static int vfe_probe(struct platform_device *pdev)
	memset(&vfe_common_data, 0, sizeof(vfe_common_data));
	mutex_init(&vfe_common_data.vfe_common_mutex);
	spin_lock_init(&vfe_common_data.common_dev_data_lock);
	spin_lock_init(&vfe_common_data.vfe_irq_dump.
			common_dev_irq_dump_lock);
	spin_lock_init(&vfe_common_data.vfe_irq_dump.
			common_dev_tasklet_dump_lock);
	for (i = 0; i < (VFE_AXI_SRC_MAX * MAX_VFE); i++)
		spin_lock_init(&(vfe_common_data.streams[i].lock));
	for (i = 0; i < (MSM_ISP_STATS_MAX * MAX_VFE); i++)
+29 −1
Original line number Diff line number Diff line
@@ -66,6 +66,8 @@
#define MAX_BUFFERS_IN_HW 2

#define MAX_VFE 2
#define MAX_VFE_IRQ_DEBUG_DUMP_SIZE 10
#define MAX_RECOVERY_THRESHOLD  5

struct vfe_device;
struct msm_vfe_axi_stream;
@@ -133,6 +135,8 @@ struct msm_isp_timestamp {
};

struct msm_vfe_irq_ops {
	void (*read_and_clear_irq_status)(struct vfe_device *vfe_dev,
		uint32_t *irq_status0, uint32_t *irq_status1);
	void (*read_irq_status)(struct vfe_device *vfe_dev,
		uint32_t *irq_status0, uint32_t *irq_status1);
	void (*process_reg_update)(struct vfe_device *vfe_dev,
@@ -525,6 +529,7 @@ struct msm_vfe_axi_shared_data {
	uint16_t stream_handle_cnt;
	uint32_t event_mask;
	uint8_t enable_frameid_recovery;
	uint8_t recovery_count;
};

struct msm_vfe_stats_hardware_info {
@@ -691,6 +696,26 @@ struct master_slave_resource_info {
	enum msm_vfe_dual_cam_sync_mode dual_sync_mode;
};

struct msm_vfe_irq_debug_info {
	uint32_t vfe_id;
	struct msm_isp_timestamp ts;
	uint32_t core_id;
	uint32_t irq_status0[MAX_VFE];
	uint32_t irq_status1[MAX_VFE];
	uint32_t ping_pong_status[MAX_VFE];
};

struct msm_vfe_irq_dump {
	spinlock_t common_dev_irq_dump_lock;
	spinlock_t common_dev_tasklet_dump_lock;
	uint8_t current_irq_index;
	uint8_t current_tasklet_index;
	struct msm_vfe_irq_debug_info
		irq_debug[MAX_VFE_IRQ_DEBUG_DUMP_SIZE];
	struct msm_vfe_irq_debug_info
		tasklet_debug[MAX_VFE_IRQ_DEBUG_DUMP_SIZE];
};

struct msm_vfe_common_dev_data {
	spinlock_t common_dev_data_lock;
	struct dual_vfe_resource *dual_vfe_res;
@@ -698,6 +723,8 @@ struct msm_vfe_common_dev_data {
	struct msm_vfe_axi_stream streams[VFE_AXI_SRC_MAX * MAX_VFE];
	struct msm_vfe_stats_stream stats_streams[MSM_ISP_STATS_MAX * MAX_VFE];
	struct mutex vfe_common_mutex;
	/* Irq debug Info */
	struct msm_vfe_irq_dump vfe_irq_dump;
};

struct msm_vfe_common_subdev {
@@ -790,8 +817,9 @@ struct vfe_device {
	/* irq info */
	uint32_t irq0_mask;
	uint32_t irq1_mask;

	uint32_t bus_err_ign_mask;
	uint32_t recovery_irq0_mask;
	uint32_t recovery_irq1_mask;
};

struct vfe_parent_device {
+10 −1
Original line number Diff line number Diff line
@@ -576,7 +576,7 @@ static void msm_vfe32_process_error_status(struct vfe_device *vfe_dev)
		pr_err("%s: axi error\n", __func__);
}

static void msm_vfe32_read_irq_status(struct vfe_device *vfe_dev,
static void msm_vfe32_read_and_clear_irq_status(struct vfe_device *vfe_dev,
	uint32_t *irq_status0, uint32_t *irq_status1)
{
	*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
@@ -594,6 +594,13 @@ static void msm_vfe32_read_irq_status(struct vfe_device *vfe_dev,
			msm_camera_io_r(vfe_dev->vfe_base + 0x7B4);
}

static void msm_vfe32_read_irq_status(struct vfe_device *vfe_dev,
	uint32_t *irq_status0, uint32_t irq_status1)
{
	*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
	*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x30);
}

static void msm_vfe32_process_reg_update(struct vfe_device *vfe_dev,
	uint32_t irq_status0, uint32_t irq_status1,
	struct msm_isp_timestamp *ts)
@@ -1423,6 +1430,8 @@ struct msm_vfe_hardware_info vfe32_hw_info = {
	.vfe_clk_idx = VFE32_CLK_IDX,
	.vfe_ops = {
		.irq_ops = {
			.read_and_clear_irq_status =
				msm_vfe32_read_and_clear_irq_status,
			.read_irq_status = msm_vfe32_read_irq_status,
			.process_camif_irq = msm_vfe32_process_camif_irq,
			.process_reset_irq = msm_vfe32_process_reset_irq,
+12 −2
Original line number Diff line number Diff line
@@ -566,7 +566,7 @@ static void msm_vfe40_process_error_status(struct vfe_device *vfe_dev)
		msm_isp_update_last_overflow_ab_ib(vfe_dev);
}

static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev,
static void msm_vfe40_read_and_clear_irq_status(struct vfe_device *vfe_dev,
	uint32_t *irq_status0, uint32_t *irq_status1)
{
	*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x38);
@@ -599,6 +599,13 @@ static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev,

}

static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev,
	uint32_t *irq_status0, uint32_t *irq_status1)
{
	*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x38);
	*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x3C);
}

static void msm_vfe40_process_reg_update(struct vfe_device *vfe_dev,
	uint32_t irq_status0, uint32_t irq_status1,
	struct msm_isp_timestamp *ts)
@@ -1770,7 +1777,8 @@ static int msm_vfe40_axi_halt(struct vfe_device *vfe_dev,
static void msm_vfe40_axi_restart(struct vfe_device *vfe_dev,
	uint32_t blocking, uint32_t enable_camif)
{
	msm_vfe40_config_irq(vfe_dev, 0x800000E0, 0xFEFFFF7E,
	msm_vfe40_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask,
			vfe_dev->recovery_irq1_mask,
			MSM_ISP_IRQ_ENABLE);
	msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);

@@ -2198,6 +2206,8 @@ struct msm_vfe_hardware_info vfe40_hw_info = {
	.min_ib = 12000000,
	.vfe_ops = {
		.irq_ops = {
			.read_and_clear_irq_status =
				msm_vfe40_read_and_clear_irq_status,
			.read_irq_status = msm_vfe40_read_irq_status,
			.process_camif_irq = msm_vfe40_process_input_irq,
			.process_reset_irq = msm_vfe40_process_reset_irq,
+12 −3
Original line number Diff line number Diff line
@@ -401,7 +401,7 @@ static void msm_vfe44_process_error_status(struct vfe_device *vfe_dev)
	}
}

static void msm_vfe44_read_irq_status(struct vfe_device *vfe_dev,
static void msm_vfe44_read_and_clear_irq_status(struct vfe_device *vfe_dev,
	uint32_t *irq_status0, uint32_t *irq_status1)
{
	*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x38);
@@ -429,6 +429,13 @@ static void msm_vfe44_read_irq_status(struct vfe_device *vfe_dev,

}

static void msm_vfe44_read_irq_status(struct vfe_device *vfe_dev,
	 uint32_t *irq_status0, uint32_t *irq_status1)
{
	*irq_status0 = msm_camera_io_r(vfe_dev->vfe_base + 0x38);
	*irq_status1 = msm_camera_io_r(vfe_dev->vfe_base + 0x3C);
}

static void msm_vfe44_process_reg_update(struct vfe_device *vfe_dev,
	uint32_t irq_status0, uint32_t irq_status1,
	struct msm_isp_timestamp *ts)
@@ -1341,8 +1348,8 @@ static int msm_vfe44_axi_halt(struct vfe_device *vfe_dev,
static void msm_vfe44_axi_restart(struct vfe_device *vfe_dev,
	uint32_t blocking, uint32_t enable_camif)
{
	msm_vfe44_config_irq(vfe_dev, 0x800000E0, 0xFFFFFF7E,
			MSM_ISP_IRQ_ENABLE);
	msm_vfe44_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask,
			vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_ENABLE);
	msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);

	/* Start AXI */
@@ -1806,6 +1813,8 @@ struct msm_vfe_hardware_info vfe44_hw_info = {
	.min_ib = 100000000,
	.vfe_ops = {
		.irq_ops = {
			.read_and_clear_irq_status =
				msm_vfe44_read_and_clear_irq_status,
			.read_irq_status = msm_vfe44_read_irq_status,
			.process_camif_irq = msm_vfe44_process_input_irq,
			.process_reset_irq = msm_vfe44_process_reset_irq,
Loading