[media] s5p-fimc: Redefine platform data structure for fimc-is
Newer Exynos4 SoC are equipped with a local camera ISP that controls external raw image sensor directly. Such sensors can be connected through FIMC-LITEn (and MIPI-CSISn) IPs to the ISP, which then feeds image data to the FIMCn IP. Thus there can be two busses associated with an image source (sensor). Rename struct s5p_fimc_isp_info describing external image sensor (video decoder) to struct fimc_source_info to avoid confusion. bus_type is split into fimc_bus_type and sensor_bus_type. The bus type enumeration is extended to include both FIMC Writeback input types. The bus_type enumeration and the data structure name in the board files are modified according to the above changes. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Acked-by: Kukjin Kim <kgene.kim@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
		
					parent
					
						
							
								b84ef24e1e
							
						
					
				
			
			
				commit
				
					
						56bc911ac3
					
				
			
		
					 10 changed files with 79 additions and 62 deletions
				
			
		|  | @ -1209,25 +1209,25 @@ static struct i2c_board_info m5mols_board_info = { | ||||||
| 	.platform_data	= &m5mols_platdata, | 	.platform_data	= &m5mols_platdata, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct s5p_fimc_isp_info nuri_camera_sensors[] = { | static struct fimc_source_info nuri_camera_sensors[] = { | ||||||
| 	{ | 	{ | ||||||
| 		.flags		= V4L2_MBUS_PCLK_SAMPLE_RISING | | 		.flags		= V4L2_MBUS_PCLK_SAMPLE_RISING | | ||||||
| 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | ||||||
| 		.bus_type	= FIMC_ITU_601, | 		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601, | ||||||
| 		.board_info	= &s5k6aa_board_info, | 		.board_info	= &s5k6aa_board_info, | ||||||
| 		.clk_frequency	= 24000000UL, | 		.clk_frequency	= 24000000UL, | ||||||
| 		.i2c_bus_num	= 6, | 		.i2c_bus_num	= 6, | ||||||
| 	}, { | 	}, { | ||||||
| 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | ||||||
| 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | ||||||
| 		.bus_type	= FIMC_MIPI_CSI2, | 		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2, | ||||||
| 		.board_info	= &m5mols_board_info, | 		.board_info	= &m5mols_board_info, | ||||||
| 		.clk_frequency	= 24000000UL, | 		.clk_frequency	= 24000000UL, | ||||||
| 	}, | 	}, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct s5p_platform_fimc fimc_md_platdata = { | static struct s5p_platform_fimc fimc_md_platdata = { | ||||||
| 	.isp_info	= nuri_camera_sensors, | 	.source_info	= nuri_camera_sensors, | ||||||
| 	.num_clients	= ARRAY_SIZE(nuri_camera_sensors), | 	.num_clients	= ARRAY_SIZE(nuri_camera_sensors), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -988,12 +988,12 @@ static struct i2c_board_info m5mols_board_info = { | ||||||
| 	.platform_data = &m5mols_platdata, | 	.platform_data = &m5mols_platdata, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct s5p_fimc_isp_info universal_camera_sensors[] = { | static struct fimc_source_info universal_camera_sensors[] = { | ||||||
| 	{ | 	{ | ||||||
| 		.mux_id		= 0, | 		.mux_id		= 0, | ||||||
| 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | ||||||
| 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | ||||||
| 		.bus_type	= FIMC_ITU_601, | 		.fimc_bus_type	= FIMC_BUS_TYPE_ITU_601, | ||||||
| 		.board_info	= &s5k6aa_board_info, | 		.board_info	= &s5k6aa_board_info, | ||||||
| 		.i2c_bus_num	= 0, | 		.i2c_bus_num	= 0, | ||||||
| 		.clk_frequency	= 24000000UL, | 		.clk_frequency	= 24000000UL, | ||||||
|  | @ -1001,7 +1001,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = { | ||||||
| 		.mux_id		= 0, | 		.mux_id		= 0, | ||||||
| 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | ||||||
| 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | ||||||
| 		.bus_type	= FIMC_MIPI_CSI2, | 		.fimc_bus_type	= FIMC_BUS_TYPE_MIPI_CSI2, | ||||||
| 		.board_info	= &m5mols_board_info, | 		.board_info	= &m5mols_board_info, | ||||||
| 		.i2c_bus_num	= 0, | 		.i2c_bus_num	= 0, | ||||||
| 		.clk_frequency	= 24000000UL, | 		.clk_frequency	= 24000000UL, | ||||||
|  | @ -1009,7 +1009,7 @@ static struct s5p_fimc_isp_info universal_camera_sensors[] = { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct s5p_platform_fimc fimc_md_platdata = { | static struct s5p_platform_fimc fimc_md_platdata = { | ||||||
| 	.isp_info	= universal_camera_sensors, | 	.source_info	= universal_camera_sensors, | ||||||
| 	.num_clients	= ARRAY_SIZE(universal_camera_sensors), | 	.num_clients	= ARRAY_SIZE(universal_camera_sensors), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -841,12 +841,12 @@ static struct i2c_board_info noon010pc30_board_info = { | ||||||
| 	.platform_data = &noon010pc30_pldata, | 	.platform_data = &noon010pc30_pldata, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct s5p_fimc_isp_info goni_camera_sensors[] = { | static struct fimc_source_info goni_camera_sensors[] = { | ||||||
| 	{ | 	{ | ||||||
| 		.mux_id		= 0, | 		.mux_id		= 0, | ||||||
| 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | 		.flags		= V4L2_MBUS_PCLK_SAMPLE_FALLING | | ||||||
| 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | 				  V4L2_MBUS_VSYNC_ACTIVE_LOW, | ||||||
| 		.bus_type	= FIMC_ITU_601, | 		.bus_type	= FIMC_BUS_TYPE_ITU_601, | ||||||
| 		.board_info	= &noon010pc30_board_info, | 		.board_info	= &noon010pc30_board_info, | ||||||
| 		.i2c_bus_num	= 0, | 		.i2c_bus_num	= 0, | ||||||
| 		.clk_frequency	= 16000000UL, | 		.clk_frequency	= 16000000UL, | ||||||
|  | @ -854,7 +854,7 @@ static struct s5p_fimc_isp_info goni_camera_sensors[] = { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = { | static struct s5p_platform_fimc goni_fimc_md_platdata __initdata = { | ||||||
| 	.isp_info	= goni_camera_sensors, | 	.source_info	= goni_camera_sensors, | ||||||
| 	.num_clients	= ARRAY_SIZE(goni_camera_sensors), | 	.num_clients	= ARRAY_SIZE(goni_camera_sensors), | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -187,12 +187,12 @@ static void flite_hw_set_camera_port(struct fimc_lite *dev, int id) | ||||||
| 
 | 
 | ||||||
| /* Select serial or parallel bus, camera port (A,B) and set signals polarity */ | /* Select serial or parallel bus, camera port (A,B) and set signals polarity */ | ||||||
| void flite_hw_set_camera_bus(struct fimc_lite *dev, | void flite_hw_set_camera_bus(struct fimc_lite *dev, | ||||||
| 			     struct s5p_fimc_isp_info *s_info) | 			     struct fimc_source_info *si) | ||||||
| { | { | ||||||
| 	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL); | 	u32 cfg = readl(dev->regs + FLITE_REG_CIGCTRL); | ||||||
| 	unsigned int flags = s_info->flags; | 	unsigned int flags = si->flags; | ||||||
| 
 | 
 | ||||||
| 	if (s_info->bus_type != FIMC_MIPI_CSI2) { | 	if (si->sensor_bus_type != FIMC_BUS_TYPE_MIPI_CSI2) { | ||||||
| 		cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI | | 		cfg &= ~(FLITE_REG_CIGCTRL_SELCAM_MIPI | | ||||||
| 			 FLITE_REG_CIGCTRL_INVPOLPCLK | | 			 FLITE_REG_CIGCTRL_INVPOLPCLK | | ||||||
| 			 FLITE_REG_CIGCTRL_INVPOLVSYNC | | 			 FLITE_REG_CIGCTRL_INVPOLVSYNC | | ||||||
|  | @ -212,7 +212,7 @@ void flite_hw_set_camera_bus(struct fimc_lite *dev, | ||||||
| 
 | 
 | ||||||
| 	writel(cfg, dev->regs + FLITE_REG_CIGCTRL); | 	writel(cfg, dev->regs + FLITE_REG_CIGCTRL); | ||||||
| 
 | 
 | ||||||
| 	flite_hw_set_camera_port(dev, s_info->mux_id); | 	flite_hw_set_camera_port(dev, si->mux_id); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f) | static void flite_hw_set_out_order(struct fimc_lite *dev, struct flite_frame *f) | ||||||
|  |  | ||||||
|  | @ -131,9 +131,9 @@ void flite_hw_set_interrupt_mask(struct fimc_lite *dev); | ||||||
| void flite_hw_capture_start(struct fimc_lite *dev); | void flite_hw_capture_start(struct fimc_lite *dev); | ||||||
| void flite_hw_capture_stop(struct fimc_lite *dev); | void flite_hw_capture_stop(struct fimc_lite *dev); | ||||||
| void flite_hw_set_camera_bus(struct fimc_lite *dev, | void flite_hw_set_camera_bus(struct fimc_lite *dev, | ||||||
| 			     struct s5p_fimc_isp_info *s_info); | 			     struct fimc_source_info *s_info); | ||||||
| void flite_hw_set_camera_polarity(struct fimc_lite *dev, | void flite_hw_set_camera_polarity(struct fimc_lite *dev, | ||||||
| 				  struct s5p_fimc_isp_info *cam); | 				  struct fimc_source_info *cam); | ||||||
| void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f); | void flite_hw_set_window_offset(struct fimc_lite *dev, struct flite_frame *f); | ||||||
| void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f); | void flite_hw_set_source_format(struct fimc_lite *dev, struct flite_frame *f); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -290,7 +290,7 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd) | ||||||
| 	for (i = 0; i < num_clients; i++) { | 	for (i = 0; i < num_clients; i++) { | ||||||
| 		struct v4l2_subdev *sd; | 		struct v4l2_subdev *sd; | ||||||
| 
 | 
 | ||||||
| 		fmd->sensor[i].pdata = pdata->isp_info[i]; | 		fmd->sensor[i].pdata = pdata->source_info[i]; | ||||||
| 		ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true); | 		ret = __fimc_md_set_camclk(fmd, &fmd->sensor[i], true); | ||||||
| 		if (ret) | 		if (ret) | ||||||
| 			break; | 			break; | ||||||
|  | @ -504,7 +504,7 @@ static int __fimc_md_create_fimc_sink_links(struct fimc_md *fmd, | ||||||
| 					    struct v4l2_subdev *sensor, | 					    struct v4l2_subdev *sensor, | ||||||
| 					    int pad, int link_mask) | 					    int pad, int link_mask) | ||||||
| { | { | ||||||
| 	struct fimc_sensor_info *s_info; | 	struct fimc_sensor_info *s_info = NULL; | ||||||
| 	struct media_entity *sink; | 	struct media_entity *sink; | ||||||
| 	unsigned int flags = 0; | 	unsigned int flags = 0; | ||||||
| 	int ret, i; | 	int ret, i; | ||||||
|  | @ -614,7 +614,7 @@ static int fimc_md_create_links(struct fimc_md *fmd) | ||||||
| { | { | ||||||
| 	struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL }; | 	struct v4l2_subdev *csi_sensors[CSIS_MAX_ENTITIES] = { NULL }; | ||||||
| 	struct v4l2_subdev *sensor, *csis; | 	struct v4l2_subdev *sensor, *csis; | ||||||
| 	struct s5p_fimc_isp_info *pdata; | 	struct fimc_source_info *pdata; | ||||||
| 	struct fimc_sensor_info *s_info; | 	struct fimc_sensor_info *s_info; | ||||||
| 	struct media_entity *source, *sink; | 	struct media_entity *source, *sink; | ||||||
| 	int i, pad, fimc_id = 0, ret = 0; | 	int i, pad, fimc_id = 0, ret = 0; | ||||||
|  | @ -632,8 +632,8 @@ static int fimc_md_create_links(struct fimc_md *fmd) | ||||||
| 		source = NULL; | 		source = NULL; | ||||||
| 		pdata = &s_info->pdata; | 		pdata = &s_info->pdata; | ||||||
| 
 | 
 | ||||||
| 		switch (pdata->bus_type) { | 		switch (pdata->sensor_bus_type) { | ||||||
| 		case FIMC_MIPI_CSI2: | 		case FIMC_BUS_TYPE_MIPI_CSI2: | ||||||
| 			if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES, | 			if (WARN(pdata->mux_id >= CSIS_MAX_ENTITIES, | ||||||
| 				"Wrong CSI channel id: %d\n", pdata->mux_id)) | 				"Wrong CSI channel id: %d\n", pdata->mux_id)) | ||||||
| 				return -EINVAL; | 				return -EINVAL; | ||||||
|  | @ -659,14 +659,14 @@ static int fimc_md_create_links(struct fimc_md *fmd) | ||||||
| 			csi_sensors[pdata->mux_id] = sensor; | 			csi_sensors[pdata->mux_id] = sensor; | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		case FIMC_ITU_601...FIMC_ITU_656: | 		case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656: | ||||||
| 			source = &sensor->entity; | 			source = &sensor->entity; | ||||||
| 			pad = 0; | 			pad = 0; | ||||||
| 			break; | 			break; | ||||||
| 
 | 
 | ||||||
| 		default: | 		default: | ||||||
| 			v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n", | 			v4l2_err(&fmd->v4l2_dev, "Wrong bus_type: %x\n", | ||||||
| 				 pdata->bus_type); | 				 pdata->sensor_bus_type); | ||||||
| 			return -EINVAL; | 			return -EINVAL; | ||||||
| 		} | 		} | ||||||
| 		if (source == NULL) | 		if (source == NULL) | ||||||
|  | @ -762,7 +762,7 @@ static int __fimc_md_set_camclk(struct fimc_md *fmd, | ||||||
| 				struct fimc_sensor_info *s_info, | 				struct fimc_sensor_info *s_info, | ||||||
| 				bool on) | 				bool on) | ||||||
| { | { | ||||||
| 	struct s5p_fimc_isp_info *pdata = &s_info->pdata; | 	struct fimc_source_info *pdata = &s_info->pdata; | ||||||
| 	struct fimc_camclk_info *camclk; | 	struct fimc_camclk_info *camclk; | ||||||
| 	int ret = 0; | 	int ret = 0; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -53,7 +53,7 @@ struct fimc_camclk_info { | ||||||
|  * This data structure applies to image sensor and the writeback subdevs. |  * This data structure applies to image sensor and the writeback subdevs. | ||||||
|  */ |  */ | ||||||
| struct fimc_sensor_info { | struct fimc_sensor_info { | ||||||
| 	struct s5p_fimc_isp_info pdata; | 	struct fimc_source_info pdata; | ||||||
| 	struct v4l2_subdev *subdev; | 	struct v4l2_subdev *subdev; | ||||||
| 	struct fimc_dev *host; | 	struct fimc_dev *host; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -554,7 +554,7 @@ void fimc_hw_set_output_addr(struct fimc_dev *dev, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, | int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, | ||||||
| 				struct s5p_fimc_isp_info *cam) | 				struct fimc_source_info *cam) | ||||||
| { | { | ||||||
| 	u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL); | 	u32 cfg = readl(fimc->regs + FIMC_REG_CIGCTRL); | ||||||
| 
 | 
 | ||||||
|  | @ -596,14 +596,15 @@ static const struct mbus_pixfmt_desc pix_desc[] = { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int fimc_hw_set_camera_source(struct fimc_dev *fimc, | int fimc_hw_set_camera_source(struct fimc_dev *fimc, | ||||||
| 			      struct s5p_fimc_isp_info *cam) | 			      struct fimc_source_info *source) | ||||||
| { | { | ||||||
| 	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame; | 	struct fimc_frame *f = &fimc->vid_cap.ctx->s_frame; | ||||||
| 	u32 cfg = 0; | 	u32 bus_width, cfg = 0; | ||||||
| 	u32 bus_width; |  | ||||||
| 	int i; | 	int i; | ||||||
| 
 | 
 | ||||||
| 	if (cam->bus_type == FIMC_ITU_601 || cam->bus_type == FIMC_ITU_656) { | 	switch (source->fimc_bus_type) { | ||||||
|  | 	case FIMC_BUS_TYPE_ITU_601: | ||||||
|  | 	case FIMC_BUS_TYPE_ITU_656: | ||||||
| 		for (i = 0; i < ARRAY_SIZE(pix_desc); i++) { | 		for (i = 0; i < ARRAY_SIZE(pix_desc); i++) { | ||||||
| 			if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) { | 			if (fimc->vid_cap.mf.code == pix_desc[i].pixelcode) { | ||||||
| 				cfg = pix_desc[i].cisrcfmt; | 				cfg = pix_desc[i].cisrcfmt; | ||||||
|  | @ -619,15 +620,17 @@ int fimc_hw_set_camera_source(struct fimc_dev *fimc, | ||||||
| 			return -EINVAL; | 			return -EINVAL; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (cam->bus_type == FIMC_ITU_601) { | 		if (source->fimc_bus_type == FIMC_BUS_TYPE_ITU_601) { | ||||||
| 			if (bus_width == 8) | 			if (bus_width == 8) | ||||||
| 				cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; | 				cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; | ||||||
| 			else if (bus_width == 16) | 			else if (bus_width == 16) | ||||||
| 				cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT; | 				cfg |= FIMC_REG_CISRCFMT_ITU601_16BIT; | ||||||
| 		} /* else defaults to ITU-R BT.656 8-bit */ | 		} /* else defaults to ITU-R BT.656 8-bit */ | ||||||
| 	} else if (cam->bus_type == FIMC_MIPI_CSI2) { | 		break; | ||||||
|  | 	case FIMC_BUS_TYPE_MIPI_CSI2: | ||||||
| 		if (fimc_fmt_is_user_defined(f->fmt->color)) | 		if (fimc_fmt_is_user_defined(f->fmt->color)) | ||||||
| 			cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; | 			cfg |= FIMC_REG_CISRCFMT_ITU601_8BIT; | ||||||
|  | 		break; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	cfg |= (f->o_width << 16) | f->o_height; | 	cfg |= (f->o_width << 16) | f->o_height; | ||||||
|  | @ -655,7 +658,7 @@ void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int fimc_hw_set_camera_type(struct fimc_dev *fimc, | int fimc_hw_set_camera_type(struct fimc_dev *fimc, | ||||||
| 			    struct s5p_fimc_isp_info *cam) | 			    struct fimc_source_info *source) | ||||||
| { | { | ||||||
| 	u32 cfg, tmp; | 	u32 cfg, tmp; | ||||||
| 	struct fimc_vid_cap *vid_cap = &fimc->vid_cap; | 	struct fimc_vid_cap *vid_cap = &fimc->vid_cap; | ||||||
|  | @ -668,11 +671,11 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc, | ||||||
| 		FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB | | 		FIMC_REG_CIGCTRL_SELCAM_MIPI | FIMC_REG_CIGCTRL_CAMIF_SELWB | | ||||||
| 		FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG); | 		FIMC_REG_CIGCTRL_SELCAM_MIPI_A | FIMC_REG_CIGCTRL_CAM_JPEG); | ||||||
| 
 | 
 | ||||||
| 	switch (cam->bus_type) { | 	switch (source->fimc_bus_type) { | ||||||
| 	case FIMC_MIPI_CSI2: | 	case FIMC_BUS_TYPE_MIPI_CSI2: | ||||||
| 		cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI; | 		cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI; | ||||||
| 
 | 
 | ||||||
| 		if (cam->mux_id == 0) | 		if (source->mux_id == 0) | ||||||
| 			cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A; | 			cfg |= FIMC_REG_CIGCTRL_SELCAM_MIPI_A; | ||||||
| 
 | 
 | ||||||
| 		/* TODO: add remaining supported formats. */ | 		/* TODO: add remaining supported formats. */ | ||||||
|  | @ -695,15 +698,16 @@ int fimc_hw_set_camera_type(struct fimc_dev *fimc, | ||||||
| 
 | 
 | ||||||
| 		writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT); | 		writel(tmp, fimc->regs + FIMC_REG_CSIIMGFMT); | ||||||
| 		break; | 		break; | ||||||
| 	case FIMC_ITU_601...FIMC_ITU_656: | 	case FIMC_BUS_TYPE_ITU_601...FIMC_BUS_TYPE_ITU_656: | ||||||
| 		if (cam->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */ | 		if (source->mux_id == 0) /* ITU-A, ITU-B: 0, 1 */ | ||||||
| 			cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A; | 			cfg |= FIMC_REG_CIGCTRL_SELCAM_ITU_A; | ||||||
| 		break; | 		break; | ||||||
| 	case FIMC_LCD_WB: | 	case FIMC_BUS_TYPE_LCD_WRITEBACK_A: | ||||||
| 		cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB; | 		cfg |= FIMC_REG_CIGCTRL_CAMIF_SELWB; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		v4l2_err(&vid_cap->vfd, "Invalid camera bus type selected\n"); | 		v4l2_err(&vid_cap->vfd, "Invalid FIMC bus type selected: %d\n", | ||||||
|  | 			 source->fimc_bus_type); | ||||||
| 		return -EINVAL; | 		return -EINVAL; | ||||||
| 	} | 	} | ||||||
| 	writel(cfg, fimc->regs + FIMC_REG_CIGCTRL); | 	writel(cfg, fimc->regs + FIMC_REG_CIGCTRL); | ||||||
|  |  | ||||||
|  | @ -297,12 +297,12 @@ void fimc_hw_set_input_addr(struct fimc_dev *fimc, struct fimc_addr *paddr); | ||||||
| void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr, | void fimc_hw_set_output_addr(struct fimc_dev *fimc, struct fimc_addr *paddr, | ||||||
| 			     int index); | 			     int index); | ||||||
| int fimc_hw_set_camera_source(struct fimc_dev *fimc, | int fimc_hw_set_camera_source(struct fimc_dev *fimc, | ||||||
| 			      struct s5p_fimc_isp_info *cam); | 			      struct fimc_source_info *cam); | ||||||
| void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f); | void fimc_hw_set_camera_offset(struct fimc_dev *fimc, struct fimc_frame *f); | ||||||
| int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, | int fimc_hw_set_camera_polarity(struct fimc_dev *fimc, | ||||||
| 				struct s5p_fimc_isp_info *cam); | 				struct fimc_source_info *cam); | ||||||
| int fimc_hw_set_camera_type(struct fimc_dev *fimc, | int fimc_hw_set_camera_type(struct fimc_dev *fimc, | ||||||
| 			    struct s5p_fimc_isp_info *cam); | 			    struct fimc_source_info *cam); | ||||||
| void fimc_hw_clear_irq(struct fimc_dev *dev); | void fimc_hw_clear_irq(struct fimc_dev *dev); | ||||||
| void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on); | void fimc_hw_enable_scaler(struct fimc_dev *dev, bool on); | ||||||
| void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on); | void fimc_hw_activate_input_dma(struct fimc_dev *dev, bool on); | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| /*
 | /*
 | ||||||
|  * Samsung S5P SoC camera interface driver header |  * Samsung S5P/Exynos4 SoC series camera interface driver header | ||||||
|  * |  * | ||||||
|  * Copyright (c) 2010 Samsung Electronics Co., Ltd |  * Copyright (C) 2010 - 2013 Samsung Electronics Co., Ltd. | ||||||
|  * Author: Sylwester Nawrocki, <s.nawrocki@samsung.com> |  * Sylwester Nawrocki <s.nawrocki@samsung.com> | ||||||
|  * |  * | ||||||
|  * This program is free software; you can redistribute it and/or modify |  * This program is free software; you can redistribute it and/or modify | ||||||
|  * it under the terms of the GNU General Public License version 2 as |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  | @ -14,45 +14,58 @@ | ||||||
| 
 | 
 | ||||||
| #include <media/media-entity.h> | #include <media/media-entity.h> | ||||||
| 
 | 
 | ||||||
| enum cam_bus_type { | /*
 | ||||||
| 	FIMC_ITU_601 = 1, |  * Enumeration of the FIMC data bus types. | ||||||
| 	FIMC_ITU_656, |  */ | ||||||
| 	FIMC_MIPI_CSI2, | enum fimc_bus_type { | ||||||
| 	FIMC_LCD_WB, /* FIFO link from LCD mixer */ | 	/* Camera parallel bus */ | ||||||
|  | 	FIMC_BUS_TYPE_ITU_601 = 1, | ||||||
|  | 	/* Camera parallel bus with embedded synchronization */ | ||||||
|  | 	FIMC_BUS_TYPE_ITU_656, | ||||||
|  | 	/* Camera MIPI-CSI2 serial bus */ | ||||||
|  | 	FIMC_BUS_TYPE_MIPI_CSI2, | ||||||
|  | 	/* FIFO link from LCD controller (WriteBack A) */ | ||||||
|  | 	FIMC_BUS_TYPE_LCD_WRITEBACK_A, | ||||||
|  | 	/* FIFO link from LCD controller (WriteBack B) */ | ||||||
|  | 	FIMC_BUS_TYPE_LCD_WRITEBACK_B, | ||||||
|  | 	/* FIFO link from FIMC-IS */ | ||||||
|  | 	FIMC_BUS_TYPE_ISP_WRITEBACK = FIMC_BUS_TYPE_LCD_WRITEBACK_B, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct i2c_board_info; | struct i2c_board_info; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct s5p_fimc_isp_info - image sensor information required for host |  * struct fimc_source_info - video source description required for the host | ||||||
|  *			      interace configuration. |  *			     interface configuration | ||||||
|  * |  * | ||||||
|  * @board_info: pointer to I2C subdevice's board info |  * @board_info: pointer to I2C subdevice's board info | ||||||
|  * @clk_frequency: frequency of the clock the host interface provides to sensor |  * @clk_frequency: frequency of the clock the host interface provides to sensor | ||||||
|  * @bus_type: determines bus type, MIPI, ITU-R BT.601 etc. |  * @fimc_bus_type: FIMC camera input type | ||||||
|  |  * @sensor_bus_type: image sensor bus type, MIPI, ITU-R BT.601 etc. | ||||||
|  |  * @flags: the parallel sensor bus flags defining signals polarity (V4L2_MBUS_*) | ||||||
|  * @i2c_bus_num: i2c control bus id the sensor is attached to |  * @i2c_bus_num: i2c control bus id the sensor is attached to | ||||||
|  * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU) |  * @mux_id: FIMC camera interface multiplexer index (separate for MIPI and ITU) | ||||||
|  * @clk_id: index of the SoC peripheral clock for sensors |  * @clk_id: index of the SoC peripheral clock for sensors | ||||||
|  * @flags: the parallel bus flags defining signals polarity (V4L2_MBUS_*) |  | ||||||
|  */ |  */ | ||||||
| struct s5p_fimc_isp_info { | struct fimc_source_info { | ||||||
| 	struct i2c_board_info *board_info; | 	struct i2c_board_info *board_info; | ||||||
| 	unsigned long clk_frequency; | 	unsigned long clk_frequency; | ||||||
| 	enum cam_bus_type bus_type; | 	enum fimc_bus_type fimc_bus_type; | ||||||
|  | 	enum fimc_bus_type sensor_bus_type; | ||||||
|  | 	u16 flags; | ||||||
| 	u16 i2c_bus_num; | 	u16 i2c_bus_num; | ||||||
| 	u16 mux_id; | 	u16 mux_id; | ||||||
| 	u16 flags; |  | ||||||
| 	u8 clk_id; | 	u8 clk_id; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * struct s5p_platform_fimc - camera host interface platform data |  * struct s5p_platform_fimc - camera host interface platform data | ||||||
|  * |  * | ||||||
|  * @isp_info: properties of camera sensor required for host interface setup |  * @source_info: properties of an image source for the host interface setup | ||||||
|  * @num_clients: the number of attached image sensors |  * @num_clients: the number of attached image sources | ||||||
|  */ |  */ | ||||||
| struct s5p_platform_fimc { | struct s5p_platform_fimc { | ||||||
| 	struct s5p_fimc_isp_info *isp_info; | 	struct fimc_source_info *source_info; | ||||||
| 	int num_clients; | 	int num_clients; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sylwester Nawrocki
				Sylwester Nawrocki