diff options
Diffstat (limited to 'drivers/media/video/omap3isp/ispccdc.c')
| -rw-r--r-- | drivers/media/video/omap3isp/ispccdc.c | 37 | 
1 files changed, 30 insertions, 7 deletions
diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c index 5ff9d14ce71..39d501bda63 100644 --- a/drivers/media/video/omap3isp/ispccdc.c +++ b/drivers/media/video/omap3isp/ispccdc.c @@ -43,6 +43,12 @@ __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh,  static const unsigned int ccdc_fmts[] = {  	V4L2_MBUS_FMT_Y8_1X8, +	V4L2_MBUS_FMT_Y10_1X10, +	V4L2_MBUS_FMT_Y12_1X12, +	V4L2_MBUS_FMT_SGRBG8_1X8, +	V4L2_MBUS_FMT_SRGGB8_1X8, +	V4L2_MBUS_FMT_SBGGR8_1X8, +	V4L2_MBUS_FMT_SGBRG8_1X8,  	V4L2_MBUS_FMT_SGRBG10_1X10,  	V4L2_MBUS_FMT_SRGGB10_1X10,  	V4L2_MBUS_FMT_SBGGR10_1X10, @@ -1110,21 +1116,38 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)  	struct isp_parallel_platform_data *pdata = NULL;  	struct v4l2_subdev *sensor;  	struct v4l2_mbus_framefmt *format; +	const struct isp_format_info *fmt_info; +	struct v4l2_subdev_format fmt_src; +	unsigned int depth_out; +	unsigned int depth_in = 0;  	struct media_pad *pad;  	unsigned long flags; +	unsigned int shift;  	u32 syn_mode;  	u32 ccdc_pattern; -	if (ccdc->input == CCDC_INPUT_PARALLEL) { -		pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]); -		sensor = media_entity_to_v4l2_subdev(pad->entity); +	pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]); +	sensor = media_entity_to_v4l2_subdev(pad->entity); +	if (ccdc->input == CCDC_INPUT_PARALLEL)  		pdata = &((struct isp_v4l2_subdevs_group *)sensor->host_priv)  			->bus.parallel; + +	/* Compute shift value for lane shifter to configure the bridge. */ +	fmt_src.pad = pad->index; +	fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE; +	if (!v4l2_subdev_call(sensor, pad, get_fmt, NULL, &fmt_src)) { +		fmt_info = omap3isp_video_format_info(fmt_src.format.code); +		depth_in = fmt_info->bpp;  	} -	omap3isp_configure_bridge(isp, ccdc->input, pdata); +	fmt_info = omap3isp_video_format_info +		(isp->isp_ccdc.formats[CCDC_PAD_SINK].code); +	depth_out = fmt_info->bpp; + +	shift = depth_in - depth_out; +	omap3isp_configure_bridge(isp, ccdc->input, pdata, shift); -	ccdc->syncif.datsz = pdata ? pdata->width : 10; +	ccdc->syncif.datsz = depth_out;  	ccdc_config_sync_if(ccdc, &ccdc->syncif);  	/* CCDC_PAD_SINK */ @@ -1338,7 +1361,7 @@ static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc,   * @ccdc: Pointer to ISP CCDC device.   * @event: Pointing which event trigger handler   * - * Return 1 when the event and stopping request combination is satisfyied, + * Return 1 when the event and stopping request combination is satisfied,   * zero otherwise.   */  static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) @@ -1618,7 +1641,7 @@ static int ccdc_video_queue(struct isp_video *video, struct isp_buffer *buffer)  	ccdc_set_outaddr(ccdc, buffer->isp_addr); -	/* We now have a buffer queued on the output, restart the pipeline in +	/* We now have a buffer queued on the output, restart the pipeline  	 * on the next CCDC interrupt if running in continuous mode (or when  	 * starting the stream).  	 */  |