Hi William, Thanks for the patch.
On Monday 17 December 2012 18:12:19 William Swanson wrote: > If the remote video sensor reports an interlaced video mode, the CCDC block > should configure itself appropriately. What will the CCDC do in that case ? Will it capture fields or frames to memory ? If frames, what's the field layout ? You will most likely need to modify ispvideo.c as well, to support interlacing in the V4L2 API, and possibly add interlaced formats support to the media bus API. > --- > drivers/media/platform/omap3isp/ispccdc.c | 16 ++++++++++++++-- > include/media/omap3isp.h | 3 +++ > 2 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/platform/omap3isp/ispccdc.c > b/drivers/media/platform/omap3isp/ispccdc.c index 60e60aa..5443ef4 100644 > --- a/drivers/media/platform/omap3isp/ispccdc.c > +++ b/drivers/media/platform/omap3isp/ispccdc.c > @@ -970,10 +970,11 @@ void omap3isp_ccdc_max_rate(struct isp_ccdc_device > *ccdc, * @ccdc: Pointer to ISP CCDC device. > * @pdata: Parallel interface platform data (may be NULL) > * @data_size: Data size > + * @interlaced: Use interlaced mode instead of progressive mode > */ > static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc, > struct isp_parallel_platform_data *pdata, > - unsigned int data_size) > + unsigned int data_size, bool interlaced) > { > struct isp_device *isp = to_isp_device(ccdc); > const struct v4l2_mbus_framefmt *format; > @@ -1004,9 +1005,15 @@ static void ccdc_config_sync_if(struct > isp_ccdc_device *ccdc, break; > } > > + if (interlaced) > + syn_mode |= ISPCCDC_SYN_MODE_FLDMODE; > + > if (pdata && pdata->data_pol) > syn_mode |= ISPCCDC_SYN_MODE_DATAPOL; > > + if (pdata && pdata->fld_pol) > + syn_mode |= ISPCCDC_SYN_MODE_FLDPOL; > + > if (pdata && pdata->hs_pol) > syn_mode |= ISPCCDC_SYN_MODE_HDPOL; > > @@ -1111,6 +1118,7 @@ static void ccdc_configure(struct isp_ccdc_device > *ccdc) const struct v4l2_rect *crop; > const struct isp_format_info *fmt_info; > struct v4l2_subdev_format fmt_src; > + bool src_interlaced = false; > unsigned int depth_out; > unsigned int depth_in = 0; > struct media_pad *pad; > @@ -1132,6 +1140,10 @@ static void ccdc_configure(struct isp_ccdc_device > *ccdc) fmt_src.pad = pad->index; > fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE; > if (!v4l2_subdev_call(sensor, pad, get_fmt, NULL, &fmt_src)) { > + if (fmt_src.format.field == V4L2_FIELD_INTERLACED || > + fmt_src.format.field == V4L2_FIELD_INTERLACED_TB || > + fmt_src.format.field == V4L2_FIELD_INTERLACED_BT) > + src_interlaced = true; > fmt_info = omap3isp_video_format_info(fmt_src.format.code); > depth_in = fmt_info->width; > } > @@ -1150,7 +1162,7 @@ static void ccdc_configure(struct isp_ccdc_device > *ccdc) > > omap3isp_configure_bridge(isp, ccdc->input, pdata, shift, bridge); > > - ccdc_config_sync_if(ccdc, pdata, depth_out); > + ccdc_config_sync_if(ccdc, pdata, depth_out, src_interlaced); > > syn_mode = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE); > > diff --git a/include/media/omap3isp.h b/include/media/omap3isp.h > index 9584269..32d85c2 100644 > --- a/include/media/omap3isp.h > +++ b/include/media/omap3isp.h > @@ -57,6 +57,8 @@ enum { > * ISP_LANE_SHIFT_6 - CAMEXT[13:6] -> CAM[7:0] > * @clk_pol: Pixel clock polarity > * 0 - Sample on rising edge, 1 - Sample on falling edge > + * @fld_pol: Field identification signal polarity > + * 0 - Active high, 1 - Active low > * @hs_pol: Horizontal synchronization polarity > * 0 - Active high, 1 - Active low > * @vs_pol: Vertical synchronization polarity > @@ -67,6 +69,7 @@ enum { > struct isp_parallel_platform_data { > unsigned int data_lane_shift:2; > unsigned int clk_pol:1; > + unsigned int fld_pol:1; > unsigned int hs_pol:1; > unsigned int vs_pol:1; > unsigned int data_pol:1; -- Regards, Laurent Pinchart -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html