static int csi_stream_on(struct fimc_is_device_csi *csi)
{
	int ret = 0;
	u32 settle;

	BUG_ON(!csi);
	BUG_ON(!csi->sensor_cfg);

	s5pcsis_reset(csi->base_reg);

	settle = get_hsync_settle(
		csi->sensor_cfg,
		csi->sensor_cfgs,
		csi->image.window.width,
		csi->image.window.height,
		csi->image.framerate);

	info("[CSI:D:%d] settle(%dx%d@%d) = %d\n",
		csi->instance,
		csi->image.window.width,
		csi->image.window.height,
		csi->image.framerate,
		settle);

	s5pcsis_set_hsync_settle(csi->base_reg, settle);
	s5pcsis_set_params(csi->base_reg, &csi->image);
	s5pcsis_system_enable(csi->base_reg, true);
	s5pcsis_enable_interrupts(csi->base_reg, &csi->image, true);

	return ret;
}
Example #2
0
static int csi_stream_on(struct fimc_is_device_csi *csi)
{
	int ret = 0;
	u32 settle;
	unsigned long __iomem *base_reg;

	BUG_ON(!csi);
	BUG_ON(!csi->sensor_cfg);

	base_reg = csi->base_reg;

	settle = get_hsync_settle(
		csi->sensor_cfg,
		csi->sensor_cfgs,
		csi->image.window.width,
		csi->image.window.height,
		csi->image.framerate);

	minfo("[CSI:D] settle(%dx%d@%d) = %d, lane idx(%d)\n",
		csi,
		csi->image.window.width,
		csi->image.window.height,
		csi->image.framerate,
		settle,
		csi->lanes);

#if (FIMC_IS_CSI_VERSION == CSI_VERSION_0000_0000)
	s5pcsis_reset(base_reg);
	s5pcsis_set_hsync_settle(base_reg, settle);
	s5pcsis_set_params(base_reg, &csi->image, csi->lanes);
	/* lane total count = csi->lanes + 1 (CSI_DATA_LANES_1 is 0) */
	s5pcsis_system_enable(base_reg, true, (csi->lanes + 1));
	s5pcsis_enable_interrupts(base_reg, &csi->image, true);
#else
	csi_hw_reset(base_reg);
	csi_hw_s_settle(base_reg, settle);
	csi_hw_s_control(base_reg, csi->image.format.pixelformat, csi->mode, csi->lanes);
	if (csi->mode == CSI_MODE_CH0_ONLY) {
		csi_hw_s_config(base_reg,
			CSI_VIRTUAL_CH_0,
			CSI_VIRTUAL_CH_0,
			csi->image.format.pixelformat,
			csi->image.window.width,
			csi->image.window.height);
	} else {
		u32 index = get_vci_channel(csi->vci, csi->vcis, csi->image.format.pixelformat);
		csi_hw_s_config(base_reg,
			CSI_VIRTUAL_CH_0,
			csi->vci[index].vc_map[CSI_VIRTUAL_CH_0],
			csi->image.format.pixelformat,
			csi->image.window.width,
			csi->image.window.height);
		csi_hw_s_config(base_reg,
			CSI_VIRTUAL_CH_1,
			csi->vci[index].vc_map[CSI_VIRTUAL_CH_1],
			csi->image.format.pixelformat,
			csi->image.window.width,
			csi->image.window.height);
		csi_hw_s_config(base_reg,
			CSI_VIRTUAL_CH_2,
			csi->vci[index].vc_map[CSI_VIRTUAL_CH_2],
			csi->image.format.pixelformat,
			csi->image.window.width,
			csi->image.window.height);
	}

	csi_hw_s_interrupt(base_reg, true);
	csi_hw_enable(base_reg);
#endif

	return ret;
}