This is a patch ontop a whole board support package. Its main purpose is to
add MT9V022 camera support, but also to avoid a full new BSP release.

Note: This patch can only be used on top a clean

   OSELAS.BSP-Phytec-phyCORE-i.MX27-5
   ----------------------------------

This BSP can be found at http://www.pengutronix.de/oselas/bsp/phytec/

Steps to use this patch:

 $ tar xf OSELAS.BSP-Phytec-phyCORE-i.MX27-5.tar.gz
 $ cd OSELAS.BSP-Phytec-phyCORE-i.MX27-5
 $ patch -p0 < this-patch-file

After these steps you can build the whole BSP as the quickstart mentioned.

To use the new camera support at runtime, simply enter:

mplayer -v tv:// -tv driver=v4l2:input=0:width=240:height=320:device=/dev/video0:outfmt=ba81 -vf ba81 -vo fbdev

---

Index: patches/linux-2.6.25-rc6/generic/v4l_soc_camera.diff
===================================================================
--- patches/linux-2.6.25-rc6/generic/v4l_soc_camera.diff	(Revision 5824)
+++ patches/linux-2.6.25-rc6/generic/v4l_soc_camera.diff	(Arbeitskopie)
@@ -21,7 +21,7 @@
  drivers/media/video/cx88/cx88-dvb.c           |    4 
  drivers/media/video/cx88/cx88-video.c         |    8 
  drivers/media/video/mt9m001.c                 |  711 ++++++++++++++++++
- drivers/media/video/mt9v022.c                 |  819 +++++++++++++++++++++
+ drivers/media/video/mt9v022.c                 |  843 +++++++++++++++++++++
  drivers/media/video/pxa_camera.c              |  915 +++++++++++++++++++++++
  drivers/media/video/saa7134/saa7134-alsa.c    |   10 
  drivers/media/video/saa7134/saa7134-dvb.c     |    4 
@@ -34,7 +34,7 @@
  include/asm-arm/arch-pxa/pxa-regs.h           |  147 ++-
  include/media/soc_camera.h                    |  149 +++
  include/media/videobuf-dma-sg.h               |   14 
- 28 files changed, 4028 insertions(+), 143 deletions(-)
+ 28 files changed, 4052 insertions(+), 143 deletions(-)
 
 Index: arch/arm/mach-pxa/devices.c
 ===================================================================
@@ -1207,7 +1207,7 @@
 ===================================================================
 --- /dev/null
 +++ drivers/media/video/mt9v022.c
-@@ -0,0 +1,819 @@
+@@ -0,0 +1,843 @@
 +/*
 + * Driver for MT9V022 CMOS Image Sensor from Micron
 + *
@@ -1232,6 +1232,8 @@
 +#include <asm/gpio.h>
 +#endif
 +
++#define gpio_is_valid(gpio) ((gpio) != -1)
++
 +/* mt9v022 i2c address 0x48, 0x4c, 0x58, 0x5c
 + * The platform has to define i2c_board_info
 + * and call i2c_register_board_info() */
@@ -1498,7 +1500,29 @@
 +	if (ret >= 0)
 +		ret = reg_write(icd, MT9V022_COLUMN_START, rect->left);
 +	if (ret >= 0)
-+		ret = reg_write(icd, MT9V022_ROW_START, rect->top);
++		ret = reg_write(icd, MT9V022_ROW_START, rect->top
++#ifdef CONFIG_MACH_MX27
++				+ 1
++/*
++ * For mx27 we need this to get correct colours. Currently it is not
++ * clear whether the first line of a Bayer Pattern is a r/g or a r/b
++ * line. http://v4l2spec.bytesex.org/spec/r3735.htm suggests that it
++ * is a r/b one whereas http://www.siliconimaging.com/RGB%20Bayer.htm
++ * suggests it is a r/g one.
++ * The mplayer Bayer pattern works with a r/g first line whereas the
++ * mt9v022 has a r/b line as first line. On PXA this first line
++ * is discarded anyway due to a bug in the PXA. On mx27 instead we cannot
++ * discard lines but only capture the whole image from the sensor, so
++ * we need this offset.
++ *
++ * This offset is definitely not the correct fix but only a
++ * short-time-to-market hack.
++ *
++ * Note that with this offset we cannot actually get the full vertical
++ * resolution from the sensor.
++ */
++#endif
++				);
 +	if (ret >= 0)
 +		/* Default 94, Phytec driver says:
 +		 * "width + horizontal blank >= 660" */
Index: patches/linux-2.6.25-rc6/generic/mx2_camera_driver.diff
===================================================================
--- patches/linux-2.6.25-rc6/generic/mx2_camera_driver.diff	(Revision 5824)
+++ patches/linux-2.6.25-rc6/generic/mx2_camera_driver.diff	(Arbeitskopie)
@@ -10,6 +10,13 @@
 Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
 
 ---
+---
+ drivers/media/video/Kconfig       |    7 
+ drivers/media/video/Makefile      |    1 
+ drivers/media/video/mx27_camera.c |  784 ++++++++++++++++++++++++++++++++++++++
+ include/asm-arm/arch-mxc/camera.h |   46 ++
+ 4 files changed, 838 insertions(+)
+
 Index: drivers/media/video/Kconfig
 ===================================================================
 --- drivers/media/video/Kconfig.orig
@@ -42,12 +49,11 @@
 ===================================================================
 --- /dev/null
 +++ drivers/media/video/mx27_camera.c
-@@ -0,0 +1,770 @@
+@@ -0,0 +1,784 @@
 +/*
 + * V4L2 Driver for MX27 camera host
 + *
-+ * Copyright (C) 2006, Sascha Hauer, Pengutronix
-+ * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>
++ * Copyright (C) 2008, Sascha Hauer, Pengutronix
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
@@ -160,11 +166,13 @@
 +#define CSIRXCNT	0x14
 +#define CSICR3		0x1C
 +
++/* Currently we do not need irqs. All we need is DMA callback
++ * Leave it here for reference for some time.
++ */
++#undef MX27_CAMERA_USE_IRQ
++
 +struct mx27_camera_dev {
 +	struct device		*dev;
-+	/* PXA27x is only supposed to handle one camera on its Quick Capture
-+	 * interface. If anyone ever builds hardware to enable more than
-+	 * one camera, they will have to modify this driver too */
 +	struct soc_camera_device *icd;
 +	struct clk		*clk;
 +
@@ -206,13 +214,13 @@
 +	icd->y_current = 0;
 +
 +	ret = icd->ops->set_capture_format(icd, pixfmt, rect,
-+			 IS_DATAWIDTH_8 | /* FIXME: only possibility, but check */
-+			 IS_MASTER |      /* FIXME: only possibility, but check */
-+			 IS_VSYNC_ACTIVE_HIGH |
-+			(pcdev->platform_flags & MX27_CAMERA_HSYNC_HIGH ?
-+			 IS_HSYNC_ACTIVE_HIGH : 0) |
-+			(pcdev->platform_flags & MX27_CAMERA_PCLK_SAMPLE_RISING ?
-+			 IS_PCLK_SAMPLE_RISING : 0));
++		 IS_DATAWIDTH_8 | /* FIXME: only possibility, but check */
++		 IS_MASTER |      /* FIXME: only possibility, but check */
++		 IS_VSYNC_ACTIVE_HIGH |
++		(pcdev->platform_flags & MX27_CAMERA_HSYNC_HIGH ?
++		 IS_HSYNC_ACTIVE_HIGH : 0) |
++		(pcdev->platform_flags & MX27_CAMERA_PCLK_SAMPLE_RISING ?
++		 IS_PCLK_SAMPLE_RISING : 0));
 +	if (ret < 0) {
 +		printk("icd->ops->set_capture_format failed: %d\n", ret);
 +		return ret;
@@ -262,7 +270,7 @@
 +
 +	csicr1 |= CSICR1_MCLKDIV(mclk_get_divisor(pcdev));
 +
-+	csicr1 |= CSICR1_MCLKEN | CSICR1_RXFF_LEVEL(2) | CSICR1_RF_OR_INTEN;
++	csicr1 |= CSICR1_MCLKEN | CSICR1_RXFF_LEVEL(2);
 +
 +	clk_enable(pcdev->clk);
 +	writel(csicr1, pcdev->base + CSICR1);
@@ -321,20 +329,16 @@
 +	pcdev->icd = NULL;
 +}
 +
++#ifdef MX27_CAMERA_USE_IRQ
 +static irqreturn_t mx27_camera_irq(int irq, void *data)
 +{
 +	struct mx27_camera_dev *pcdev = data;
 +	u32 status = readl(pcdev->base + CSISR);
 +	unsigned long flags;
 +
-+	spin_lock_irqsave(&pcdev->lock, flags);
-+
-+	if (status & CSISR_RFF_OR_INT)
-+		writel(CSISR_RFF_OR_INT, pcdev->base + CSISR);
-+
-+	spin_unlock_irqrestore(&pcdev->lock, flags);
 +	return IRQ_HANDLED;
 +}
++#endif
 +
 +static unsigned int vid_limit = 16;	/* Video memory limit, in Mb */
 +
@@ -348,7 +352,8 @@
 +
 +	dev_info(&icd->dev, "count=%d, size=%d\n", *count, *size);
 +
-+	*size = icd->width * icd->height * ((icd->current_fmt->depth + 7) >> 3);
++	*size = icd->width * icd->height *
++		((icd->current_fmt->depth + 7) >> 3);
 +
 +	if (0 == *count)
 +		*count = 32;
@@ -451,7 +456,11 @@
 +	vb->state = VIDEOBUF_ACTIVE;
 +
 +	if (!pcdev->active) {
-+		ret = imx_dma_setup_sg(pcdev->dma, dma->sglist, dma->sglen, vb->size, CSI_BASE_ADDR + 0x10, DMA_MODE_READ);
++		ret = imx_dma_setup_sg(pcdev->dma, dma->sglist,
++				dma->sglen,
++				vb->size,
++				CSI_BASE_ADDR + 0x10,
++				DMA_MODE_READ);
 +		if (ret) {
 +			vb->state = VIDEOBUF_ERROR;
 +			wake_up(&vb->done);
@@ -460,7 +469,7 @@
 +		pcdev->active = buf;
 +		writel(CSISR_SOF_INT, pcdev->base + CSISR);
 +		while(!(readl(pcdev->base + CSISR) & CSISR_SOF_INT));
-+		tmp = readl(pcdev->base + CSICR1) | CSICR1_RF_OR_INTEN | CSICR1_CLR_RXFIFO;
++		tmp = readl(pcdev->base + CSICR1) | CSICR1_CLR_RXFIFO;
 +		writel(tmp, pcdev->base + CSICR1);
 +		imx_dma_enable(pcdev->dma);
 +	}
@@ -495,7 +504,8 @@
 +		dev_info(&icd->dev, "%s (prepared)\n", __FUNCTION__);
 +		break;
 +	default:
-+		dev_info(&icd->dev, "%s (unknown) %d\n", __FUNCTION__, vb->state);
++		dev_info(&icd->dev, "%s (unknown) %d\n", __FUNCTION__,
++				vb->state);
 +		break;
 +	}
 +#endif
@@ -570,10 +580,7 @@
 +	wake_up(&vb->done);
 +
 +	if (list_empty(&pcdev->capture)) {
-+		u32 tmp;
 +		pcdev->active = NULL;
-+		tmp = readl(pcdev->base + CSICR1) & ~CSICR1_RF_OR_INTEN;
-+		writel(tmp, pcdev->base + CSICR1);
 +		return;
 +	}
 +
@@ -584,7 +591,10 @@
 +	vb->state = VIDEOBUF_ACTIVE;
 +	dma = videobuf_to_dma(vb);
 +
-+	ret = imx_dma_setup_sg(pcdev->dma, dma->sglist, dma->sglen, vb->size, CSI_BASE_ADDR + 0x10, DMA_MODE_READ);
++	ret = imx_dma_setup_sg(pcdev->dma, dma->sglist,
++			dma->sglen,
++			vb->size, CSI_BASE_ADDR + 0x10,
++			DMA_MODE_READ);
 +	if (ret) {
 +		vb->state = VIDEOBUF_ERROR;
 +		wake_up(&vb->done);
@@ -677,13 +687,16 @@
 +		err = PTR_ERR(pcdev->clk);
 +		goto exit_kfree;
 +	}
-+	dev_info(&pdev->dev, "Camera clock frequency: %ld\n", clk_get_rate(pcdev->clk));
 +
++	dev_info(&pdev->dev, "Camera clock frequency: %ld\n",
++			clk_get_rate(pcdev->clk));
++
 +	/* Initialize DMA */
 +	err = imx_dma_request_by_prio(&pcdev->dma, "CSI RX DMA",
 +			DMA_PRIO_HIGH);
 +	if (err) {
-+		dev_err(&pdev->dev, "mxc_v4l_read failed to request DMA channel\n");
++		dev_err(&pdev->dev,
++			"mxc_v4l_read failed to request DMA channel\n");
 +		err = -EIO;
 +		goto exit_clk_put;
 +	}
@@ -691,13 +704,17 @@
 +	err = imx_dma_setup_handlers(pcdev->dma, mx27_camera_dma_callback,
 +					mx27_camera_dma_err_callback, pcdev);
 +	if (err != 0) {
-+		dev_err(&pdev->dev, "mxc_v4l_read failed to set DMA callback\n");
++		dev_err(&pdev->dev,
++				"mxc_v4l_read failed to set DMA callback\n");
 +		err = -EIO;
 +		goto exit_dma_free;
 +	}
 +
-+	imx_dma_config_channel(pcdev->dma, IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_FIFO,
-+		IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR, DMA_REQ_CSI_RX, 1);
++	imx_dma_config_channel(pcdev->dma,
++			IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_FIFO,
++			IMX_DMA_MEMSIZE_32 | IMX_DMA_TYPE_LINEAR,
++			DMA_REQ_CSI_RX, 1);
++
 +	imx_dma_config_burstlen(pcdev->dma, 64);
 +
 +	dev_set_drvdata(&pdev->dev, pcdev);
@@ -729,13 +746,14 @@
 +
 +	pcdev->pdata->init(pdev);
 +
-+	/* request irq */
++#ifdef MX27_CAMERA_USE_IRQ
 +	err = request_irq(pcdev->irq, mx27_camera_irq, 0, MX27_CAM_DRV_NAME,
 +			  pcdev);
 +	if (err) {
 +		dev_err(pcdev->dev, "Camera interrupt register failed \n");
 +		goto exit_iounmap;
 +	}
++#endif
 +
 +	mx27_soc_camera_host.priv	= pcdev;
 +	mx27_soc_camera_host.dev.parent	= &pdev->dev;
@@ -747,8 +765,10 @@
 +	return 0;
 +
 +exit_free_irq:
++#ifdef MX27_CAMERA_USE_IRQ
 +	free_irq(pcdev->irq, pcdev);
 +exit_iounmap:
++#endif
 +	iounmap(base);
 +exit_release:
 +	release_mem_region(res->start, res->end - res->start + 1);
@@ -770,8 +790,9 @@
 +	clk_put(pcdev->clk);
 +
 +	imx_dma_free(pcdev->dma);
++#ifdef MX27_CAMERA_USE_IRQ
 +	free_irq(pcdev->irq, pcdev);
-+
++#endif
 +	soc_camera_host_unregister(&mx27_soc_camera_host);
 +
 +	iounmap(pcdev->base);
Index: kernelconfig.target
===================================================================
--- kernelconfig.target	(Revision 5824)
+++ kernelconfig.target	(Arbeitskopie)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.25-rc6-ptx-devel
-# Thu Mar 20 18:49:27 2008
+# Thu Apr 10 16:10:43 2008
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -707,7 +707,8 @@
 CONFIG_SOC_CAMERA=m
 CONFIG_SOC_CAMERA_MT9M001=m
 CONFIG_MT9M001_PCA9536_SWITCH=y
-# CONFIG_SOC_CAMERA_MT9V022 is not set
+CONFIG_SOC_CAMERA_MT9V022=m
+CONFIG_MT9V022_PCA9536_SWITCH=y
 CONFIG_VIDEO_MX27=m
 # CONFIG_RADIO_ADAPTERS is not set
 # CONFIG_DVB_CORE is not set
Index: projectroot/etc/modules
===================================================================
--- projectroot/etc/modules     (Revision 5824)
+++ projectroot/etc/modules     (Arbeitskopie)
@@ -8,4 +8,5 @@
 mx27_camera
 pca953x
 mt9m001
+mt9v022 sensor_type=colour

