linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 6/8] ispccdc: Add support for BT656 interface
@ 2011-09-08 13:36 Deepthy Ravi
  2011-09-08 17:25 ` Laurent Pinchart
  0 siblings, 1 reply; 2+ messages in thread
From: Deepthy Ravi @ 2011-09-08 13:36 UTC (permalink / raw)
  To: linux-arm-kernel

From: Vaibhav Hiremath <hvaibhav@ti.com>

Add support for BT656 interface in omap3isp ccdc driver.
In addition, this corrects some build errors associated
with isp_video_mbus_to_pix(). The function was declared
as static. Made it extern.

Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: Deepthy Ravi <deepthy.ravi@ti.com>
---
 drivers/media/video/omap3isp/ispccdc.c  |  119 +++++++++++++++++++++++++------
 drivers/media/video/omap3isp/ispvideo.c |    2 +-
 drivers/media/video/omap3isp/ispvideo.h |    4 +-
 include/media/omap3isp.h                |    7 ++
 4 files changed, 109 insertions(+), 23 deletions(-)

diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c
index c583384..e462034 100644
--- a/drivers/media/video/omap3isp/ispccdc.c
+++ b/drivers/media/video/omap3isp/ispccdc.c
@@ -1018,6 +1018,9 @@ static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc,
 	if (syncif->vdpol)
 		syn_mode |= ISPCCDC_SYN_MODE_VDPOL;
 
+	if (syncif->bt_r656_en)
+		syn_mode |= ISPCCDC_SYN_MODE_PACK8;
+
 	if (syncif->ccdc_mastermode) {
 		syn_mode |= ISPCCDC_SYN_MODE_FLDOUT | ISPCCDC_SYN_MODE_VDHDOUT;
 		isp_reg_writel(isp,
@@ -1035,9 +1038,12 @@ static void ccdc_config_sync_if(struct isp_ccdc_device *ccdc,
 
 	isp_reg_writel(isp, syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE);
 
-	if (!syncif->bt_r656_en)
+	if (syncif->bt_r656_en)
+		isp_reg_set(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_REC656IF,
+			    ISPCCDC_REC656IF_R656ON | ISPCCDC_REC656IF_ECCFVH);
+	else
 		isp_reg_clr(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_REC656IF,
-			    ISPCCDC_REC656IF_R656ON);
+			    ISPCCDC_REC656IF_R656ON | ISPCCDC_REC656IF_ECCFVH);
 }
 
 /* CCDC formats descriptions */
@@ -1119,6 +1125,7 @@ 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;
+	struct v4l2_pix_format pix;
 	const struct isp_format_info *fmt_info;
 	struct v4l2_subdev_format fmt_src;
 	unsigned int depth_out;
@@ -1150,9 +1157,18 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
 	shift = depth_in - depth_out;
 	omap3isp_configure_bridge(isp, ccdc->input, pdata, shift);
 
-	ccdc->syncif.datsz = depth_out;
-	ccdc->syncif.hdpol = pdata ? pdata->hs_pol : 0;
-	ccdc->syncif.vdpol = pdata ? pdata->vs_pol : 0;
+	if (pdata) {
+		ccdc->syncif.datsz = pdata->width;
+		ccdc->syncif.fldmode = pdata->fldmode;
+		ccdc->syncif.hdpol = pdata->hs_pol;
+		ccdc->syncif.vdpol = pdata->vs_pol;
+		ccdc->syncif.bt_r656_en = pdata->is_bt656;
+	} else {
+		ccdc->syncif.datsz = depth_out;
+		ccdc->syncif.hdpol = 0;
+		ccdc->syncif.vdpol = 0;
+	}
+
 	ccdc_config_sync_if(ccdc, &ccdc->syncif);
 
 	/* CCDC_PAD_SINK */
@@ -1178,8 +1194,14 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
 	/* Use PACK8 mode for 1byte per pixel formats. */
 	if (omap3isp_video_format_info(format->code)->bpp <= 8)
 		syn_mode |= ISPCCDC_SYN_MODE_PACK8;
-	else
-		syn_mode &= ~ISPCCDC_SYN_MODE_PACK8;
+
+	if ((format->code == V4L2_MBUS_FMT_YUYV8_2X8) ||
+		(format->code == V4L2_MBUS_FMT_UYVY8_2X8)) {
+		if (pdata->is_bt656)
+			syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR8;
+		else
+			syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR16;
+	}
 
 	isp_reg_writel(isp, syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE);
 
@@ -1210,22 +1232,42 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
 			(format->code != V4L2_MBUS_FMT_UYVY8_2X8))
 		ccdc_config_imgattr(ccdc, ccdc_pattern);
 
-	/* Generate VD0 on the last line of the image and VD1 on the
-	 * 2/3 height line.
-	 */
-	isp_reg_writel(isp, ((format->height - 2) << ISPCCDC_VDINT_0_SHIFT) |
-		       ((format->height * 2 / 3) << ISPCCDC_VDINT_1_SHIFT),
-		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT);
+	/* BT656: Generate VD0 on the last line of each field, and we
+	* don't use VD1.
+	* Non BT656: Generate VD0 on the last line of the image and VD1 on the
+	* 2/3 height line.
+	*/
+	if (pdata->is_bt656)
+		isp_reg_writel(isp,
+			(format->height/2 - 2) << ISPCCDC_VDINT_0_SHIFT,
+		    OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT);
+	else
+		isp_reg_writel(isp,
+			((format->height - 2) << ISPCCDC_VDINT_0_SHIFT) |
+		      ((format->height * 2 / 3) << ISPCCDC_VDINT_1_SHIFT),
+		     OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT);
 
 	/* CCDC_PAD_SOURCE_OF */
 	format = &ccdc->formats[CCDC_PAD_SOURCE_OF];
 
-	isp_reg_writel(isp, (0 << ISPCCDC_HORZ_INFO_SPH_SHIFT) |
+	isp_video_mbus_to_pix(&ccdc->video_out, format, &pix);
+	/* For BT656 the number of bytes would be width*2 */
+	if (pdata->is_bt656)
+		isp_reg_writel(isp, (0 << ISPCCDC_HORZ_INFO_SPH_SHIFT) |
+			((pix.bytesperline - 1) << ISPCCDC_HORZ_INFO_NPH_SHIFT),
+			OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO);
+	else
+		isp_reg_writel(isp, (0 << ISPCCDC_HORZ_INFO_SPH_SHIFT) |
 		       ((format->width - 1) << ISPCCDC_HORZ_INFO_NPH_SHIFT),
 		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO);
 	isp_reg_writel(isp, 0 << ISPCCDC_VERT_START_SLV0_SHIFT,
 		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_START);
-	isp_reg_writel(isp, (format->height - 1)
+	if (pdata->is_bt656)
+		isp_reg_writel(isp, ((format->height >> 1) - 1)
+				<< ISPCCDC_VERT_LINES_NLV_SHIFT,
+				OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_LINES);
+	else
+		isp_reg_writel(isp, (format->height - 1)
 			<< ISPCCDC_VERT_LINES_NLV_SHIFT,
 		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_LINES);
 
@@ -1238,7 +1280,16 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
 	isp_reg_clr(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST,
 		    ISPCCDC_SDOFST_LOFST_MASK << ISPCCDC_SDOFST_LOFST3_SHIFT);
 
-	ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value, 0, 0);
+	/* In case of BT656 each alternate line must be stored into memory */
+	if (pdata->is_bt656) {
+		ccdc_config_outlineoffset(ccdc, pix.bytesperline, EVENEVEN, 1);
+		ccdc_config_outlineoffset(ccdc, pix.bytesperline, EVENODD, 1);
+		ccdc_config_outlineoffset(ccdc, pix.bytesperline, ODDEVEN, 1);
+		ccdc_config_outlineoffset(ccdc, pix.bytesperline, ODDODD, 1);
+	} else {
+		ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value,
+									 0, 0);
+	}
 
 	/* CCDC_PAD_SOURCE_VP */
 	format = &ccdc->formats[CCDC_PAD_SOURCE_VP];
@@ -1276,6 +1327,11 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
 unlock:
 	spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
 
+	if (pdata->is_bt656)
+		ccdc->update = OMAP3ISP_CCDC_BLCLAMP;
+	else
+		ccdc->update = 0;
+
 	ccdc_apply_controls(ccdc);
 }
 
@@ -1551,10 +1607,29 @@ static void ccdc_vd0_isr(struct isp_ccdc_device *ccdc)
 {
 	unsigned long flags;
 	int restart = 0;
+	struct isp_device *isp = to_isp_device(ccdc);
 
-	if (ccdc->output & CCDC_OUTPUT_MEMORY)
-		restart = ccdc_isr_buffer(ccdc);
-
+	if (ccdc->output & CCDC_OUTPUT_MEMORY) {
+		if (ccdc->syncif.bt_r656_en) {
+			u32 fid;
+			u32 syn_mode = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCDC,
+					ISPCCDC_SYN_MODE);
+			fid = syn_mode & ISPCCDC_SYN_MODE_FLDSTAT;
+			/* toggle the software maintained fid */
+			ccdc->syncif.fldstat ^= 1;
+			if (fid == ccdc->syncif.fldstat) {
+				if (fid == 0) {
+					restart = ccdc_isr_buffer(ccdc);
+					goto done;
+				}
+			} else if (fid == 0) {
+				ccdc->syncif.fldstat = fid;
+			}
+		} else {
+			restart = ccdc_isr_buffer(ccdc);
+		}
+	}
+done:
 	spin_lock_irqsave(&ccdc->lock, flags);
 	if (__ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) {
 		spin_unlock_irqrestore(&ccdc->lock, flags);
@@ -1640,7 +1715,8 @@ int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc, u32 events)
 	if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED)
 		return 0;
 
-	if (events & IRQ0STATUS_CCDC_VD1_IRQ)
+	if (!ccdc->syncif.bt_r656_en &&
+			(events & IRQ0STATUS_CCDC_VD1_IRQ))
 		ccdc_vd1_isr(ccdc);
 
 	ccdc_lsc_isr(ccdc, events);
@@ -1648,7 +1724,8 @@ int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc, u32 events)
 	if (events & IRQ0STATUS_CCDC_VD0_IRQ)
 		ccdc_vd0_isr(ccdc);
 
-	if (events & IRQ0STATUS_HS_VS_IRQ)
+	if (!ccdc->syncif.bt_r656_en &&
+			(events & IRQ0STATUS_HS_VS_IRQ))
 		ccdc_hs_vs_isr(ccdc);
 
 	return 0;
diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c
index d595d01..445143b 100644
--- a/drivers/media/video/omap3isp/ispvideo.c
+++ b/drivers/media/video/omap3isp/ispvideo.c
@@ -165,7 +165,7 @@ static bool isp_video_is_shiftable(enum v4l2_mbus_pixelcode in,
  *
  * Return the number of padding bytes at end of line.
  */
-static unsigned int isp_video_mbus_to_pix(const struct isp_video *video,
+unsigned int isp_video_mbus_to_pix(const struct isp_video *video,
 					  const struct v4l2_mbus_framefmt *mbus,
 					  struct v4l2_pix_format *pix)
 {
diff --git a/drivers/media/video/omap3isp/ispvideo.h b/drivers/media/video/omap3isp/ispvideo.h
index bb8feb6..01d8728 100644
--- a/drivers/media/video/omap3isp/ispvideo.h
+++ b/drivers/media/video/omap3isp/ispvideo.h
@@ -198,7 +198,9 @@ struct isp_buffer *omap3isp_video_buffer_next(struct isp_video *video,
 					      unsigned int error);
 void omap3isp_video_resume(struct isp_video *video, int continuous);
 struct media_pad *omap3isp_video_remote_pad(struct isp_video *video);
-
+extern unsigned int isp_video_mbus_to_pix(const struct isp_video *video,
+				  const struct v4l2_mbus_framefmt *mbus,
+				  struct v4l2_pix_format *pix);
 const struct isp_format_info *
 omap3isp_video_format_info(enum v4l2_mbus_pixelcode code);
 
diff --git a/include/media/omap3isp.h b/include/media/omap3isp.h
index e917b1d..f8d08e4 100644
--- a/include/media/omap3isp.h
+++ b/include/media/omap3isp.h
@@ -63,17 +63,24 @@ enum {
  *		0 - Active high, 1 - Active low
  * @vs_pol: Vertical synchronization polarity
  *		0 - Active high, 1 - Active low
+ * @fldmode: Field mode
+ *             0 - progressive, 1 - Interlaced
  * @bridge: CCDC Bridge input control
  *		ISP_BRIDGE_DISABLE - Disable
  *		ISP_BRIDGE_LITTLE_ENDIAN - Little endian
  *		ISP_BRIDGE_BIG_ENDIAN - Big endian
+ * @is_bt656: Is BT656
+ *             0 - non BT656, 1 - BT656
  */
 struct isp_parallel_platform_data {
+	unsigned int width;
 	unsigned int data_lane_shift:2;
 	unsigned int clk_pol:1;
 	unsigned int hs_pol:1;
 	unsigned int vs_pol:1;
+	unsigned int fldmode:1;
 	unsigned int bridge:2;
+	unsigned int is_bt656:1;
 };
 
 enum {
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH 6/8] ispccdc: Add support for BT656 interface
  2011-09-08 13:36 [PATCH 6/8] ispccdc: Add support for BT656 interface Deepthy Ravi
@ 2011-09-08 17:25 ` Laurent Pinchart
  0 siblings, 0 replies; 2+ messages in thread
From: Laurent Pinchart @ 2011-09-08 17:25 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

Thanks for the patch.

On Thursday 08 September 2011 15:36:29 Deepthy Ravi wrote:
> From: Vaibhav Hiremath <hvaibhav@ti.com>
> 
> Add support for BT656 interface in omap3isp ccdc driver.
> In addition, this corrects some build errors associated
> with isp_video_mbus_to_pix(). The function was declared
> as static. Made it extern.

I've already posted patches to the linux-media mailing list for this. Could 
you please rebase this patch on top of them ?

> 
> Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
> Signed-off-by: Deepthy Ravi <deepthy.ravi@ti.com>
> ---
>  drivers/media/video/omap3isp/ispccdc.c  |  119
> +++++++++++++++++++++++++------ drivers/media/video/omap3isp/ispvideo.c | 
>   2 +-
>  drivers/media/video/omap3isp/ispvideo.h |    4 +-
>  include/media/omap3isp.h                |    7 ++
>  4 files changed, 109 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/media/video/omap3isp/ispccdc.c
> b/drivers/media/video/omap3isp/ispccdc.c index c583384..e462034 100644
> --- a/drivers/media/video/omap3isp/ispccdc.c
> +++ b/drivers/media/video/omap3isp/ispccdc.c
> @@ -1018,6 +1018,9 @@ static void ccdc_config_sync_if(struct
> isp_ccdc_device *ccdc, if (syncif->vdpol)
>  		syn_mode |= ISPCCDC_SYN_MODE_VDPOL;
> 
> +	if (syncif->bt_r656_en)
> +		syn_mode |= ISPCCDC_SYN_MODE_PACK8;
> +
>  	if (syncif->ccdc_mastermode) {
>  		syn_mode |= ISPCCDC_SYN_MODE_FLDOUT | ISPCCDC_SYN_MODE_VDHDOUT;
>  		isp_reg_writel(isp,
> @@ -1035,9 +1038,12 @@ static void ccdc_config_sync_if(struct
> isp_ccdc_device *ccdc,
> 
>  	isp_reg_writel(isp, syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE);
> 
> -	if (!syncif->bt_r656_en)
> +	if (syncif->bt_r656_en)
> +		isp_reg_set(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_REC656IF,
> +			    ISPCCDC_REC656IF_R656ON | ISPCCDC_REC656IF_ECCFVH);
> +	else
>  		isp_reg_clr(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_REC656IF,
> -			    ISPCCDC_REC656IF_R656ON);
> +			    ISPCCDC_REC656IF_R656ON | ISPCCDC_REC656IF_ECCFVH);
>  }
> 
>  /* CCDC formats descriptions */
> @@ -1119,6 +1125,7 @@ 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;
> +	struct v4l2_pix_format pix;
>  	const struct isp_format_info *fmt_info;
>  	struct v4l2_subdev_format fmt_src;
>  	unsigned int depth_out;
> @@ -1150,9 +1157,18 @@ static void ccdc_configure(struct isp_ccdc_device
> *ccdc) shift = depth_in - depth_out;
>  	omap3isp_configure_bridge(isp, ccdc->input, pdata, shift);
> 
> -	ccdc->syncif.datsz = depth_out;
> -	ccdc->syncif.hdpol = pdata ? pdata->hs_pol : 0;
> -	ccdc->syncif.vdpol = pdata ? pdata->vs_pol : 0;
> +	if (pdata) {
> +		ccdc->syncif.datsz = pdata->width;
> +		ccdc->syncif.fldmode = pdata->fldmode;
> +		ccdc->syncif.hdpol = pdata->hs_pol;
> +		ccdc->syncif.vdpol = pdata->vs_pol;
> +		ccdc->syncif.bt_r656_en = pdata->is_bt656;
> +	} else {
> +		ccdc->syncif.datsz = depth_out;
> +		ccdc->syncif.hdpol = 0;
> +		ccdc->syncif.vdpol = 0;
> +	}
> +
>  	ccdc_config_sync_if(ccdc, &ccdc->syncif);
> 
>  	/* CCDC_PAD_SINK */
> @@ -1178,8 +1194,14 @@ static void ccdc_configure(struct isp_ccdc_device
> *ccdc) /* Use PACK8 mode for 1byte per pixel formats. */
>  	if (omap3isp_video_format_info(format->code)->bpp <= 8)
>  		syn_mode |= ISPCCDC_SYN_MODE_PACK8;
> -	else
> -		syn_mode &= ~ISPCCDC_SYN_MODE_PACK8;
> +
> +	if ((format->code == V4L2_MBUS_FMT_YUYV8_2X8) ||
> +		(format->code == V4L2_MBUS_FMT_UYVY8_2X8)) {
> +		if (pdata->is_bt656)
> +			syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR8;
> +		else
> +			syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR16;
> +	}
> 
>  	isp_reg_writel(isp, syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE);
> 
> @@ -1210,22 +1232,42 @@ static void ccdc_configure(struct isp_ccdc_device
> *ccdc) (format->code != V4L2_MBUS_FMT_UYVY8_2X8))
>  		ccdc_config_imgattr(ccdc, ccdc_pattern);
> 
> -	/* Generate VD0 on the last line of the image and VD1 on the
> -	 * 2/3 height line.
> -	 */
> -	isp_reg_writel(isp, ((format->height - 2) << ISPCCDC_VDINT_0_SHIFT) |
> -		       ((format->height * 2 / 3) << ISPCCDC_VDINT_1_SHIFT),
> -		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT);
> +	/* BT656: Generate VD0 on the last line of each field, and we
> +	* don't use VD1.
> +	* Non BT656: Generate VD0 on the last line of the image and VD1 on the
> +	* 2/3 height line.
> +	*/
> +	if (pdata->is_bt656)
> +		isp_reg_writel(isp,
> +			(format->height/2 - 2) << ISPCCDC_VDINT_0_SHIFT,
> +		    OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT);
> +	else
> +		isp_reg_writel(isp,
> +			((format->height - 2) << ISPCCDC_VDINT_0_SHIFT) |
> +		      ((format->height * 2 / 3) << ISPCCDC_VDINT_1_SHIFT),
> +		     OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VDINT);
> 
>  	/* CCDC_PAD_SOURCE_OF */
>  	format = &ccdc->formats[CCDC_PAD_SOURCE_OF];
> 
> -	isp_reg_writel(isp, (0 << ISPCCDC_HORZ_INFO_SPH_SHIFT) |
> +	isp_video_mbus_to_pix(&ccdc->video_out, format, &pix);
> +	/* For BT656 the number of bytes would be width*2 */
> +	if (pdata->is_bt656)
> +		isp_reg_writel(isp, (0 << ISPCCDC_HORZ_INFO_SPH_SHIFT) |
> +			((pix.bytesperline - 1) << ISPCCDC_HORZ_INFO_NPH_SHIFT),
> +			OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO);
> +	else
> +		isp_reg_writel(isp, (0 << ISPCCDC_HORZ_INFO_SPH_SHIFT) |
>  		       ((format->width - 1) << ISPCCDC_HORZ_INFO_NPH_SHIFT),
>  		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_HORZ_INFO);
>  	isp_reg_writel(isp, 0 << ISPCCDC_VERT_START_SLV0_SHIFT,
>  		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_START);
> -	isp_reg_writel(isp, (format->height - 1)
> +	if (pdata->is_bt656)
> +		isp_reg_writel(isp, ((format->height >> 1) - 1)
> +				<< ISPCCDC_VERT_LINES_NLV_SHIFT,
> +				OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_LINES);
> +	else
> +		isp_reg_writel(isp, (format->height - 1)
>  			<< ISPCCDC_VERT_LINES_NLV_SHIFT,
>  		       OMAP3_ISP_IOMEM_CCDC, ISPCCDC_VERT_LINES);
> 
> @@ -1238,7 +1280,16 @@ static void ccdc_configure(struct isp_ccdc_device
> *ccdc) isp_reg_clr(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SDOFST,
>  		    ISPCCDC_SDOFST_LOFST_MASK << ISPCCDC_SDOFST_LOFST3_SHIFT);
> 
> -	ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value, 0, 0);
> +	/* In case of BT656 each alternate line must be stored into memory */
> +	if (pdata->is_bt656) {
> +		ccdc_config_outlineoffset(ccdc, pix.bytesperline, EVENEVEN, 1);
> +		ccdc_config_outlineoffset(ccdc, pix.bytesperline, EVENODD, 1);
> +		ccdc_config_outlineoffset(ccdc, pix.bytesperline, ODDEVEN, 1);
> +		ccdc_config_outlineoffset(ccdc, pix.bytesperline, ODDODD, 1);
> +	} else {
> +		ccdc_config_outlineoffset(ccdc, ccdc->video_out.bpl_value,
> +									 0, 0);
> +	}
> 
>  	/* CCDC_PAD_SOURCE_VP */
>  	format = &ccdc->formats[CCDC_PAD_SOURCE_VP];
> @@ -1276,6 +1327,11 @@ static void ccdc_configure(struct isp_ccdc_device
> *ccdc) unlock:
>  	spin_unlock_irqrestore(&ccdc->lsc.req_lock, flags);
> 
> +	if (pdata->is_bt656)
> +		ccdc->update = OMAP3ISP_CCDC_BLCLAMP;
> +	else
> +		ccdc->update = 0;
> +
>  	ccdc_apply_controls(ccdc);
>  }
> 
> @@ -1551,10 +1607,29 @@ static void ccdc_vd0_isr(struct isp_ccdc_device
> *ccdc) {
>  	unsigned long flags;
>  	int restart = 0;
> +	struct isp_device *isp = to_isp_device(ccdc);
> 
> -	if (ccdc->output & CCDC_OUTPUT_MEMORY)
> -		restart = ccdc_isr_buffer(ccdc);
> -
> +	if (ccdc->output & CCDC_OUTPUT_MEMORY) {
> +		if (ccdc->syncif.bt_r656_en) {
> +			u32 fid;
> +			u32 syn_mode = isp_reg_readl(isp, OMAP3_ISP_IOMEM_CCDC,
> +					ISPCCDC_SYN_MODE);
> +			fid = syn_mode & ISPCCDC_SYN_MODE_FLDSTAT;
> +			/* toggle the software maintained fid */
> +			ccdc->syncif.fldstat ^= 1;
> +			if (fid == ccdc->syncif.fldstat) {
> +				if (fid == 0) {
> +					restart = ccdc_isr_buffer(ccdc);
> +					goto done;
> +				}
> +			} else if (fid == 0) {
> +				ccdc->syncif.fldstat = fid;
> +			}
> +		} else {
> +			restart = ccdc_isr_buffer(ccdc);
> +		}
> +	}
> +done:
>  	spin_lock_irqsave(&ccdc->lock, flags);
>  	if (__ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) {
>  		spin_unlock_irqrestore(&ccdc->lock, flags);
> @@ -1640,7 +1715,8 @@ int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc,
> u32 events) if (ccdc->state == ISP_PIPELINE_STREAM_STOPPED)
>  		return 0;
> 
> -	if (events & IRQ0STATUS_CCDC_VD1_IRQ)
> +	if (!ccdc->syncif.bt_r656_en &&
> +			(events & IRQ0STATUS_CCDC_VD1_IRQ))
>  		ccdc_vd1_isr(ccdc);
> 
>  	ccdc_lsc_isr(ccdc, events);
> @@ -1648,7 +1724,8 @@ int omap3isp_ccdc_isr(struct isp_ccdc_device *ccdc,
> u32 events) if (events & IRQ0STATUS_CCDC_VD0_IRQ)
>  		ccdc_vd0_isr(ccdc);
> 
> -	if (events & IRQ0STATUS_HS_VS_IRQ)
> +	if (!ccdc->syncif.bt_r656_en &&
> +			(events & IRQ0STATUS_HS_VS_IRQ))
>  		ccdc_hs_vs_isr(ccdc);
> 
>  	return 0;
> diff --git a/drivers/media/video/omap3isp/ispvideo.c
> b/drivers/media/video/omap3isp/ispvideo.c index d595d01..445143b 100644
> --- a/drivers/media/video/omap3isp/ispvideo.c
> +++ b/drivers/media/video/omap3isp/ispvideo.c
> @@ -165,7 +165,7 @@ static bool isp_video_is_shiftable(enum
> v4l2_mbus_pixelcode in, *
>   * Return the number of padding bytes at end of line.
>   */
> -static unsigned int isp_video_mbus_to_pix(const struct isp_video *video,
> +unsigned int isp_video_mbus_to_pix(const struct isp_video *video,
>  					  const struct v4l2_mbus_framefmt *mbus,
>  					  struct v4l2_pix_format *pix)
>  {
> diff --git a/drivers/media/video/omap3isp/ispvideo.h
> b/drivers/media/video/omap3isp/ispvideo.h index bb8feb6..01d8728 100644
> --- a/drivers/media/video/omap3isp/ispvideo.h
> +++ b/drivers/media/video/omap3isp/ispvideo.h
> @@ -198,7 +198,9 @@ struct isp_buffer *omap3isp_video_buffer_next(struct
> isp_video *video, unsigned int error);
>  void omap3isp_video_resume(struct isp_video *video, int continuous);
>  struct media_pad *omap3isp_video_remote_pad(struct isp_video *video);
> -
> +extern unsigned int isp_video_mbus_to_pix(const struct isp_video *video,
> +				  const struct v4l2_mbus_framefmt *mbus,
> +				  struct v4l2_pix_format *pix);
>  const struct isp_format_info *
>  omap3isp_video_format_info(enum v4l2_mbus_pixelcode code);
> 
> diff --git a/include/media/omap3isp.h b/include/media/omap3isp.h
> index e917b1d..f8d08e4 100644
> --- a/include/media/omap3isp.h
> +++ b/include/media/omap3isp.h
> @@ -63,17 +63,24 @@ enum {
>   *		0 - Active high, 1 - Active low
>   * @vs_pol: Vertical synchronization polarity
>   *		0 - Active high, 1 - Active low
> + * @fldmode: Field mode
> + *             0 - progressive, 1 - Interlaced
>   * @bridge: CCDC Bridge input control
>   *		ISP_BRIDGE_DISABLE - Disable
>   *		ISP_BRIDGE_LITTLE_ENDIAN - Little endian
>   *		ISP_BRIDGE_BIG_ENDIAN - Big endian
> + * @is_bt656: Is BT656
> + *             0 - non BT656, 1 - BT656
>   */
>  struct isp_parallel_platform_data {
> +	unsigned int width;
>  	unsigned int data_lane_shift:2;
>  	unsigned int clk_pol:1;
>  	unsigned int hs_pol:1;
>  	unsigned int vs_pol:1;
> +	unsigned int fldmode:1;
>  	unsigned int bridge:2;
> +	unsigned int is_bt656:1;
>  };
> 
>  enum {

-- 
Regards,

Laurent Pinchart

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-09-08 17:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-08 13:36 [PATCH 6/8] ispccdc: Add support for BT656 interface Deepthy Ravi
2011-09-08 17:25 ` Laurent Pinchart

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).