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

Commit 1aaee421 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: Control camif interrupts on camif enable/disable"

parents 6f69554f bd06d1fc
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);
	}

@@ -810,11 +797,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,
@@ -826,27 +811,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,
@@ -1146,10 +1128,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);
@@ -1456,14 +1436,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 =
@@ -1484,9 +1461,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);
@@ -1965,6 +1941,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;
@@ -1972,6 +1951,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);

@@ -1987,20 +1969,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);
	}

@@ -648,9 +635,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,
@@ -662,25 +648,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,
@@ -916,10 +899,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);

@@ -1043,14 +1024,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 =
@@ -1069,9 +1048,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);
@@ -1518,6 +1496,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;
@@ -1532,6 +1513,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);

@@ -1547,20 +1531,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);
	}

@@ -585,9 +574,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,
@@ -599,25 +587,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,
@@ -855,10 +840,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);
@@ -1118,13 +1101,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.
@@ -1146,9 +1127,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);
@@ -1608,6 +1588,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;
@@ -1622,6 +1605,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);

@@ -1637,19 +1623,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
@@ -1196,15 +1196,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.
@@ -1260,14 +1254,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);
@@ -2741,6 +2729,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;

@@ -2856,6 +2851,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