public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] video: sh_mobile_ceu cleanups and comments V2
@ 2008-12-16 10:31 Magnus Damm
  2008-12-17 12:31 ` Guennadi Liakhovetski
  0 siblings, 1 reply; 3+ messages in thread
From: Magnus Damm @ 2008-12-16 10:31 UTC (permalink / raw)
  To: video4linux-list; +Cc: g.liakhovetski

From: Magnus Damm <damm@igel.co.jp>

This patch cleans up the sh_mobile_ceu driver and adds comments and
constants to clarify the magic sequence in sh_mobile_ceu_capture().

Signed-off-by: Magnus Damm <damm@igel.co.jp>
---

 Applies on top of the NV16 patch.

 Changes since V1:
 - use unsigned longs for ceu_read() and ceu_write() reg_offs.

 drivers/media/video/sh_mobile_ceu_camera.c |   39 ++++++++++++++++------------
 1 file changed, 23 insertions(+), 16 deletions(-)

--- 0029/drivers/media/video/sh_mobile_ceu_camera.c
+++ work/drivers/media/video/sh_mobile_ceu_camera.c	2008-12-16 18:55:22.000000000 +0900
@@ -104,13 +104,12 @@ struct sh_mobile_ceu_dev {
 };
 
 static void ceu_write(struct sh_mobile_ceu_dev *priv,
-		      unsigned long reg_offs, unsigned long data)
+		      unsigned long reg_offs, u32 data)
 {
 	iowrite32(data, priv->base + reg_offs);
 }
 
-static unsigned long ceu_read(struct sh_mobile_ceu_dev *priv,
-			      unsigned long reg_offs)
+static u32 ceu_read(struct sh_mobile_ceu_dev *priv, unsigned long reg_offs)
 {
 	return ioread32(priv->base + reg_offs);
 }
@@ -158,18 +157,26 @@ static void free_buffer(struct videobuf_
 	buf->vb.state = VIDEOBUF_NEEDS_INIT;
 }
 
+#define CEU_CETCR_MAGIC 0x0317f313 /* acknowledge magical interrupt sources */
+#define CEU_CETCR_IGRW (1 << 4) /* prohibited register access interrupt bit */
+#define CEU_CEIER_CPEIE (1 << 0) /* one-frame capture end interrupt */
+#define CEU_CAPCR_CTNCP (1 << 16) /* continuous capture mode (if set) */
+
+
 static void sh_mobile_ceu_capture(struct sh_mobile_ceu_dev *pcdev)
 {
 	struct soc_camera_device *icd = pcdev->icd;
-	unsigned long phys_addr;
-
-	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) & ~1);
-	ceu_write(pcdev, CETCR, ~ceu_read(pcdev, CETCR) & 0x0317f313);
-	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) | 1);
+	dma_addr_t phys_addr;
 
-	ceu_write(pcdev, CAPCR, ceu_read(pcdev, CAPCR) & ~0x10000);
-
-	ceu_write(pcdev, CETCR, 0x0317f313 ^ 0x10);
+	/* The hardware is _very_ picky about this sequence. Especially
+	 * the CEU_CETCR_MAGIC value. It seems like we need to acknowledge
+	 * several not-so-well documented interrupt sources in CETCR.
+	 */
+	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) & ~CEU_CEIER_CPEIE);
+	ceu_write(pcdev, CETCR, ~ceu_read(pcdev, CETCR) & CEU_CETCR_MAGIC);
+	ceu_write(pcdev, CEIER, ceu_read(pcdev, CEIER) | CEU_CEIER_CPEIE);
+	ceu_write(pcdev, CAPCR, ceu_read(pcdev, CAPCR) & ~CEU_CAPCR_CTNCP);
+	ceu_write(pcdev, CETCR, CEU_CETCR_MAGIC ^ CEU_CETCR_IGRW);
 
 	if (!pcdev->active)
 		return;
@@ -182,7 +189,7 @@ static void sh_mobile_ceu_capture(struct
 	case V4L2_PIX_FMT_NV21:
 	case V4L2_PIX_FMT_NV16:
 	case V4L2_PIX_FMT_NV61:
-		phys_addr += (icd->width * icd->height);
+		phys_addr += icd->width * icd->height;
 		ceu_write(pcdev, CDACR, phys_addr);
 	}
 
@@ -452,13 +459,13 @@ static int sh_mobile_ceu_set_bus_param(s
 
 	if (yuv_mode) {
 		width = icd->width * 2;
-		width = (buswidth == 16) ? width / 2 : width;
+		width = buswidth == 16 ? width / 2 : width;
 		cfszr_width = cdwdr_width = icd->width;
 	} else {
 		width = icd->width * ((icd->current_fmt->depth + 7) >> 3);
-		width = (buswidth == 16) ? width / 2 : width;
-		cfszr_width = (buswidth == 8) ? width / 2 : width;
-		cdwdr_width = (buswidth == 16) ? width * 2 : width;
+		width = buswidth == 16 ? width / 2 : width;
+		cfszr_width = buswidth == 8 ? width / 2 : width;
+		cdwdr_width = buswidth == 16 ? width * 2 : width;
 	}
 
 	ceu_write(pcdev, CAMOR, 0);

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

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

* Re: [PATCH] video: sh_mobile_ceu cleanups and comments V2
  2008-12-16 10:31 [PATCH] video: sh_mobile_ceu cleanups and comments V2 Magnus Damm
@ 2008-12-17 12:31 ` Guennadi Liakhovetski
  2008-12-17 12:32   ` Guennadi Liakhovetski
  0 siblings, 1 reply; 3+ messages in thread
From: Guennadi Liakhovetski @ 2008-12-17 12:31 UTC (permalink / raw)
  To: Magnus Damm; +Cc: video4linux-list

On Tue, 16 Dec 2008, Magnus Damm wrote:

> From: Magnus Damm <damm@igel.co.jp>

Magnus, sorry, looks like you missed a couple more:

> @@ -452,13 +459,13 @@ static int sh_mobile_ceu_set_bus_param(s

	if ((icd->current_fmt->fourcc == V4L2_PIX_FMT_NV21) ||
	    (icd->current_fmt->fourcc == V4L2_PIX_FMT_NV61))
		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */

	value |= (common_flags & SOCAM_VSYNC_ACTIVE_LOW) ? (1 << 1) : 0;
	value |= (common_flags & SOCAM_HSYNC_ACTIVE_LOW) ? (1 << 0) : 0;
	value |= (buswidth == 16) ? (1 << 12) : 0;

Let's make it complete, ok?

>  
>  	if (yuv_mode) {
>  		width = icd->width * 2;
> -		width = (buswidth == 16) ? width / 2 : width;
> +		width = buswidth == 16 ? width / 2 : width;
>  		cfszr_width = cdwdr_width = icd->width;
>  	} else {
>  		width = icd->width * ((icd->current_fmt->depth + 7) >> 3);
> -		width = (buswidth == 16) ? width / 2 : width;
> -		cfszr_width = (buswidth == 8) ? width / 2 : width;
> -		cdwdr_width = (buswidth == 16) ? width * 2 : width;
> +		width = buswidth == 16 ? width / 2 : width;
> +		cfszr_width = buswidth == 8 ? width / 2 : width;
> +		cdwdr_width = buswidth == 16 ? width * 2 : width;
>  	}
>  
>  	ceu_write(pcdev, CAMOR, 0);
> 

Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

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

* Re: [PATCH] video: sh_mobile_ceu cleanups and comments V2
  2008-12-17 12:31 ` Guennadi Liakhovetski
@ 2008-12-17 12:32   ` Guennadi Liakhovetski
  0 siblings, 0 replies; 3+ messages in thread
From: Guennadi Liakhovetski @ 2008-12-17 12:32 UTC (permalink / raw)
  To: Magnus Damm; +Cc: video4linux-list

On Wed, 17 Dec 2008, Guennadi Liakhovetski wrote:

> On Tue, 16 Dec 2008, Magnus Damm wrote:
> 
> > From: Magnus Damm <damm@igel.co.jp>
> 
> Magnus, sorry, looks like you missed a couple more:

Ok, forget it, if you don't mind, I'll just do it myself.

Thanks
Guennadi

> 
> > @@ -452,13 +459,13 @@ static int sh_mobile_ceu_set_bus_param(s
> 
> 	if ((icd->current_fmt->fourcc == V4L2_PIX_FMT_NV21) ||
> 	    (icd->current_fmt->fourcc == V4L2_PIX_FMT_NV61))
> 		value ^= 0x00000100; /* swap U, V to change from NV1x->NVx1 */
> 
> 	value |= (common_flags & SOCAM_VSYNC_ACTIVE_LOW) ? (1 << 1) : 0;
> 	value |= (common_flags & SOCAM_HSYNC_ACTIVE_LOW) ? (1 << 0) : 0;
> 	value |= (buswidth == 16) ? (1 << 12) : 0;
> 
> Let's make it complete, ok?
> 
> >  
> >  	if (yuv_mode) {
> >  		width = icd->width * 2;
> > -		width = (buswidth == 16) ? width / 2 : width;
> > +		width = buswidth == 16 ? width / 2 : width;
> >  		cfszr_width = cdwdr_width = icd->width;
> >  	} else {
> >  		width = icd->width * ((icd->current_fmt->depth + 7) >> 3);
> > -		width = (buswidth == 16) ? width / 2 : width;
> > -		cfszr_width = (buswidth == 8) ? width / 2 : width;
> > -		cdwdr_width = (buswidth == 16) ? width * 2 : width;
> > +		width = buswidth == 16 ? width / 2 : width;
> > +		cfszr_width = buswidth == 8 ? width / 2 : width;
> > +		cdwdr_width = buswidth == 16 ? width * 2 : width;
> >  	}
> >  
> >  	ceu_write(pcdev, CAMOR, 0);
> > 
> 
> Thanks
> Guennadi
> ---
> Guennadi Liakhovetski, Ph.D.
> Freelance Open-Source Software Developer
> 

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer

--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request@redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list

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

end of thread, other threads:[~2008-12-17 12:32 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-16 10:31 [PATCH] video: sh_mobile_ceu cleanups and comments V2 Magnus Damm
2008-12-17 12:31 ` Guennadi Liakhovetski
2008-12-17 12:32   ` Guennadi Liakhovetski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox