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

Commit bd06d1fc authored by Shubhraprakash Das's avatar Shubhraprakash Das
Browse files

msm: camera isp: Control camif interrupts on camif enable/disable



Turn off the camif interrupts when camif is disabled and turn them
on when camif is enabled. Also, improve the code to keep track of
interrupts that are enabled by updating them in the function that
sets interrupts instead of doing it in multiple places.

CRs-Fixed: 1037272
Change-Id: I1cc965696c06bd3901d86668aaf597abb3ef2d6d
Signed-off-by: default avatarShubhraprakash Das <sadas@codeaurora.org>
parent d71271a8
Loading
Loading
Loading
Loading
+39 −59
Original line number Diff line number Diff line
@@ -100,29 +100,21 @@ static void msm_vfe40_config_irq(struct vfe_device *vfe_dev,
		uint32_t irq0_mask, uint32_t irq1_mask,
		enum msm_isp_irq_operation oper)
{
	uint32_t val;

	switch (oper) {
	case MSM_ISP_IRQ_ENABLE:
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
		val |= irq0_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
		val |= irq1_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
		vfe_dev->irq0_mask |= irq0_mask;
		vfe_dev->irq1_mask |= irq1_mask;
		break;
	case MSM_ISP_IRQ_DISABLE:
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
		val &= ~irq0_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
		val &= ~irq1_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
		vfe_dev->irq0_mask &= ~irq0_mask;
		vfe_dev->irq1_mask &= ~irq1_mask;
		break;
	case MSM_ISP_IRQ_SET:
		msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x28);
		msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x2C);
		vfe_dev->irq0_mask = irq0_mask;
		vfe_dev->irq1_mask = irq1_mask;
	}
	msm_camera_io_w_mb(vfe_dev->irq0_mask, vfe_dev->vfe_base + 0x28);
	msm_camera_io_w_mb(vfe_dev->irq1_mask, vfe_dev->vfe_base + 0x2C);
}

static int32_t msm_vfe40_init_qos_parms(struct vfe_device *vfe_dev,
@@ -334,10 +326,8 @@ static void msm_vfe40_init_hardware_reg(struct vfe_device *vfe_dev)
	msm_vfe40_init_vbif_parms(vfe_dev, &vbif_parms);
	/* BUS_CFG */
	msm_camera_io_w(0x10000001, vfe_dev->vfe_base + 0x50);
	vfe_dev->irq0_mask = 0xE00000F1;
	vfe_dev->irq1_mask = 0xFEFFFFFF;
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev, 0x800000E0, 0xFEFFFF7E,
			MSM_ISP_IRQ_ENABLE);
	msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
	msm_camera_io_w_mb(0xFEFFFFFF, vfe_dev->vfe_base + 0x34);
	msm_camera_io_w(1, vfe_dev->vfe_base + 0x24);
@@ -345,15 +335,13 @@ static void msm_vfe40_init_hardware_reg(struct vfe_device *vfe_dev)
	msm_camera_io_w(0, vfe_dev->vfe_base + 0x30);
	msm_camera_io_w_mb(0, vfe_dev->vfe_base + 0x34);
	msm_camera_io_w(1, vfe_dev->vfe_base + 0x24);
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
}

static void msm_vfe40_clear_status_reg(struct vfe_device *vfe_dev)
{
	vfe_dev->irq0_mask = (1 << 31);
	vfe_dev->irq1_mask = 0;
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
	msm_vfe40_config_irq(vfe_dev, (1 << 31), 0,
			MSM_ISP_IRQ_SET);
	msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
	msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
@@ -588,7 +576,6 @@ static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev,
	if (*irq_status1 & (1 << 0)) {
		vfe_dev->error_info.camif_status =
		msm_camera_io_r(vfe_dev->vfe_base + 0x31C);
		vfe_dev->irq1_mask &= ~(1 << 0);
		msm_vfe40_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
	}

@@ -811,11 +798,9 @@ static void msm_vfe40_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
	comp_mask |= (axi_data->composite_info[comp_mask_index].
		stream_composite_mask << (comp_mask_index * 8));

	vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);

	msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev, 1 << (comp_mask_index + 25), 0,
			MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe40_axi_clear_comp_mask(struct vfe_device *vfe_dev,
@@ -827,27 +812,24 @@ static void msm_vfe40_axi_clear_comp_mask(struct vfe_device *vfe_dev,
	comp_mask = msm_camera_io_r(vfe_dev->vfe_base + 0x40);
	comp_mask &= ~(0x7F << (comp_mask_index * 8));

	vfe_dev->irq0_mask &= ~(1 << (comp_mask_index + 25));

	msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev, (1 << (comp_mask_index + 25)), 0,
				MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe40_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
	struct msm_vfe_axi_stream *stream_info)
{
	vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev, 1 << (stream_info->wm[0] + 8), 0,
				MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe40_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
	struct msm_vfe_axi_stream *stream_info)
{
	vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev, (1 << (stream_info->wm[0] + 8)), 0,
				MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe40_cfg_framedrop(void __iomem *vfe_base,
@@ -1087,10 +1069,8 @@ static void msm_vfe40_cfg_fetch_engine(struct vfe_device *vfe_dev,
	temp |= (1 << 1);
	msm_camera_io_w(temp, vfe_dev->vfe_base + 0x50);

	vfe_dev->irq0_mask &= 0xFEFFFFFF;
	vfe_dev->irq0_mask |= (1 << 24);
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev, (1 << 24), 0,
			MSM_ISP_IRQ_ENABLE);

	msm_camera_io_w((fe_cfg->fetch_height - 1),
			vfe_dev->vfe_base + 0x238);
@@ -1381,14 +1361,11 @@ static void msm_vfe40_update_camif_state(struct vfe_device *vfe_dev,
		return;

	if (update_state == ENABLE_CAMIF) {
		msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
		msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
		msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x30);
		msm_camera_io_w_mb(0x81, vfe_dev->vfe_base + 0x34);
		msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
		vfe_dev->irq0_mask |= 0xF7;
		vfe_dev->irq1_mask |= 0x81;
		msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask,
				vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
		msm_vfe40_config_irq(vfe_dev, 0xF7, 0x81,
				MSM_ISP_IRQ_ENABLE);
		msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);

		bus_en =
@@ -1409,9 +1386,8 @@ static void msm_vfe40_update_camif_state(struct vfe_device *vfe_dev,
		vfe_dev->axi_data.src_info[VFE_PIX_0].active = 1;
	} else if (update_state == DISABLE_CAMIF ||
		DISABLE_CAMIF_IMMEDIATELY == update_state) {
		vfe_dev->irq1_mask &= ~0x81;
		msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask,
			vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_vfe40_config_irq(vfe_dev, 0, 0x81,
				MSM_ISP_IRQ_DISABLE);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x464);
		/* disable danger signal */
		msm_camera_io_w_mb(val & ~(1 << 8), vfe_dev->vfe_base + 0x464);
@@ -1890,6 +1866,9 @@ static void msm_vfe40_stats_cfg_comp_mask(struct vfe_device *vfe_dev,
		comp_mask_reg |= mask_bf_scale << (16 + request_comp_index * 8);
		atomic_set(stats_comp_mask, stats_mask |
				atomic_read(stats_comp_mask));
		msm_vfe40_config_irq(vfe_dev,
			1 << (request_comp_index + 29), 0,
			MSM_ISP_IRQ_ENABLE);
	} else {
		if (!(atomic_read(stats_comp_mask) & stats_mask))
			return;
@@ -1897,6 +1876,9 @@ static void msm_vfe40_stats_cfg_comp_mask(struct vfe_device *vfe_dev,
				~stats_mask & atomic_read(stats_comp_mask));
		comp_mask_reg &= ~(mask_bf_scale <<
			(16 + request_comp_index * 8));
		msm_vfe40_config_irq(vfe_dev,
			1 << (request_comp_index + 29), 0,
			MSM_ISP_IRQ_DISABLE);
	}
	msm_camera_io_w(comp_mask_reg, vfe_dev->vfe_base + 0x44);

@@ -1912,20 +1894,18 @@ static void msm_vfe40_stats_cfg_wm_irq_mask(
	struct vfe_device *vfe_dev,
	struct msm_vfe_stats_stream *stream_info)
{
	vfe_dev->irq0_mask |=
		1 << (STATS_IDX(stream_info->stream_handle) + 16);
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev,
			1 << (STATS_IDX(stream_info->stream_handle) + 16), 0,
			MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe40_stats_clear_wm_irq_mask(
	struct vfe_device *vfe_dev,
	struct msm_vfe_stats_stream *stream_info)
{
	vfe_dev->irq0_mask &=
		~(1 << (STATS_IDX(stream_info->stream_handle) + 16));
	msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe40_config_irq(vfe_dev,
			(1 << (STATS_IDX(stream_info->stream_handle) + 16)), 0,
			MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe40_stats_cfg_wm_reg(
+39 −57
Original line number Diff line number Diff line
@@ -69,30 +69,22 @@ static void msm_vfe44_config_irq(struct vfe_device *vfe_dev,
		uint32_t irq0_mask, uint32_t irq1_mask,
		enum msm_isp_irq_operation oper)
{
	uint32_t val;

	switch (oper) {
	case MSM_ISP_IRQ_ENABLE:
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
		val |= irq0_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
		val |= irq1_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
		vfe_dev->irq0_mask |= irq0_mask;
		vfe_dev->irq1_mask |= irq1_mask;
		break;
	case MSM_ISP_IRQ_DISABLE:
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x28);
		val &= ~irq0_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x28);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x2C);
		val &= ~irq1_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x2C);
		vfe_dev->irq0_mask &= ~irq0_mask;
		vfe_dev->irq1_mask &= ~irq1_mask;
		break;
	case MSM_ISP_IRQ_SET:
		msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x28);
		msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x2C);
		vfe_dev->irq0_mask = irq0_mask;
		vfe_dev->irq1_mask = irq1_mask;
		break;
	}
	msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x28);
	msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x2C);
}

static int32_t msm_vfe44_init_dt_parms(struct vfe_device *vfe_dev,
@@ -180,10 +172,8 @@ static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev)

	/* BUS_CFG */
	msm_camera_io_w(0x10000001, vfe_dev->vfe_base + 0x50);
	vfe_dev->irq0_mask = 0xE00000F1;
	vfe_dev->irq1_mask = 0xFFFFFFFF;
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev, 0x800000E0, 0xFFFFFF7E,
			MSM_ISP_IRQ_ENABLE);
	msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
	msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
	msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);
@@ -192,9 +182,7 @@ static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev)

static void msm_vfe44_clear_status_reg(struct vfe_device *vfe_dev)
{
	vfe_dev->irq0_mask = 0x80000000;
	vfe_dev->irq1_mask = 0;
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
	msm_vfe44_config_irq(vfe_dev, 0x80000000, 0,
			MSM_ISP_IRQ_SET);
	msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
	msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
@@ -418,7 +406,6 @@ static void msm_vfe44_read_irq_status(struct vfe_device *vfe_dev,
	if (*irq_status1 & (1 << 0)) {
		vfe_dev->error_info.camif_status =
		msm_camera_io_r(vfe_dev->vfe_base + 0x31C);
		vfe_dev->irq1_mask &= ~(1 << 0);
		msm_vfe44_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
	}

@@ -649,9 +636,8 @@ static void msm_vfe44_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
		stream_composite_mask << (comp_mask_index * 8));
	msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);

	vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev, 1 << (comp_mask_index + 25), 0,
			MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe44_axi_clear_comp_mask(struct vfe_device *vfe_dev,
@@ -663,25 +649,22 @@ static void msm_vfe44_axi_clear_comp_mask(struct vfe_device *vfe_dev,
	comp_mask &= ~(0x7F << (comp_mask_index * 8));
	msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x40);

	vfe_dev->irq0_mask &= ~(1 << (comp_mask_index + 25));
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev, (1 << (comp_mask_index + 25)), 0,
			MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe44_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
	struct msm_vfe_axi_stream *stream_info)
{
	vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev, 1 << (stream_info->wm[0] + 8), 0,
			MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe44_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
	struct msm_vfe_axi_stream *stream_info)
{
	vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev, (1 << (stream_info->wm[0] + 8)), 0,
			MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe44_cfg_framedrop(void __iomem *vfe_base,
@@ -917,10 +900,8 @@ static void msm_vfe44_cfg_fetch_engine(struct vfe_device *vfe_dev,
		temp |= (1 << 1);
		msm_camera_io_w(temp, vfe_dev->vfe_base + 0x50);

		vfe_dev->irq0_mask &= 0xFEFFFFFF;
		vfe_dev->irq0_mask |= (1 << 24);
		msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask,
				vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_vfe44_config_irq(vfe_dev, (1 << 24), 0,
					MSM_ISP_IRQ_SET);
		msm_camera_io_w((fe_cfg->fetch_height - 1) & 0xFFF,
			vfe_dev->vfe_base + 0x238);

@@ -1044,14 +1025,12 @@ static void msm_vfe44_update_camif_state(struct vfe_device *vfe_dev,
		return;

	if (update_state == ENABLE_CAMIF) {
		msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x30);
		msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x34);
		msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x30);
		msm_camera_io_w_mb(0x81, vfe_dev->vfe_base + 0x34);
		msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24);

		vfe_dev->irq0_mask |= 0xF7;
		vfe_dev->irq1_mask |= 0x81;
		msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask,
			vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_vfe44_config_irq(vfe_dev, 0xF7, 0x81,
				MSM_ISP_IRQ_ENABLE);
		msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318);

		bus_en =
@@ -1070,9 +1049,8 @@ static void msm_vfe44_update_camif_state(struct vfe_device *vfe_dev,
		vfe_dev->axi_data.src_info[VFE_PIX_0].active = 1;
	} else if (update_state == DISABLE_CAMIF ||
		DISABLE_CAMIF_IMMEDIATELY == update_state) {
		vfe_dev->irq1_mask &= ~0x81;
		msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask,
			vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_vfe44_config_irq(vfe_dev, 0,
			0x81, MSM_ISP_IRQ_DISABLE);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0xC18);
		/* disable danger signal */
		msm_camera_io_w_mb(val & ~(1 << 8), vfe_dev->vfe_base + 0xC18);
@@ -1519,6 +1497,9 @@ static void msm_vfe44_stats_cfg_comp_mask(
		comp_mask_reg |= mask_bf_scale << (16 + request_comp_index * 8);
		atomic_set(stats_comp_mask, stats_mask |
				atomic_read(stats_comp_mask));
		msm_vfe44_config_irq(vfe_dev,
			1 << (request_comp_index + 29), 0,
			MSM_ISP_IRQ_ENABLE);
	} else {
		if (!(atomic_read(stats_comp_mask) & stats_mask))
			return;
@@ -1533,6 +1514,9 @@ static void msm_vfe44_stats_cfg_comp_mask(
				~stats_mask & atomic_read(stats_comp_mask));
		comp_mask_reg &= ~(mask_bf_scale <<
			(16 + request_comp_index * 8));
		msm_vfe44_config_irq(vfe_dev,
			1 << (request_comp_index + 29), 0,
			MSM_ISP_IRQ_DISABLE);
	}
	msm_camera_io_w(comp_mask_reg, vfe_dev->vfe_base + 0x44);

@@ -1548,20 +1532,18 @@ static void msm_vfe44_stats_cfg_wm_irq_mask(
	struct vfe_device *vfe_dev,
	struct msm_vfe_stats_stream *stream_info)
{
	vfe_dev->irq0_mask |=
		1 << (STATS_IDX(stream_info->stream_handle) + 15);
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev,
			1 << (STATS_IDX(stream_info->stream_handle) + 15), 0,
			MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe44_stats_clear_wm_irq_mask(
	struct vfe_device *vfe_dev,
	struct msm_vfe_stats_stream *stream_info)
{
	vfe_dev->irq0_mask &=
		~(1 << (STATS_IDX(stream_info->stream_handle) + 15));
	msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe44_config_irq(vfe_dev,
			(1 << (STATS_IDX(stream_info->stream_handle) + 15)), 0,
			MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe44_stats_cfg_wm_reg(
+43 −58
Original line number Diff line number Diff line
@@ -91,30 +91,24 @@ static void msm_vfe46_config_irq(struct vfe_device *vfe_dev,
		uint32_t irq0_mask, uint32_t irq1_mask,
		enum msm_isp_irq_operation oper)
{
	uint32_t val;

	switch (oper) {
	case MSM_ISP_IRQ_ENABLE:
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
		val |= irq0_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
		val |= irq1_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x60);
		vfe_dev->irq0_mask |= irq0_mask;
		vfe_dev->irq1_mask |= irq1_mask;
		break;
	case MSM_ISP_IRQ_DISABLE:
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x5C);
		val &= ~irq0_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x5C);
		val = msm_camera_io_r(vfe_dev->vfe_base + 0x60);
		val &= ~irq1_mask;
		msm_camera_io_w_mb(val, vfe_dev->vfe_base + 0x60);
		vfe_dev->irq0_mask &= ~irq0_mask;
		vfe_dev->irq1_mask &= ~irq1_mask;
		break;
	case MSM_ISP_IRQ_SET:
		msm_camera_io_w_mb(irq0_mask, vfe_dev->vfe_base + 0x5C);
		msm_camera_io_w_mb(irq1_mask, vfe_dev->vfe_base + 0x60);
		vfe_dev->irq0_mask = irq0_mask;
		vfe_dev->irq1_mask = irq1_mask;
		break;
	}
	msm_camera_io_w_mb(vfe_dev->irq0_mask,
				vfe_dev->vfe_base + 0x5C);
	msm_camera_io_w_mb(vfe_dev->irq1_mask,
				vfe_dev->vfe_base + 0x60);
}

static int32_t msm_vfe46_init_dt_parms(struct vfe_device *vfe_dev,
@@ -207,20 +201,16 @@ static void msm_vfe46_init_hardware_reg(struct vfe_device *vfe_dev)
	/* BUS_CFG */
	msm_camera_io_w(0x00000001, vfe_dev->vfe_base + 0x84);
	/* IRQ_MASK/CLEAR */
	vfe_dev->irq0_mask = 0xE00000F1;
	vfe_dev->irq1_mask = 0xE1FFFFFF;
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev, 0x810000E0, 0xFFFFFF7E,
			MSM_ISP_IRQ_ENABLE);
	msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
	msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
	msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
}

static void msm_vfe46_clear_status_reg(struct vfe_device *vfe_dev)
{
	vfe_dev->irq0_mask = 0x80000000;
	vfe_dev->irq1_mask = 0x0;
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev, 0x80000000, 0, MSM_ISP_IRQ_SET);
	msm_camera_io_w(0xFFFFFFFF, vfe_dev->vfe_base + 0x64);
	msm_camera_io_w_mb(0xFFFFFFFF, vfe_dev->vfe_base + 0x68);
	msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x58);
@@ -354,7 +344,6 @@ static void msm_vfe46_read_irq_status(struct vfe_device *vfe_dev,
	if (*irq_status1 & (1 << 0)) {
		vfe_dev->error_info.camif_status =
		msm_camera_io_r(vfe_dev->vfe_base + 0x3D0);
		vfe_dev->irq1_mask &= ~(1 << 0);
		msm_vfe46_config_irq(vfe_dev, 0, (1 << 0), MSM_ISP_IRQ_DISABLE);
	}

@@ -586,9 +575,8 @@ static void msm_vfe46_axi_cfg_comp_mask(struct vfe_device *vfe_dev,
		stream_composite_mask << (comp_mask_index * 8));
	msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);

	vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev, 1 << (comp_mask_index + 25), 0,
				MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe46_axi_clear_comp_mask(struct vfe_device *vfe_dev,
@@ -600,25 +588,22 @@ static void msm_vfe46_axi_clear_comp_mask(struct vfe_device *vfe_dev,
	comp_mask &= ~(0x7F << (comp_mask_index * 8));
	msm_camera_io_w(comp_mask, vfe_dev->vfe_base + 0x74);

	vfe_dev->irq0_mask |= 1 << (comp_mask_index + 25);
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev, 1 << (comp_mask_index + 25), 0,
				MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe46_axi_cfg_wm_irq_mask(struct vfe_device *vfe_dev,
	struct msm_vfe_axi_stream *stream_info)
{
	vfe_dev->irq0_mask |= 1 << (stream_info->wm[0] + 8);
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev, 1 << (stream_info->wm[0] + 8), 0,
				MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe46_axi_clear_wm_irq_mask(struct vfe_device *vfe_dev,
	struct msm_vfe_axi_stream *stream_info)
{
	vfe_dev->irq0_mask &= ~(1 << (stream_info->wm[0] + 8));
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
				MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev, (1 << (stream_info->wm[0] + 8)), 0,
				MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe46_cfg_framedrop(void __iomem *vfe_base,
@@ -856,10 +841,8 @@ static void msm_vfe46_cfg_fetch_engine(struct vfe_device *vfe_dev,
		temp |= (1 << 1);
		msm_camera_io_w(temp, vfe_dev->vfe_base + 0x84);

		vfe_dev->irq0_mask &= 0xFEFFFFFF;
		vfe_dev->irq0_mask |= (1 << 24);
		msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
				vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_vfe46_config_irq(vfe_dev, 1 << 24, 0,
					MSM_ISP_IRQ_ENABLE);

		temp = fe_cfg->fetch_height - 1;
		msm_camera_io_w(temp & 0x3FFF, vfe_dev->vfe_base + 0x278);
@@ -1119,13 +1102,11 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev,
		return;

	if (update_state == ENABLE_CAMIF) {
		msm_camera_io_w(0, vfe_dev->vfe_base + 0x64);
		msm_camera_io_w((1 << 0), vfe_dev->vfe_base + 0x68);
		msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x58);
		vfe_dev->irq0_mask |= 0xF5;
		vfe_dev->irq1_mask |= 0x81;
		msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
				vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x64);
		msm_camera_io_w(0x81, vfe_dev->vfe_base + 0x68);
		msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58);
		msm_vfe46_config_irq(vfe_dev, 0x15, 0x81,
					MSM_ISP_IRQ_ENABLE);

		bus_en =
			((vfe_dev->axi_data.
@@ -1147,9 +1128,8 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev,
			msm_camera_io_w(1, vfe_dev->vfe_base + 0xAF4);
	} else if (update_state == DISABLE_CAMIF ||
		DISABLE_CAMIF_IMMEDIATELY == update_state) {
		vfe_dev->irq1_mask &= ~0x81;
		msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask,
			vfe_dev->irq1_mask, MSM_ISP_IRQ_SET);
		msm_vfe46_config_irq(vfe_dev, 0, 0x81,
				MSM_ISP_IRQ_DISABLE);
		/* disable danger signal */
		val = msm_camera_io_r(vfe_dev->vfe_base + 0xC18);
		val &= ~(1 << 8);
@@ -1609,6 +1589,9 @@ static void msm_vfe46_stats_cfg_comp_mask(
		comp_mask_reg |= mask_bf_scale << (16 + request_comp_index * 8);
		atomic_set(stats_comp_mask, stats_mask |
				atomic_read(stats_comp_mask));
		msm_vfe46_config_irq(vfe_dev,
			1 << (request_comp_index + 29), 0,
			MSM_ISP_IRQ_ENABLE);
	} else {
		if (!(atomic_read(stats_comp_mask) & stats_mask))
			return;
@@ -1623,6 +1606,9 @@ static void msm_vfe46_stats_cfg_comp_mask(
				~stats_mask & atomic_read(stats_comp_mask));
		comp_mask_reg &= ~(mask_bf_scale <<
			(16 + request_comp_index * 8));
		msm_vfe46_config_irq(vfe_dev,
			1 << (request_comp_index + 29), 0,
			MSM_ISP_IRQ_DISABLE);
	}
	msm_camera_io_w(comp_mask_reg, vfe_dev->vfe_base + 0x78);

@@ -1638,19 +1624,18 @@ static void msm_vfe46_stats_cfg_wm_irq_mask(
	struct vfe_device *vfe_dev,
	struct msm_vfe_stats_stream *stream_info)
{
	vfe_dev->irq0_mask |= 1 << (STATS_IDX(stream_info->stream_handle) + 15);
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev,
			1 << (STATS_IDX(stream_info->stream_handle) + 15), 0,
			MSM_ISP_IRQ_ENABLE);
}

static void msm_vfe46_stats_clear_wm_irq_mask(
	struct vfe_device *vfe_dev,
	struct msm_vfe_stats_stream *stream_info)
{
	vfe_dev->irq0_mask &=
		~(1 << (STATS_IDX(stream_info->stream_handle) + 15));
	msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask,
			MSM_ISP_IRQ_SET);
	msm_vfe46_config_irq(vfe_dev,
			1 << (STATS_IDX(stream_info->stream_handle) + 15), 0,
			MSM_ISP_IRQ_DISABLE);
}

static void msm_vfe46_stats_cfg_wm_reg(
+55 −85

File changed.

Preview size limit exceeded, changes collapsed.

+16 −14
Original line number Diff line number Diff line
@@ -1192,15 +1192,9 @@ int msm_isp_request_axi_stream(struct vfe_device *vfe_dev, void *arg)
		vfe_dev->vt_enable = stream_cfg_cmd->vt_enable;
		msm_isp_start_avtimer();
	}
	if (stream_info->num_planes > 1) {
	if (stream_info->num_planes > 1)
		msm_isp_axi_reserve_comp_mask(
			&vfe_dev->axi_data, stream_info);
		vfe_dev->hw_info->vfe_ops.axi_ops.
		cfg_comp_mask(vfe_dev, stream_info);
	} else {
		vfe_dev->hw_info->vfe_ops.axi_ops.
			cfg_wm_irq_mask(vfe_dev, stream_info);
	}

	for (i = 0; i < stream_info->num_planes; i++) {
		vfe_dev->hw_info->vfe_ops.axi_ops.
@@ -1256,14 +1250,8 @@ int msm_isp_release_axi_stream(struct vfe_device *vfe_dev, void *arg)
		clear_wm_xbar_reg(vfe_dev, stream_info, i);
	}

	if (stream_info->num_planes > 1) {
		vfe_dev->hw_info->vfe_ops.axi_ops.
			clear_comp_mask(vfe_dev, stream_info);
	if (stream_info->num_planes > 1)
		msm_isp_axi_free_comp_mask(&vfe_dev->axi_data, stream_info);
	} else {
		vfe_dev->hw_info->vfe_ops.axi_ops.
		clear_wm_irq_mask(vfe_dev, stream_info);
	}

	vfe_dev->hw_info->vfe_ops.axi_ops.clear_framedrop(vfe_dev, stream_info);
	msm_isp_axi_free_wm(axi_data, stream_info);
@@ -2656,6 +2644,13 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev,
			return rc;
		}
		spin_unlock_irqrestore(&stream_info->lock, flags);
		if (stream_info->num_planes > 1) {
			vfe_dev->hw_info->vfe_ops.axi_ops.
				cfg_comp_mask(vfe_dev, stream_info);
		} else {
			vfe_dev->hw_info->vfe_ops.axi_ops.
				cfg_wm_irq_mask(vfe_dev, stream_info);
		}

		stream_info->state = START_PENDING;

@@ -2772,6 +2767,13 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev,
		spin_unlock_irqrestore(&stream_info->lock, flags);
		wait_for_complete_for_this_stream = 0;

		if (stream_info->num_planes > 1)
			vfe_dev->hw_info->vfe_ops.axi_ops.
				clear_comp_mask(vfe_dev, stream_info);
		else
			vfe_dev->hw_info->vfe_ops.axi_ops.
				clear_wm_irq_mask(vfe_dev, stream_info);

		stream_info->state = STOP_PENDING;

		if (!halt && !ext_read &&
Loading