public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api
@ 2007-10-09 12:52 Eduardo Valentin
  2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
  2007-10-22  6:31 ` [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Trilok Soni
  0 siblings, 2 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list

Hi all,

This patch set converts omap1 camera to use v4l2-int-device api. It was
tested on H3 with ov9640 sensor, so board-h3.c was modified to add ov9640
specific initializations. The gpio-expander code was modified also to use
the i2c adapter id configured with i2c board specific info. Currently, it is
working only with read method. To work with MMAP, camera_core.c needs more
re-work.

Here is the overall diffstat:
 b/arch/arm/mach-omap1/board-h3.c         |  141 +++++++++
 b/drivers/i2c/chips/gpio_expander_omap.c |    5
 b/drivers/media/video/omap/Kconfig       |    6
 b/drivers/media/video/omap/Makefile      |    4
 b/drivers/media/video/omap/camera_core.c |  394 ++++++++++++++++++---------
 b/drivers/media/video/omap/camera_core.h |   27 -
 b/drivers/media/video/omap/omap16xxcam.c |  442 +++++++++++++++----------------
 drivers/media/video/omap/camera_core.c   |  404 +++++++++++++---------------
 8 files changed, 827 insertions(+), 596 deletions(-)

BR,

Eduardo Valentin

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

* [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard
  2007-10-09 12:52 [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Eduardo Valentin
@ 2007-10-09 12:52 ` Eduardo Valentin
  2007-10-09 12:52   ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
  2007-10-22  6:31 ` [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Trilok Soni
  1 sibling, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

- Executed Lindent on omap16xxcam.c
- Removed extra blank spaces
- Lines with more than 80 columns were broken
- Added KERN_* flags on printk calls

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 drivers/media/video/omap/omap16xxcam.c |  441 ++++++++++++++++----------------
 1 files changed, 215 insertions(+), 226 deletions(-)

diff --git a/drivers/media/video/omap/omap16xxcam.c b/drivers/media/video/omap/omap16xxcam.c
index 34cf1a6..82c006b 100644
--- a/drivers/media/video/omap/omap16xxcam.c
+++ b/drivers/media/video/omap/omap16xxcam.c
@@ -1,23 +1,23 @@
 /*
  * drivers/media/video/omap/omap16xxcam.c
  *
- * Copyright (C) 2004 Texas Instruments, Inc. 
- * 
+ * Copyright (C) 2004 Texas Instruments, Inc.
+ *
  * Video-for-Linux (Version 2) camera capture driver for
  * the OMAP H2 and H3 camera controller.
  *
- * leverage some code from CEE distribution 
+ * leverage some code from CEE distribution
  * Copyright (C) 2003-2004 MontaVista Software, Inc.
- * 
- * This package is free software; you can redistribute it and/or modify 
+ *
+ * This package is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. 
- * 
- * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 
+ * published by the Free Software Foundation.
+ *
+ * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
- 
+
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
 #include <linux/proc_fs.h>
@@ -38,7 +38,6 @@
 #include "omap16xxcam.h"
 #include "camera_hw_if.h"
 #include "camera_core.h"
- 
 
 #define CONF_CAMERAIF_RESET_R 5
 #define EN_PER	  0
@@ -49,13 +48,13 @@
 #define NUM_CAMDMA_CHANNELS 2
 
 typedef struct {
-        unsigned int ctrlclock;     /* 00 */
-        unsigned int it_status;     /* 04 */
-        unsigned int mode;          /* 08 */
-        unsigned int status;        /* 0C */
-        unsigned int camdata;       /* 10 */
-        unsigned int gpio;   	    /* 14 */
-        unsigned int peak_counter;  /* 18 */
+	unsigned int ctrlclock;		/* 00 */
+	unsigned int it_status;		/* 04 */
+	unsigned int mode;		/* 08 */
+	unsigned int status;		/* 0C */
+	unsigned int camdata;		/* 10 */
+	unsigned int gpio;		/* 14 */
+	unsigned int peak_counter;	/* 18 */
 } camera_regs_t;
 
 struct camdma_state {
@@ -68,12 +67,12 @@ struct omap16xxcam {
 	camera_regs_t *camera_regs;
 	unsigned long iobase_phys;
 
-	/* frequncy (in Hz) of camera interface functional clock (ocp_clk) */
+	/* Frequency (in Hz) of camera interface functional clock (ocp_clk) */
 	unsigned long ocp_clk;
 
 	struct clk *func_clk;
 
-	/* dma related stuff */
+	/* DMA related stuff */
 	spinlock_t dma_lock;
 	int free_dmach;
 	int next_dmach;
@@ -86,22 +85,21 @@ struct omap16xxcam {
 	int new;
 };
 static struct omap16xxcam hardware_data;
-   
+
 static int omap16xxcam_set_xclk(int, void *);
 static void omap16xx_cam_dma_link_callback(int, unsigned short, void *);
 
 /* Clears the camera data FIFO by setting RAZ_FIFO bit in MODE configuration
-   register. */
-static void
-omap16xx_cam_clear_fifo(struct omap16xxcam *data)
+ * register.
+ */
+static void omap16xx_cam_clear_fifo(struct omap16xxcam *data)
 {
 	data->camera_regs->mode |= RAZ_FIFO;
 	udelay(10);
 	data->camera_regs->mode &= ~RAZ_FIFO;
 }
-  
-static void
-omap16xx_cam_reset(struct omap16xxcam *data, int yes)
+
+static void omap16xx_cam_reset(struct omap16xxcam *data, int yes)
 {
 	if (machine_is_omap_h3())
 		data->camera_regs->gpio = yes ? 0 : 1;
@@ -109,93 +107,96 @@ omap16xx_cam_reset(struct omap16xxcam *data, int yes)
 		data->camera_regs->gpio = yes ? 1 : 0;
 }
 
-static void 
-omap16xx_cam_init(void)
+static void omap16xx_cam_init(void)
 {
 	/*
 	 * FIXME - Use mux API's instead of directly writing in to MUX registers
 	 */
-	omap_writel(omap_readl(FUNC_MUX_CTRL_4) & ~(0x1ff << 21), FUNC_MUX_CTRL_4);
+	omap_writel(omap_readl(FUNC_MUX_CTRL_4) & ~(0x1ff << 21),
+		    FUNC_MUX_CTRL_4);
 	omap_writel(0, FUNC_MUX_CTRL_5);
-	omap_writel(omap_readl(PULL_DWN_CTRL_0) & ~(0x1FFF << 17), PULL_DWN_CTRL_0);
+	omap_writel(omap_readl(PULL_DWN_CTRL_0) & ~(0x1FFF << 17),
+		    PULL_DWN_CTRL_0);
 	omap_writel(omap_readl(PU_PD_SEL_0) & ~(0x1FFF << 17), PU_PD_SEL_0);
 
 	omap_writel(0xeaef, COMP_MODE_CTRL_0);
-	omap_writel(omap_readl(OMAP1610_RESET_CONTROL) & ~(1 << CONF_CAMERAIF_RESET_R),
-			OMAP1610_RESET_CONTROL);
-	omap_writel(omap_readl(OMAP1610_RESET_CONTROL) | (1 << CONF_CAMERAIF_RESET_R),
-			OMAP1610_RESET_CONTROL);
-    
+	omap_writel(omap_readl(OMAP1610_RESET_CONTROL) &
+		    ~(1 << CONF_CAMERAIF_RESET_R), OMAP1610_RESET_CONTROL);
+	omap_writel(omap_readl(OMAP1610_RESET_CONTROL) |
+		    (1 << CONF_CAMERAIF_RESET_R), OMAP1610_RESET_CONTROL);
+
 	/* Enable peripheral reset */
 	omap_writew(omap_readw(ARM_RSTCT2) | (1 << EN_PER), ARM_RSTCT2);
 
-	/* enable peripheral clock */
+	/* Enable peripheral clock */
 	clk_enable(hardware_data.func_clk);
 }
 
-static void
-omap16xx_cam_waitfor_syncedge(struct omap16xxcam *data, u32 edge_mask)
+static void omap16xx_cam_waitfor_syncedge(struct omap16xxcam *data,
+					  u32 edge_mask)
 {
-	data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT) | edge_mask;
+	data->camera_regs->mode =
+	    (FIFO_TRIGGER_LVL << THRESHOLD_BIT) | edge_mask;
 	do {
 		interruptible_sleep_on(&data->vsync_wait);
 	} while (signal_pending(current));
 }
 
-static void
-omap16xx_cam_configure_dma(struct omap16xxcam *data)
+static void omap16xx_cam_configure_dma(struct omap16xxcam *data)
 {
 
 	data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT)
-			 | EN_DMA | EN_FIFO_FULL;
-	data->camera_regs->ctrlclock |= LCLK_EN; 
+	    | EN_DMA | EN_FIFO_FULL;
+	data->camera_regs->ctrlclock |= LCLK_EN;
 }
 
-/* acquire h/w resources DMA */
-static int
-omap16xx_cam_link_open(struct omap16xxcam *data)
+/* Acquire h/w resources DMA */
+static int omap16xx_cam_link_open(struct omap16xxcam *data)
 {
 	int ret;
 
-	/* Acquire first dma channel */
-	if ((ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX, 
-				"camera dma 1", omap16xx_cam_dma_link_callback,
-				(void *)data, &data->dma_channel_number1))) {
-                return ret;
+	/* Acquire first DMA channel */
+	ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
+			       "camera dma 1",
+			       omap16xx_cam_dma_link_callback,
+			       (void *)data, &data->dma_channel_number1);
+	if (ret)
+		return ret;
+
+	/* Acquire second DMA channel */
+	ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX,
+			       "camera dma 2",
+			       omap16xx_cam_dma_link_callback,
+			       (void *)data, &data->dma_channel_number2);
+	if (ret) {
+		printk(KERN_ERR "No DMA available for camera\n");
+		return ret;
 	}
-	/* Acquire second dma channel */
-	if ((ret = omap_request_dma(OMAP_DMA_CAMERA_IF_RX, 
-				"camera dma 2", omap16xx_cam_dma_link_callback,
-				(void *)data, &data->dma_channel_number2))) {
-                printk ("No DMA available for camera\n");
-                return ret;
-        }
- 	data->next_dmach = data->dma_channel_number1;
+	data->next_dmach = data->dma_channel_number1;
 	OMAP_DMA_CLNK_CTRL_REG(data->dma_channel_number1) =
-		data->dma_channel_number2;
+	    data->dma_channel_number2;
 	OMAP_DMA_CLNK_CTRL_REG(data->dma_channel_number2) =
-		data->dma_channel_number1;
+	    data->dma_channel_number1;
 
 	return 0;
 }
 
-/* free h/w resources, stop i/f */
-static int
-omap16xx_cam_link_close(struct omap16xxcam *data)
+/* Free h/w resources, stop i/f */
+static int omap16xx_cam_link_close(struct omap16xxcam *data)
 {
-	/* free dma channels */
+	/* Free DMA channels */
 	omap_stop_dma(data->dma_channel_number1);
 	omap_stop_dma(data->dma_channel_number2);
 
-	omap_free_dma (data->dma_channel_number1);
-	omap_free_dma (data->dma_channel_number2);
+	omap_free_dma(data->dma_channel_number1);
+	omap_free_dma(data->dma_channel_number2);
 
 	return 0;
 }
 
-/* dma callback routine. */
-static void
-omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data)
+/* DMA callback routine. */
+static void omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status,
+					   void *data)
 {
 	int count;
 	void *arg1, *arg2;
@@ -204,52 +205,51 @@ omap16xx_cam_dma_link_callback(int lch, unsigned short ch_status, void *data)
 	dma_callback_t callback;
 
 	spin_lock(&cam->dma_lock);
-	if (cam->free_dmach == 2)
-	{
-		printk("callback all CHANNELS WERE IDLE \n");
+	if (cam->free_dmach == 2) {
+		printk(KERN_ERR "callback all CHANNELS WERE IDLE \n");
 		spin_unlock(&cam->dma_lock);
 		return;
 	}
 	if (cam->free_dmach == 0) {
 		lch = cam->next_dmach;
 	} else {
-		lch = cam->next_dmach == cam->dma_channel_number1 ? 
-			cam->dma_channel_number2 : cam->dma_channel_number1;
+		lch = cam->next_dmach == cam->dma_channel_number1 ?
+		    cam->dma_channel_number2 : cam->dma_channel_number1;
 	}
 
-	while (cam->free_dmach < 2)
-	{
+	while (cam->free_dmach < 2) {
 		if (OMAP_DMA_CCR_REG(lch) & (1 << 7))
-			break;	
+			break;
 
 		count = (lch == cam->dma_channel_number2) ? 1 : 0;
 
 		callback = cam->camdma[count].callback;
- 		arg1 = cam->camdma[count].arg1;
+		arg1 = cam->camdma[count].arg1;
 		arg2 = cam->camdma[count].arg2;
 		cam->free_dmach++;
 
-		spin_unlock(&cam->dma_lock);		
- 		callback(arg1, arg2);
+		spin_unlock(&cam->dma_lock);
+		callback(arg1, arg2);
 		spin_lock(&cam->dma_lock);
 
-		lch = (lch == cam->dma_channel_number2) ? cam->dma_channel_number1 :
-							cam->dma_channel_number2;
+		lch =
+		    (lch ==
+		     cam->dma_channel_number2) ? cam->
+		    dma_channel_number1 : cam->dma_channel_number2;
 	}
 	spin_unlock(&cam->dma_lock);
-	
+
 }
 
-static irqreturn_t
-omap16xx_cam_isr(int irq, void *client_data)
+static irqreturn_t omap16xx_cam_isr(int irq, void *client_data)
 {
 	struct omap16xxcam *data = (struct omap16xxcam *)client_data;
 	unsigned int itstat = data->camera_regs->it_status;
 
 	/* VSYNC UP interrupt, start filling FIFO and enabling DMA */
-	if (itstat & V_UP) {		
+	if (itstat & V_UP) {
 		data->camera_regs->mode &= ~EN_V_UP;
-	 	omap16xx_cam_clear_fifo(data);	
+		omap16xx_cam_clear_fifo(data);
 		omap16xx_cam_configure_dma(data);
 		omap_start_dma(data->next_dmach);
 		wake_up_interruptible(&data->vsync_wait);
@@ -261,29 +261,29 @@ omap16xx_cam_isr(int irq, void *client_data)
 	}
 
 	if (itstat & H_UP)
-		printk("H_UP\n");
-	
+		printk(KERN_INFO "H_UP\n");
+
 	if (itstat & H_DOWN)
-		printk("H_DOWN\n");
-	
+		printk(KERN_INFO "H_DOWN\n");
+
 	if (itstat & FIFO_FULL) {
-		omap16xx_cam_clear_fifo(data);	
-		printk("FIFO_FULL\n");
+		omap16xx_cam_clear_fifo(data);
+		printk(KERN_INFO "FIFO_FULL\n");
 	}
-	
+
 	if (itstat & DATA_XFER)
-		printk("DATA_TRANS\n");
-	
+		printk(KERN_INFO "DATA_TRANS\n");
+
 	return IRQ_HANDLED;
 }
- 
-/* ------------- below are interface functions ----------------- */
-/* ------------- these functions are named omap16xxcam_<name> -- */
-static int
-omap16xxcam_init_dma(void *priv)
+
+/* ------------- Below are interface functions -----------------
+ * ------------- These functions are named omap16xxcam_<name> --
+ */
+static int omap16xxcam_init_dma(void *priv)
 {
 	int ch;
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 
 	data->free_dmach = 2;
 	for (ch = 0; ch < 2; ++ch) {
@@ -295,12 +295,12 @@ omap16xxcam_init_dma(void *priv)
 	return 0;
 }
 
-/* start the dma of chains */
-static int 
-omap16xxcam_start_dma(struct sgdma_state *sgdma,
-		dma_callback_t callback, void *arg1, void *arg2, void *priv)
+/* Start the DMA of chains */
+static int omap16xxcam_start_dma(struct sgdma_state *sgdma,
+				 dma_callback_t callback, void *arg1,
+				 void *arg2, void *priv)
 {
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 	struct scatterlist *sglist;
 	unsigned long irqflags;
 	int dmach;
@@ -313,37 +313,37 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma,
 	if (!data->free_dmach) {
 		spin_unlock_irqrestore(&data->dma_lock, irqflags);
 		return -EBUSY;
-	} 
+	}
 	dmach = data->next_dmach;
-	count = (dmach == data->dma_channel_number2) ? 1:0;
+	count = (dmach == data->dma_channel_number2) ? 1 : 0;
 	data->camdma[count].callback = callback;
 	data->camdma[count].arg1 = arg1;
 	data->camdma[count].arg2 = arg2;
 
 	if (cpu_is_omap1710())
 		omap_set_dma_src_params(dmach, OMAP_DMA_PORT_OCP_T1,
-			    OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG,
-			    0, 0);
+					OMAP_DMA_AMODE_CONSTANT,
+					CAM_CAMDATA_REG, 0, 0);
 	else
 		omap_set_dma_src_params(dmach, OMAP_DMA_PORT_TIPB,
-			    OMAP_DMA_AMODE_CONSTANT, CAM_CAMDATA_REG,
-			    0, 0);
+					OMAP_DMA_AMODE_CONSTANT,
+					CAM_CAMDATA_REG, 0, 0);
 
 	omap_set_dma_dest_params(dmach, OMAP_DMA_PORT_EMIFF,
-	                     OMAP_DMA_AMODE_POST_INC, sg_dma_address(sglist),
-			     0, 0);
+				 OMAP_DMA_AMODE_POST_INC,
+				 sg_dma_address(sglist), 0, 0);
 
 	omap_set_dma_transfer_params(dmach, OMAP_DMA_DATA_TYPE_S32,
-			FIFO_TRIGGER_LVL, 
-			sg_dma_len(sglist)/(4 * FIFO_TRIGGER_LVL), 
- 			OMAP_DMA_SYNC_FRAME,
-			0, 0);
+				     FIFO_TRIGGER_LVL,
+				     sg_dma_len(sglist) / (4 *
+							   FIFO_TRIGGER_LVL),
+				     OMAP_DMA_SYNC_FRAME, 0, 0);
+
+	OMAP_DMA_CLNK_CTRL_REG(dmach) &= ~(1 << 15);
 
-	OMAP_DMA_CLNK_CTRL_REG(dmach) &= ~( 1<< 15);
+	prev_dmach = (dmach == data->dma_channel_number2) ?
+	    data->dma_channel_number1 : data->dma_channel_number2;
 
-	prev_dmach = (dmach == data->dma_channel_number2) ? 
-		data->dma_channel_number1 : data->dma_channel_number2;
-	
 	if (data->new) {
 		data->new = 0;
 		omap16xx_cam_waitfor_syncedge(data, EN_V_UP);
@@ -351,20 +351,20 @@ omap16xxcam_start_dma(struct sgdma_state *sgdma,
 		if (OMAP_DMA_CCR_REG(prev_dmach) & (1 << 7))
 			OMAP_DMA_CLNK_CTRL_REG(prev_dmach) |= (1 << 15);
 		else {
-			/* no transfer is in progress */
-  			omap_start_dma(dmach);
-		}	
+			/* No transfer is in progress */
+			omap_start_dma(dmach);
+		}
 	}
- 	
-	data->next_dmach = prev_dmach; 
+
+	data->next_dmach = prev_dmach;
 	data->free_dmach--;
 	spin_unlock_irqrestore(&data->dma_lock, irqflags);
 	return 0;
 }
-int static
-omap16xxcam_finish_dma(void *priv)
+
+int static omap16xxcam_finish_dma(void *priv)
 {
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 
 	while (data->free_dmach < 2)
 		mdelay(1);
@@ -372,112 +372,107 @@ omap16xxcam_finish_dma(void *priv)
 	return 0;
 }
 
-
-/* Enables the camera. Takes camera out of reset. Enables the clocks. */ 
-static int
-omap16xxcam_enable(void *priv)
+/* Enables the camera. Takes camera out of reset. Enables the clocks. */
+static int omap16xxcam_enable(void *priv)
 {
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 
 	omap16xx_cam_reset(data, 1);
-	
-	/* give clock to camera_module */
+
+	/* Give clock to camera_module */
 	data->camera_regs->mode = (FIFO_TRIGGER_LVL << THRESHOLD_BIT);
 	data->camera_regs->ctrlclock = MCLK_EN | CAMEXCLK_EN;
 
 	omap16xx_cam_clear_fifo(data);
 
-	/* wait for camera to settle down */
+	/* Wait for camera to settle down */
 	mdelay(5);
 
 	return 0;
 }
- 
+
 /* Disables all the camera clocks. Put the camera interface in reset. */
-static int
-omap16xxcam_disable(void *priv)
-{ 	
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+static int omap16xxcam_disable(void *priv)
+{
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 
 	omap16xx_cam_clear_fifo(data);
 
-	data->camera_regs->ctrlclock = 0x00000000;     
+	data->camera_regs->ctrlclock = 0x00000000;
 	data->camera_regs->mode = 0x00000000;
-	
+
 	omap16xx_cam_reset(data, 0);
 
 	return 0;
 }
 
 /* Abort the data transfer */
-static int
-omap16xxcam_abort(void *priv)
+static int omap16xxcam_abort(void *priv)
 {
 	return omap16xxcam_disable(priv);
 }
 
-static int
-omap16xxcam_set_xclk(int xclk, void *priv)
-{ 	
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
- 	int xclk_val;
+static int omap16xxcam_set_xclk(int xclk, void *priv)
+{
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
+	int xclk_val;
 	int divisor = 1;
-	divisor = data->ocp_clk/xclk;
-	if ( divisor * xclk < data->ocp_clk)
-		++divisor; 
+	divisor = data->ocp_clk / xclk;
+	if (divisor * xclk < data->ocp_clk)
+		++divisor;
 
 	switch (divisor) {
-		case 1:
-		case 2:
-			xclk_val = FOSCMOD_TC2_CK2;
-			break;
-		case 3:
-			xclk_val = FOSCMOD_TC2_CK3;
-			break;
-		case 4:
-		case 5:
-		case 6:
-		case 7:
-			xclk_val = FOSCMOD_TC2_CK4;
-			break;
-		case 8:
-		case 9:
-			xclk_val = FOSCMOD_TC2_CK8;
-			break;
-		case 10:
-		case 11:
-			xclk_val = FOSCMOD_TC2_CK10;
-			break;
-		case 12:
-		case 13:
-		case 14:
-		case 15:
-			xclk_val = FOSCMOD_TC2_CK12;
-			break;
-		case 16:
-			xclk_val = FOSCMOD_TC2_CK16;
-			break;
-		default:
-			xclk_val = FOSCMOD_TC2_CK16;
+	case 1:
+	case 2:
+		xclk_val = FOSCMOD_TC2_CK2;
+		break;
+	case 3:
+		xclk_val = FOSCMOD_TC2_CK3;
+		break;
+	case 4:
+	case 5:
+	case 6:
+	case 7:
+		xclk_val = FOSCMOD_TC2_CK4;
+		break;
+	case 8:
+	case 9:
+		xclk_val = FOSCMOD_TC2_CK8;
+		break;
+	case 10:
+	case 11:
+		xclk_val = FOSCMOD_TC2_CK10;
+		break;
+	case 12:
+	case 13:
+	case 14:
+	case 15:
+		xclk_val = FOSCMOD_TC2_CK12;
+		break;
+	case 16:
+		xclk_val = FOSCMOD_TC2_CK16;
+		break;
+	default:
+		xclk_val = FOSCMOD_TC2_CK16;
 	}
-	
-	/* follow the protocol to change the XCLK clock */
+
+	/* Follow the protocol to change the XCLK clock */
 	data->camera_regs->ctrlclock &= ~CAMEXCLK_EN;
 	data->camera_regs->ctrlclock |= xclk_val;
 	data->camera_regs->ctrlclock |= CAMEXCLK_EN;
 
-	return (data->ocp_clk/divisor);
+	return (data->ocp_clk / divisor);
 }
 
-static int
-omap16xxcam_open(void *priv)
+static int omap16xxcam_open(void *priv)
 {
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 	int ret;
 
-	if ((ret = request_irq(INT_CAMERA, omap16xx_cam_isr, IRQF_DISABLED,
-					"camera", data))) {
-		printk("FAILED to aquire irq\n");
+	ret = request_irq(INT_CAMERA, omap16xx_cam_isr, IRQF_DISABLED,
+			  "camera", data);
+	if (ret) {
+		printk(KERN_ERR "FAILED to acquire IRQ\n");
 		return ret;
 	}
 
@@ -488,22 +483,20 @@ omap16xxcam_open(void *priv)
 	return omap16xx_cam_link_open(data);
 }
 
-static int
-omap16xxcam_close(void *priv)
+static int omap16xxcam_close(void *priv)
 {
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 
 	omap16xxcam_disable(priv);
-	 
+
 	free_irq(INT_CAMERA, data);
-	
+
 	return omap16xx_cam_link_close(data);
 }
 
-static int
-omap16xxcam_cleanup(void *priv)
+static int omap16xxcam_cleanup(void *priv)
 {
-	struct omap16xxcam *data = (struct omap16xxcam *) priv;
+	struct omap16xxcam *data = (struct omap16xxcam *)priv;
 
 	if (!data->camera_regs)
 		return -EINVAL;
@@ -511,7 +504,7 @@ omap16xxcam_cleanup(void *priv)
 	omap16xxcam_disable(data);
 	if (cpu_is_omap1710())
 		iounmap((void *)data->camera_regs);
-	data->camera_regs= NULL;
+	data->camera_regs = NULL;
 
 	if (data->iobase_phys) {
 		release_mem_region(data->iobase_phys, CAMERA_IOSIZE);
@@ -527,9 +520,8 @@ omap16xxcam_cleanup(void *priv)
 	return 0;
 }
 
-/* Initialise the OMAP camera interface */
-static void *
-omap16xxcam_init(void)
+/* Initialize the OMAP camera interface */
+static void *omap16xxcam_init(void)
 {
 	unsigned long cam_iobase;
 
@@ -540,36 +532,34 @@ omap16xxcam_init(void)
 	}
 
 	if (cpu_is_omap1710()) {
-		cam_iobase = (unsigned long) ioremap (CAMERA_BASE,
-				CAMERA_IOSIZE);
+		cam_iobase = (unsigned long)ioremap(CAMERA_BASE, CAMERA_IOSIZE);
 		if (!cam_iobase) {
-			printk("CANNOT MAP CAMERA REGISTER\n");
+			printk(KERN_ERR "CANNOT MAP CAMERA REGISTER\n");
 			return NULL;
 		}
-	}
-	else
+	} else
 		cam_iobase = io_p2v(CAMERA_BASE);
 
 	/* Set the base address of the camera registers */
-	hardware_data.camera_regs = (camera_regs_t *)cam_iobase;
-	hardware_data.iobase_phys = (unsigned long) CAMERA_BASE;
+	hardware_data.camera_regs = (camera_regs_t *) cam_iobase;
+	hardware_data.iobase_phys = (unsigned long)CAMERA_BASE;
 
-	/* get the input clock value to camera interface and store it */
+	/* Get the input clock value to camera interface and store it */
 	if (cpu_is_omap1710())
 		hardware_data.func_clk = clk_get(0, "tc2_ck");
 	else
 		hardware_data.func_clk = clk_get(0, "armper_ck");
 	hardware_data.ocp_clk = clk_get_rate(hardware_data.func_clk);
 
-	/* Init the camera IF */
+	/* Initialize the camera IF */
 	omap16xx_cam_init();
-	/* enable it. This is needed for sensor detection */
-	omap16xxcam_enable((void*)&hardware_data);
-	/* Init dma data */
+	/* Enable it. This is needed for sensor detection */
+	omap16xxcam_enable((void *)&hardware_data);
+	/* Initialize DMA data */
 	spin_lock_init(&hardware_data.dma_lock);
 
 	init_waitqueue_head(&hardware_data.vsync_wait);
-	return (void*)&hardware_data;
+	return (void *)&hardware_data;
 }
 
 struct camera_hardware camera_hardware_if = {
@@ -587,4 +577,3 @@ struct camera_hardware camera_hardware_if = {
 	.start_dma	= omap16xxcam_start_dma,
 	.finish_dma	= omap16xxcam_finish_dma,
 };
-
-- 
1.5.3.4.206.g58ba4

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

* [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
  2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
@ 2007-10-09 12:52   ` Eduardo Valentin
  2007-10-09 12:52     ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
                       ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 arch/arm/mach-omap1/board-h3.c |  140 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 140 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index df77cf5..8ecc5f2 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -26,6 +26,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/input.h>
 #include <linux/clk.h>
+#include <linux/i2c.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/tsc2101.h>
 
@@ -37,6 +38,8 @@
 #include <asm/mach/flash.h>
 #include <asm/mach/map.h>
 
+#include <media/v4l2-int-device.h>
+
 #include <asm/arch/gpio.h>
 #include <asm/arch/gpioexpander.h>
 #include <asm/arch/irqs.h>
@@ -50,6 +53,8 @@
 #include <asm/arch/mcbsp.h>
 #include <asm/arch/omap-alsa.h>
 
+#include <../drivers/media/video/ov9640.h>
+
 extern int omap_gpio_init(void);
 
 static int h3_keymap[] = {
@@ -547,6 +552,138 @@ static int nand_dev_ready(struct nand_platform_data *data)
 	return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
 }
 
+/*
+ * Common OV9640 register initialization for all image sizes, pixel formats,
+ * and frame rates
+ */
+const static struct ov9640_reg ov9640_common[] = {
+
+	{ 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 },	/* COM7, CLKRC, COM8 */
+	{ 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 },	/* BLUE, RED, COM1 */
+	{ 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA },	/* COM5, COM6, COM9 */
+	{ 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 },	/* ?, PSHFT, AEW */
+	{ 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 },	/* AEB, VPT, BBIAS */
+	{ 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 },	/* EXHCH, EXHCL, HREF */
+	{ 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 },	/* CHLF, ADC, ACOM */
+	{ 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 },	/* OFON, TSLB, COM11 */
+	{ 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 },	/* COM13, COM14, EDGE */
+	{ 0x41, 0x02 }, { 0x42, 0xC8 },		/* COM16, COM17 */
+	{ 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C },	/* ?, ?, ? */
+	{ 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 },	/* ?, ?, ? */
+	{ 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 },	/* ?, ?, ? */
+	{ 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C },	/* ?, ?, ? */
+	{ 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 },	/* ?, ?, ? */
+	{ 0x61, 0xCE },					/* ? */
+	{ 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 },	/* LCC1, LCC2, LCC3 */
+	{ 0x65, 0x00 }, { 0x66, 0x00 },			/* LCC4, LCC5 */
+	{ 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F },	/* HV, MBD, DBLV */
+	{ 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B },	/* GSP1, GSP2, GSP3 */
+	{ 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 },	/* GSP4, GSP5, GSP6 */
+	{ 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 },	/* GSP7, GSP8, GSP9 */
+	{ 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 },	/* GSP10,GSP11,GSP12 */
+	{ 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 },	/* GSP13,GSP14,GSP15 */
+	{ 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 },	/* GSP16,GST1, GST2 */
+	{ 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 },	/* GST3, GST4, GST5 */
+	{ 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 },	/* GST6, GST7, GST8 */
+	{ 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C },	/* GST9, GST10,GST11 */
+	{ 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 },	/* GST12,GST13,GST14 */
+	{ 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 },	/* GST15, COM8 */
+	{ 0x22, 0x8a }, /* GROS */
+	{ OV9640_REG_TERM, OV9640_VAL_TERM }
+};
+
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+static int ov9640_sensor_powerup(void)
+{
+	unsigned char expa;
+	int err;
+
+	/* read current state of GPIO EXPA outputs */
+	err = read_gpio_expa(&expa, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error reading GPIO EXPA\n");
+		return err;
+	}
+	/* Set GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up sensor */
+	err = write_gpio_expa(expa | 0x08, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error writing to GPIO EXPA\n");
+		return err;
+	}
+
+	return 0;
+}
+static int ov9640_sensor_powerdown(void)
+{
+	unsigned char expa;
+	int err;
+
+	/* read current state of GPIO EXPA outputs */
+	err = read_gpio_expa(&expa, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error reading GPIO EXPA\n");
+		return err;
+	}
+	/* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-down sensor */
+	err = write_gpio_expa(expa & ~0x08, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error writing to GPIO EXPA\n");
+		return err;
+	}
+
+	return 0;
+}
+
+static int ov9640_sensor_power_set(int power)
+{
+	int err = 0;
+
+	if (power)
+		err = ov9640_sensor_powerup();
+	else
+		err = ov9640_sensor_powerdown();
+
+	return err;
+}
+
+static struct v4l2_ifparm ifparm = {
+	.if_type = V4L2_IF_TYPE_BT656,
+	.u = {
+		.bt656 = {
+			 .frame_start_on_rising_vs = 1,
+			 .nobt_vs_inv = 1,
+			 .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
+			 .clock_min = OV9640_XCLK_MIN,
+			 .clock_max = OV9640_XCLK_MAX,
+		 },
+	},
+};
+
+static int ov9640_ifparm(struct v4l2_ifparm *p)
+{
+	*p = ifparm;
+
+	return 0;
+}
+#else
+static int ov9640_sensor_power_set(int power) { return 0; }
+static int ov9640_ifparm(struct v4l2_ifparm *p) { return 0; }
+#endif
+
+static struct ov9640_platform_data h3_ov9640_platform_data = {
+	.power_set	= ov9640_sensor_power_set,
+	.default_regs	= ov9640_common,
+	.ifparm		= ov9640_ifparm,
+};
+
+static struct i2c_board_info __initdata h3_i2c_board_info[] = {
+	{
+		I2C_BOARD_INFO("ov9640", 0x30),
+		.platform_data = &h3_ov9640_platform_data,
+	},
+};
+
+
 static void __init h3_init(void)
 {
 	/* Here we assume the NOR boot config:  NOR on CS3 (possibly swapped
@@ -569,6 +706,9 @@ static void __init h3_init(void)
 	/* GPIO10 pullup/down register, Enable pullup on GPIO10 */
 	omap_cfg_reg(V2_1710_GPIO10);
 
+	i2c_register_board_info(1, h3_i2c_board_info,
+				ARRAY_SIZE(h3_i2c_board_info));
+
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 	spi_register_board_info(h3_spi_board_info,
 				ARRAY_SIZE(h3_spi_board_info));
-- 
1.5.3.4.206.g58ba4

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

* [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id
  2007-10-09 12:52   ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
@ 2007-10-09 12:52     ` Eduardo Valentin
  2007-10-09 12:52       ` [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API Eduardo Valentin
  2007-10-10 14:06     ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
  2007-10-31 10:41     ` Tony Lindgren
  2 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

- Update gpio expander code to the corret i2c adapter id
- Due to changes on i2c binding style, the i2c adapter is 1
and not 0. (as configured on i2c_register_board_info)

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 drivers/i2c/chips/gpio_expander_omap.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/chips/gpio_expander_omap.c b/drivers/i2c/chips/gpio_expander_omap.c
index 92e96ba..dfe7f04 100644
--- a/drivers/i2c/chips/gpio_expander_omap.c
+++ b/drivers/i2c/chips/gpio_expander_omap.c
@@ -26,7 +26,7 @@ int write_gpio_expa(u8 val, int addr)
 	struct i2c_msg msg[1];
 	unsigned char data[1];
 
-	adap = i2c_get_adapter(0);
+	adap = i2c_get_adapter(1);
 	if (!adap)
 		return -ENODEV;
 	msg->addr = addr;	/* I2C address of GPIO EXPA */
@@ -51,7 +51,7 @@ int read_gpio_expa(u8 * val, int addr)
 	struct i2c_msg msg[1];
 	unsigned char data[1];
 
-	adap = i2c_get_adapter(0);
+	adap = i2c_get_adapter(1);
 	if (!adap)
 		return -ENODEV;
 	msg->addr = addr;	/* I2C address of GPIO EXPA */
-- 
1.5.3.4.206.g58ba4

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

* [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API
  2007-10-09 12:52     ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
@ 2007-10-09 12:52       ` Eduardo Valentin
  2007-10-09 12:52         ` [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard Eduardo Valentin
  0 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

This patch converts camera_core.c to use v4l2-int-device API.
Only read method was tested with success. MMAP method still needs
re-work and tests.

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 drivers/media/video/omap/camera_core.c |  394 +++++++++++++++++++++-----------
 drivers/media/video/omap/camera_core.h |   26 +-
 2 files changed, 279 insertions(+), 141 deletions(-)

diff --git a/drivers/media/video/omap/camera_core.c b/drivers/media/video/omap/camera_core.c
index bbd51d1..217a79f 100644
--- a/drivers/media/video/omap/camera_core.c
+++ b/drivers/media/video/omap/camera_core.c
@@ -54,6 +54,101 @@ static int capture_mem = 1280*960*2*2;
 static int overlay_mem = 640*480*2;
 
 
+/*
+ * Enable the external sensor interface. Try to negotiate interface
+ * parameters with the sensor and start using the new ones. The calls
+ * to sensor_if_enable and sensor_if_disable need not to be balanced.
+ */
+static int camera_sensor_if_enable(struct camera_device *cam)
+{
+	int rval;
+	struct v4l2_ifparm p;
+
+	rval = vidioc_int_g_ifparm(cam->sdev, &p);
+	if (rval) {
+		dev_err(cam->dev, "vidioc_int_g_ifparm failed with %d\n", rval);
+		return rval;
+	}
+
+	cam->if_type = p.if_type;
+
+	switch (p.if_type) {
+	case V4L2_IF_TYPE_BT656:
+		cam->if_u.bt656.xclk =
+			cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
+						    cam->hardware_data);
+		break;
+	default:
+		/* FIXME: how about other interfaces? */
+		dev_err(cam->dev, "interface type %d not supported\n",
+			p.if_type);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static void camera_sensor_if_disable(const struct camera_device *cam)
+{
+	switch (cam->if_type) {
+	case V4L2_IF_TYPE_BT656:
+		break;
+	}
+}
+
+/*
+ * Initialise the sensor hardware.
+ */
+static int camera_sensor_init(struct camera_device *cam)
+{
+	int err = 0;
+	struct v4l2_int_device *sdev = cam->sdev;
+
+	/* Enable the xclk output.  The sensor may (and does, in the case of
+	 * the OV9640) require an xclk input in order for its initialization
+	 * routine to work.
+	 */
+
+	cam->if_u.bt656.xclk = 21000000;/* choose an arbitrary xclk frequency */
+
+	cam->if_u.bt656.xclk = cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
+							   cam->hardware_data);
+
+	err = camera_sensor_if_enable(cam);
+	if (err) {
+		dev_err(cam->dev, "sensor interface could not be enabled at "
+			"initialisation, %d\n", err);
+		cam->sdev = NULL;
+		goto out;
+	}
+
+	/* power up sensor during sensor initialization */
+	vidioc_int_s_power(sdev, 1);
+
+	err = vidioc_int_dev_init(sdev);
+	if (err) {
+		dev_err(cam->dev, "cannot initialize sensor, error %d\n", err);
+		/* Sensor init failed --- it's nonexistent to us! */
+		cam->sdev = NULL;
+		goto out;
+	}
+
+	dev_info(cam->dev, "sensor is %s\n", sdev->name);
+
+out:
+	camera_sensor_if_disable(cam);
+
+	vidioc_int_s_power(sdev, 0);
+
+	return err;
+}
+
+static void camera_sensor_exit(struct camera_device *cam)
+{
+	if (cam->sdev)
+		vidioc_int_dev_exit(cam->sdev);
+}
+
 /* DMA completion routine for the scatter-gather DMA fragments. */
 /* This function is called when a scatter DMA fragment is completed */
 static void
@@ -68,7 +163,7 @@ camera_core_callback_sgdma(void *arg1, void *arg2)
 	sgdma = cam->sgdma + sgslot;
 	if (!sgdma->queued_sglist) {
 		spin_unlock(&cam->sg_lock);
-		dev_err(&cam->dev, "SGDMA completed when none queued\n");
+		dev_err(cam->dev, "SGDMA completed when none queued\n");
 		return;
 	}
 	if (!--sgdma->queued_sglist) {
@@ -318,7 +413,8 @@ camera_core_vbq_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 static int
 camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, unsigned int *size)
 {
-	struct camera_device *cam = q->priv_data;
+	struct camera_fh *fh = q->priv_data;
+	struct camera_device *cam = fh->cam;
 
 	if (*cnt <= 0)
 		*cnt = VIDEO_MAX_FRAME; /* supply a default number of buffers */
@@ -340,7 +436,8 @@ static int
 camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
         enum v4l2_field field)
 {
-	struct camera_device *cam = q->priv_data;
+	struct camera_fh *fh = q->priv_data;
+	struct camera_device *cam = fh->cam;
 	int err = 0;
 
 	spin_lock(&cam->img_lock);
@@ -368,7 +465,8 @@ camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
 static void
 camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 {
-	struct camera_device *cam = q->priv_data;
+	struct camera_fh *fh = q->priv_data;
+	struct camera_device *cam = fh->cam;
 	enum videobuf_state state = vb->state;
 	int err;
 
@@ -382,7 +480,7 @@ camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 		* scatter-gather DMA slots as video buffers so that can't
 		* happen.
 		*/
-		dev_dbg(&cam->dev, "Failed to queue a video buffer for SGDMA\n");
+		dev_dbg(cam->dev, "Failed to queue a video buffer for SGDMA\n");
 		vb->state = state;
 	}
 }
@@ -417,7 +515,7 @@ static int vidioc_enum_fmt_cap(struct file *file, void *fh,
 	struct camera_fh *ofh  = fh;
 	struct camera_device *cam = ofh->cam;
 
-	return cam->cam_sensor->enum_pixformat(f, cam->sensor_data);
+	return vidioc_int_enum_fmt_cap(cam->sdev, f);
 }
 
 static int vidioc_g_fmt_cap(struct file *file, void *fh,
@@ -438,18 +536,16 @@ static int vidioc_s_fmt_cap(struct file *file, void *fh,
 {
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
-	unsigned int temp_sizeimage = 0;
+	int rval = 0;
+
+	vidioc_int_try_fmt_cap(cam->sdev, f);
 
-	temp_sizeimage = cam->pix.sizeimage;
-	cam->cam_sensor->try_format(&f->fmt.pix, cam->sensor_data);
 	cam->pix = f->fmt.pix;
 
-	cam->xclk = cam->cam_sensor->calc_xclk(&cam->pix,
-			       &cam->nominal_timeperframe, cam->sensor_data);
-	cam->cparm.timeperframe = cam->nominal_timeperframe;
-	cam->xclk = cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
-	return cam->cam_sensor->configure(&cam->pix, cam->xclk,
-				  &cam->cparm.timeperframe, cam->sensor_data);
+	rval = vidioc_int_s_fmt_cap(cam->sdev, f);
+	camera_sensor_if_enable(cam);
+
+	return rval;
 }
 
 static int vidioc_try_fmt_cap(struct file *file, void *fh,
@@ -458,7 +554,7 @@ static int vidioc_try_fmt_cap(struct file *file, void *fh,
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 
-	return cam->cam_sensor->try_format(&f->fmt.pix, cam->sensor_data);
+	return vidioc_int_try_fmt_cap(cam->sdev, f);
 }
 
 static int vidioc_reqbufs(struct file *file, void *fh,
@@ -563,7 +659,7 @@ static int vidioc_queryctrl(struct file *file, void *fh,
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 
-	return cam->cam_sensor->query_control(a, cam->sensor_data);
+	return vidioc_int_queryctrl(cam->sdev, a);
 }
 
 static int vidioc_g_ctrl(struct file *file, void *fh,
@@ -572,7 +668,7 @@ static int vidioc_g_ctrl(struct file *file, void *fh,
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 
-	return cam->cam_sensor->get_control(a, cam->sensor_data);
+	return vidioc_int_g_ctrl(cam->sdev, a);
 }
 
 static int vidioc_s_ctrl(struct file *file, void *fh,
@@ -581,7 +677,7 @@ static int vidioc_s_ctrl(struct file *file, void *fh,
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 
-	return cam->cam_sensor->set_control(a, cam->sensor_data);
+	return vidioc_int_s_ctrl(cam->sdev, a);
 }
 
 static int vidioc_g_fbuf(struct file *file, void *fh,
@@ -723,7 +819,7 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
 				GFP_KERNEL | GFP_DMA);
 	}
 	if (!cam->capture_base) {
-		dev_err(&cam->dev, "cannot allocate capture buffer\n");
+		dev_err(cam->dev, "cannot allocate capture buffer\n");
 		return 0;
 	}
 
@@ -744,7 +840,7 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
 		timeout = interruptible_sleep_on_timeout
 				(&cam->new_video_frame, timeout);
 		if (timeout == 0) {
-			dev_err(&cam->dev, "timeout waiting video frame\n");
+			dev_err(cam->dev, "timeout waiting video frame\n");
 			return -EIO; /* time out */
 		}
 	}
@@ -796,6 +892,8 @@ camera_core_release(struct inode *inode, struct file *file)
 		kfree(fh->vbq.read_buf);
 	}
 
+	module_put(cam->sdev->module);
+
 	cam->cam_hardware->close(cam->hardware_data);
 	cam->active = 0;
 	return 0;
@@ -807,6 +905,8 @@ camera_core_open(struct inode *inode, struct file *file)
 	int minor = iminor(inode);
 	struct camera_device *cam = camera_dev;
 	struct camera_fh *fh;
+	struct v4l2_format format;
+	int rval;
 
 	if (!cam || !cam->vfd || (cam->vfd->minor != minor))
 		return -ENODEV;
@@ -821,11 +921,20 @@ camera_core_open(struct inode *inode, struct file *file)
 
 	spin_lock(&cam->img_lock);
 	if (cam->active == 1) {
-		dev_err(&cam->dev, "Camera device Active\n");
+		dev_err(cam->dev, "Camera device Active\n");
 		spin_unlock(&cam->img_lock);
-		return -EPERM;
+		rval = -EPERM;
+		goto err;
 	}
 	cam->active = 1;
+
+	if (cam->sdev == NULL || !try_module_get(cam->sdev->module)) {
+		spin_unlock(&cam->img_lock);
+		rval = -ENODEV;
+		goto err;
+	}
+
+	vidioc_int_g_fmt_cap(cam->sdev, &format);
 	spin_unlock(&cam->img_lock);
 
 	videobuf_queue_init(&fh->vbq, &cam->vbq_ops, NULL, &cam->vbq_lock,
@@ -835,60 +944,64 @@ camera_core_open(struct inode *inode, struct file *file)
 	cam->capture_started = 0;
 
 	if (cam->cam_hardware->open(cam->hardware_data)) {
-		dev_err(&cam->dev, "Camera IF configuration failed\n");
+		dev_err(cam->dev, "Camera IF configuration failed\n");
 		cam->active = 0;
-		return -ENODEV;
+		rval = -ENODEV;
+		goto err;
 	}
-
-	cam->xclk = cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
-	/* program the sensor for the capture format and rate */
-	if (cam->cam_sensor->configure(&cam->pix, cam->xclk,
-				&cam->cparm.timeperframe, cam->sensor_data)) {
-		dev_err(&cam->dev, "Camera sensor configuration failed\n");
+	rval = vidioc_s_fmt_cap(file, fh, &format);
+	if (rval) {
+		dev_err(cam->dev, "Camera sensor configuration failed (%d)\n", rval);
 		cam->cam_hardware->close(cam->hardware_data);
 		cam->active = 0;
-		return -ENODEV;
+		rval = -ENODEV;
+		goto err;
 	}
 
 	return 0;
+
+err:
+	module_put(cam->sdev->module);
+	kfree(fh);
+	return rval;
 }
 
 #ifdef CONFIG_PM
 static int camera_core_suspend(struct platform_device *pdev, pm_message_t state)
 {
 	struct camera_device *cam = platform_get_drvdata(pdev);
-	int ret = 0;
 
 	spin_lock(&cam->img_lock);
 	if (cam->active)
 		cam->cam_hardware->close(cam->hardware_data);
 
-	cam->cam_sensor->power_off(cam->sensor_data);
+	vidioc_int_s_power(cam->sdev, 0);
 	spin_unlock(&cam->img_lock);
 
-	return ret;
+	return 0;
 }
 
 static int camera_core_resume(struct platform_device *pdev)
 {
 	struct camera_device *cam = platform_get_drvdata(pdev);
-	int ret = 0;
 
 	spin_lock(&cam->img_lock);
-	cam->cam_sensor->power_on(cam->sensor_data);
+	vidioc_int_s_power(cam->sdev, 1);
 	if (cam->active) {
+		struct v4l2_format format;
+
 		cam->capture_completed = 1;
 		cam->cam_hardware->open(cam->hardware_data);
-		cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
 
-		cam->cam_sensor->configure(&cam->pix, cam->xclk,
-					   &cam->cparm.timeperframe,
-					   cam->sensor_data);
+		vidioc_int_g_fmt_cap(cam->sdev, &format);
+		vidioc_int_s_fmt_cap(cam->sdev, &format);
+		camera_sensor_if_enable(cam);
+
 		camera_core_sgdma_process(cam);
 	}
 	spin_unlock(&cam->img_lock);
 
-	return ret;
+	return 0;
 }
 #endif	/* CONFIG_PM */
 
@@ -902,29 +1015,50 @@ static struct file_operations camera_core_fops = {
 	.open			= camera_core_open,
 	.release		= camera_core_release,
 };
+static ssize_t
+camera_streaming_show(struct device *dev, struct device_attribute *attr,
+		char *buf)
+{
+	struct camera_device *cam = dev_get_drvdata(dev);
 
-static int __init camera_core_probe(struct platform_device *pdev)
+	return sprintf(buf, "%s\n", cam->streaming ?  "active" : "inactive");
+}
+
+static DEVICE_ATTR(streaming, S_IRUGO, camera_streaming_show, NULL);
+
+static void camera_device_unregister(struct v4l2_int_device *ctl)
 {
-	struct camera_device *cam;
+	struct camera_device *cam = ctl->priv;
+
+	camera_sensor_exit(cam);
+}
+
+static int camera_device_register(struct v4l2_int_device *ctl,
+				       struct v4l2_int_device *s)
+{
+	struct camera_device *cam = ctl->priv;
 	struct video_device *vfd;
-	int	status;
+	int rval;
+	/*Initialise the pointer to the sensor interface and camera interface */
 
-	cam = kzalloc(sizeof(struct camera_device), GFP_KERNEL);
-	if (!cam) {
-		dev_err(&cam->dev, "could not allocate memory\n");
-		status = -ENOMEM;
-		goto err0;
-	}
+	/* We already have a slave. */
+	if (cam->sdev)
+		return -EBUSY;
 
-	/* Save the pointer to camera device in a global variable */
-	camera_dev = cam;
+	cam->sdev = s;
+
+	if (device_create_file(cam->dev, &dev_attr_streaming) != 0) {
+		dev_err(cam->dev, "could not register sysfs entry\n");
+		rval = -EBUSY;
+		goto err;
+	}
 
 	/* initialize the video_device struct */
 	vfd = cam->vfd = video_device_alloc();
 	if (!vfd) {
-		dev_err(&cam->dev, " could not allocate video device struct\n");
-		status = -ENOMEM;
-		goto err1;
+		dev_err(cam->dev, " could not allocate video device struct\n");
+		rval = -ENOMEM;
+		goto err;
 	}
 
 	vfd->release = video_device_release;
@@ -959,6 +1093,74 @@ static int __init camera_core_probe(struct platform_device *pdev)
 	vfd->vidioc_s_fbuf = vidioc_s_fbuf;
 	vfd->vidioc_overlay = vidioc_overlay;
 
+
+	dev_info(cam->dev, "%s interface with %s sensor\n",
+		cam->cam_hardware->name, cam->sdev->name);
+
+	if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
+		dev_err(cam->dev, "could not register Video for Linux device\n");
+		rval = -ENODEV;
+		goto err;
+	}
+
+
+	rval = camera_sensor_init(cam);
+	if (rval)
+		goto err;
+
+	/* Disable the Camera after detection */
+	cam->cam_hardware->disable(cam->hardware_data);
+
+	return 0;
+
+err:
+	camera_device_unregister(ctl);
+
+	return rval;
+}
+
+static struct v4l2_int_master camera_master = {
+	.attach = camera_device_register,
+	.detach = camera_device_unregister,
+};
+
+static struct v4l2_int_device camera = {
+	.module	= THIS_MODULE,
+	.name	= CAM_NAME,
+	.type	= v4l2_int_type_master,
+	.u	= {
+		.master = &camera_master
+	},
+};
+
+static int __init camera_core_probe(struct platform_device *pdev)
+{
+	struct camera_device *cam;
+	int	status = 0;
+
+	cam = kzalloc(sizeof(struct camera_device), GFP_KERNEL);
+	if (!cam) {
+		dev_err(&pdev->dev, "could not allocate memory\n");
+		status = -ENOMEM;
+		goto err;
+	}
+
+	platform_set_drvdata(pdev, cam);
+
+	cam->dev = &pdev->dev;
+
+	/* initialize the camera interface */
+	cam->cam_hardware = &camera_hardware_if;
+	cam->hardware_data = cam->cam_hardware->init();
+	if (!cam->hardware_data) {
+		dev_err(cam->dev, "cannot initialize interface hardware\n");
+		status = -ENODEV;
+		goto err;
+	}
+
+	/* Save the pointer to camera device in a global variable */
+	camera_dev = cam;
+
 	/* initialize the videobuf queue ops */
 	cam->vbq_ops.buf_setup = camera_core_vbq_setup;
 	cam->vbq_ops.buf_prepare = camera_core_vbq_prepare;
@@ -973,102 +1175,38 @@ static int __init camera_core_probe(struct platform_device *pdev)
 					(dma_addr_t *) &cam->overlay_base_phys,
 					GFP_KERNEL | GFP_DMA);
 		if (!cam->overlay_base) {
-			dev_err(&cam->dev, "cannot allocate overlay framebuffer\n");
+			dev_err(cam->dev, "cannot allocate overlay framebuffer\n");
 			status = -ENOMEM;
-			goto err2;
+			goto err;
 		}
 	}
 	memset((void*)cam->overlay_base, 0, cam->overlay_size);
 	spin_lock_init(&cam->overlay_lock);
 	spin_lock_init(&cam->capture_lock);
 
-	/*Initialise the pointer to the sensor interface and camera interface */
-	cam->cam_sensor = &camera_sensor_if;
-	cam->cam_hardware = &camera_hardware_if;
-
-	/* initialize the camera interface */
-	cam->hardware_data = cam->cam_hardware->init();
-	if (!cam->hardware_data) {
-		dev_err(&cam->dev, "cannot initialize interface hardware\n");
-		status = -ENODEV;
-		goto err3;
-	}
-
 	/* initialize the spinlock used to serialize access to the image
 	 * parameters
 	 */
 	spin_lock_init(&cam->img_lock);
 
-	/* initialize the streaming capture parameters */
-	cam->cparm.capability = V4L2_CAP_TIMEPERFRAME;
-	cam->cparm.readbuffers = 1;
-
-	/* Enable the xclk output.  The sensor may (and does, in the case of
-	 * the OV9640) require an xclk input in order for its initialization
-	 * routine to work.
-	 */
-	cam->xclk = 21000000;	/* choose an arbitrary xclk frequency */
-	cam->xclk = cam->cam_hardware->set_xclk(cam->xclk, cam->hardware_data);
-
-	/* initialize the sensor and define a default capture format cam->pix */
-	cam->sensor_data = cam->cam_sensor->init(&cam->pix);
-	if (!cam->sensor_data) {
-		cam->cam_hardware->disable(cam->hardware_data);
-		dev_err(&cam->dev, "cannot initialize sensor\n");
-		status = -ENODEV;
-		goto err4;
-	}
-
-	dev_info(&cam->dev, "%s interface with %s sensor\n",
-		cam->cam_hardware->name, cam->cam_sensor->name);
-
-	/* select an arbitrary default capture frame rate of 15fps */
-	cam->nominal_timeperframe.numerator = 1;
-	cam->nominal_timeperframe.denominator = 15;
-
-	/* calculate xclk based on the default capture format and default
-	 * frame rate
-	 */
-	cam->xclk = cam->cam_sensor->calc_xclk(&cam->pix,
-		&cam->nominal_timeperframe, cam->sensor_data);
-	cam->cparm.timeperframe = cam->nominal_timeperframe;
-
 	/* initialise the wait queue */
 	init_waitqueue_head(&cam->new_video_frame);
 
 	/* Initialise the DMA structures */
 	camera_core_sgdma_init(cam);
 
-	/* Disable the Camera after detection */
-	cam->cam_hardware->disable(cam->hardware_data);
-
 	platform_set_drvdata(pdev, cam);
 
-	if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
-		dev_err(&cam->dev, "could not register Video for Linux device\n");
-		status = -ENODEV;
-		goto err5;
-	}
+	camera.priv = cam;
 
-	dev_info(&cam->dev, "registered device video%d [v4l2]\n", vfd->minor);
+	if (v4l2_int_device_register(&camera))
+		goto err;
 
 	return 0;
 
- err5:
-	cam->cam_sensor->cleanup(cam->sensor_data);
- err4:
-	cam->cam_hardware->cleanup(cam->hardware_data);
- err3:
-	dma_free_coherent(NULL, cam->overlay_size,
-				(void *)cam->overlay_base,
-				cam->overlay_base_phys);
+ err:
+	vidioc_int_dev_exit(cam->sdev);
 	cam->overlay_base = 0;
- err2:
-	video_device_release(vfd);
- err1:
-	kfree(cam);
-	camera_dev = NULL;
- err0:
 	return status;
 }
 
@@ -1100,7 +1238,7 @@ static int camera_core_remove(struct platform_device *pdev)
 	}
 	cam->overlay_base_phys = 0;
 
-	cam->cam_sensor->cleanup(cam->sensor_data);
+	vidioc_int_dev_exit(cam->sdev);
 	cam->cam_hardware->cleanup(cam->hardware_data);
 	kfree(cam);
 	camera_dev = NULL;
diff --git a/drivers/media/video/omap/camera_core.h b/drivers/media/video/omap/camera_core.h
index a300d67..e156cc3 100644
--- a/drivers/media/video/omap/camera_core.h
+++ b/drivers/media/video/omap/camera_core.h
@@ -19,6 +19,7 @@ struct camera_fh;
 
 #include <media/video-buf.h>
 #include <asm/scatterlist.h>
+#include <media/v4l2-int-device.h>
 
 struct camera_device;
 typedef void (*dma_callback_t)(void *arg1, void *arg2);
@@ -39,7 +40,7 @@ struct sgdma_state {
 
 /* per-device data structure */
 struct camera_device {
-	struct device dev;
+	struct device *dev;
 	struct video_device *vfd;
 
 	spinlock_t overlay_lock;        /* spinlock for overlay DMA counter */
@@ -80,18 +81,18 @@ struct camera_device {
 	 */
 	struct camera_fh *previewing;
 
-	/* capture parameters (frame rate, number of buffers) */
-	struct v4l2_captureparm cparm;
-
-	/* This is the frame period actually requested by the user. */
-	struct v4l2_fract nominal_timeperframe;
-
-	/* frequency (in Hz) of camera interface xclk output */
-	unsigned long xclk;
-
+	/*
+	 * Sensor interface parameters: interface type, CC_CTRL
+	 * register value and interface specific data.
+	 */
+	int if_type;
+	union {
+		struct parallel {
+			u32 xclk;
+		} bt656;
+	} if_u;
 	/* Pointer to the sensor interface ops */
-	struct omap_camera_sensor *cam_sensor;
-	void *sensor_data;
+	struct v4l2_int_device *sdev;
 
 	/* Pointer to the camera interface hardware ops */
 	struct camera_hardware *cam_hardware;
@@ -104,7 +105,6 @@ struct camera_device {
 	 * VIDIOC_S_FMT/VIDIOC_G_FMT ioctls with a CAPTURE buffer type.
 	 */
 	struct v4l2_pix_format pix;
-	struct v4l2_pix_format pix2;
 
 	/* crop defines the size and offset of the video overlay source window
 	 * within the framebuffer.  These parameters are set/queried by the
-- 
1.5.3.4.206.g58ba4

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

* [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard
  2007-10-09 12:52       ` [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API Eduardo Valentin
@ 2007-10-09 12:52         ` Eduardo Valentin
  2007-10-09 12:52           ` [PATCH 6/6] OMAP1: CAMERA: Remove unecessary files from Makefile and Kconfig Eduardo Valentin
  0 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

- Executed Lindent on camera_core.c
- Removed extra blank spaces
- Lines with more than 80 columns were broken

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 drivers/media/video/omap/camera_core.c |  403 +++++++++++++++-----------------
 1 files changed, 191 insertions(+), 212 deletions(-)

diff --git a/drivers/media/video/omap/camera_core.c b/drivers/media/video/omap/camera_core.c
index 217a79f..1d47212 100644
--- a/drivers/media/video/omap/camera_core.c
+++ b/drivers/media/video/omap/camera_core.c
@@ -40,24 +40,22 @@
 static struct camera_device *camera_dev;
 static void camera_core_sgdma_process(struct camera_device *cam);
 
-/* module parameters */
-static int video_nr = -1;	/* video device minor (-1 ==> auto assign) */
+/* Module parameters */
+static int video_nr = -1;	/* Video device minor (-1 ==> auto assign) */
 
 /* Maximum amount of memory to use for capture buffers.
  * Default is 4800KB, enough to double-buffer SXGA.
  */
-static int capture_mem = 1280*960*2*2;
+static int capture_mem = 1280 * 960 * 2 * 2;
 
-/*Size of video overlay framebuffer. This determines the maximum image size
- *that can be previewed. Default is 600KB, enough for sxga.
+/* Size of video overlay framebuffer. This determines the maximum image size
+ * that can be previewed. Default is 600KB, enough for sxga.
  */
-static int overlay_mem = 640*480*2;
+static int overlay_mem = 640 * 480 * 2;
 
-
-/*
- * Enable the external sensor interface. Try to negotiate interface
+/* Enable the external sensor interface. Try to negotiate interface
  * parameters with the sensor and start using the new ones. The calls
- * to sensor_if_enable and sensor_if_disable need not to be balanced.
+ * to sensor_if_enable and sensor_if_disable do not need to be balanced.
  */
 static int camera_sensor_if_enable(struct camera_device *cam)
 {
@@ -75,8 +73,8 @@ static int camera_sensor_if_enable(struct camera_device *cam)
 	switch (p.if_type) {
 	case V4L2_IF_TYPE_BT656:
 		cam->if_u.bt656.xclk =
-			cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
-						    cam->hardware_data);
+		    cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
+						cam->hardware_data);
 		break;
 	default:
 		/* FIXME: how about other interfaces? */
@@ -96,9 +94,7 @@ static void camera_sensor_if_disable(const struct camera_device *cam)
 	}
 }
 
-/*
- * Initialise the sensor hardware.
- */
+/* Initialize the sensor hardware. */
 static int camera_sensor_init(struct camera_device *cam)
 {
 	int err = 0;
@@ -109,7 +105,8 @@ static int camera_sensor_init(struct camera_device *cam)
 	 * routine to work.
 	 */
 
-	cam->if_u.bt656.xclk = 21000000;/* choose an arbitrary xclk frequency */
+	/* Choose an arbitrary xclk frequency */
+	cam->if_u.bt656.xclk = 21000000;
 
 	cam->if_u.bt656.xclk = cam->cam_hardware->set_xclk(cam->if_u.bt656.xclk,
 							   cam->hardware_data);
@@ -117,18 +114,18 @@ static int camera_sensor_init(struct camera_device *cam)
 	err = camera_sensor_if_enable(cam);
 	if (err) {
 		dev_err(cam->dev, "sensor interface could not be enabled at "
-			"initialisation, %d\n", err);
+			"initialization, %d\n", err);
 		cam->sdev = NULL;
 		goto out;
 	}
 
-	/* power up sensor during sensor initialization */
+	/* Power up sensor during sensor initialization */
 	vidioc_int_s_power(sdev, 1);
 
 	err = vidioc_int_dev_init(sdev);
 	if (err) {
 		dev_err(cam->dev, "cannot initialize sensor, error %d\n", err);
-		/* Sensor init failed --- it's nonexistent to us! */
+		/* Sensor initialization failed --- it's nonexistent to us! */
 		cam->sdev = NULL;
 		goto out;
 	}
@@ -149,10 +146,10 @@ static void camera_sensor_exit(struct camera_device *cam)
 		vidioc_int_dev_exit(cam->sdev);
 }
 
-/* DMA completion routine for the scatter-gather DMA fragments. */
-/* This function is called when a scatter DMA fragment is completed */
-static void
-camera_core_callback_sgdma(void *arg1, void *arg2)
+/* DMA completion routine for the scatter-gather DMA fragments.
+ * This function is called when a scatter DMA fragment is completed
+ */
+static void camera_core_callback_sgdma(void *arg1, void *arg2)
 {
 	struct camera_device *cam = (struct camera_device *)arg1;
 	int sgslot = (int)arg2;
@@ -167,16 +164,17 @@ camera_core_callback_sgdma(void *arg1, void *arg2)
 		return;
 	}
 	if (!--sgdma->queued_sglist) {
-		/* queue for this sglist is empty so check whether transfer
-		** of the frame has been completed */
+		/* Queue for this sglist is empty so check whether transfer
+		 * of the frame has been completed
+		 */
 		if (sgdma->next_sglist == sgdma->sglen) {
 			dma_callback_t callback = sgdma->callback;
 			void *arg = sgdma->arg;
-			/* all done with this sglist */
+			/* All done with this sglist */
 			cam->free_sgdma++;
 			if (callback) {
 				spin_unlock(&cam->sg_lock);
-				(*callback)(cam, arg);
+				(*callback) (cam, arg);
 				camera_core_sgdma_process(cam);
 				return;
 			}
@@ -188,8 +186,7 @@ camera_core_callback_sgdma(void *arg1, void *arg2)
 	return;
 }
 
-static void
-camera_core_sgdma_init(struct camera_device *cam)
+static void camera_core_sgdma_init(struct camera_device *cam)
 {
 	int sg;
 
@@ -209,12 +206,10 @@ camera_core_sgdma_init(struct camera_device *cam)
 	}
 }
 
-/*
- * Process the scatter-gather DMA queue by starting queued transfers
- * This function is called to program the dma to start the transfer of an image.
+/* Process the scatter-gather DMA queue by starting queued transfers
+ * This function is called to program the DMA to start the transfer of an image.
  */
-static void
-camera_core_sgdma_process(struct camera_device *cam)
+static void camera_core_sgdma_process(struct camera_device *cam)
 {
 	unsigned long irqflags;
 	int queued_sgdma, sgslot;
@@ -235,18 +230,20 @@ camera_core_sgdma_process(struct camera_device *cam)
 		sgdma = cam->sgdma + sgslot;
 		while (sgdma->next_sglist < sgdma->sglen) {
 			sglist = sgdma->sglist + sgdma->next_sglist;
-			if (cam->cam_hardware->start_dma(sgdma, camera_core_callback_sgdma,
-				(void *)cam, (void *)sgslot, cam->hardware_data)) {
-					/* dma start failed */
-					cam->in_use = 0;
-					return;
+			if (cam->cam_hardware->
+			    start_dma(sgdma, camera_core_callback_sgdma,
+				      (void *)cam, (void *)sgslot,
+				      cam->hardware_data)) {
+				/* DMA start failed */
+				cam->in_use = 0;
+				return;
 			} else {
-				/* dma start successful */
-				sgdma->next_sglist ++;
-				sgdma->queued_sglist ++;
+				/* DMA start successful */
+				sgdma->next_sglist++;
+				sgdma->queued_sglist++;
 			}
 		}
-		queued_sgdma-- ;
+		queued_sgdma--;
 		sgslot = (sgslot + 1) % (NUM_SG_DMA);
 	}
 
@@ -257,10 +254,10 @@ camera_core_sgdma_process(struct camera_device *cam)
  * Returns zero if the transfer was successfully queued, or
  * non-zero if all of the scatter-gather slots are already in use.
  */
-static int
-camera_core_sgdma_queue(struct camera_device *cam,
-        const struct scatterlist *sglist, int sglen, dma_callback_t callback,
-        void *arg)
+static int camera_core_sgdma_queue(struct camera_device *cam,
+				   const struct scatterlist *sglist,
+				   int sglen, dma_callback_t callback,
+				   void *arg)
 {
 	unsigned long irqflags;
 	struct sgdma_state *sgdma;
@@ -295,21 +292,19 @@ camera_core_sgdma_queue(struct camera_device *cam,
 	return 0;
 }
 
-
-/* -------------------overlay routines ------------------------------*/
-/* callback routine for overlay DMA completion. We just start another DMA
+/* -------------------overlay routines ------------------------------
+ * Callback routine for overlay DMA completion. We just start another DMA
  * transfer unless overlay has been turned off
  */
-
-static void
-camera_core_overlay_callback(void *arg1, void *arg)
+static void camera_core_overlay_callback(void *arg1, void *arg)
 {
 	struct camera_device *cam = (struct camera_device *)arg1;
 	int err;
 	unsigned long irqflags;
 	int i, j;
 	int count, index;
-	unsigned char *fb_buf = phys_to_virt((unsigned long)camera_dev->fbuf.base);
+	unsigned char *fb_buf =
+	    phys_to_virt((unsigned long)camera_dev->fbuf.base);
 
 	spin_lock_irqsave(&cam->overlay_lock, irqflags);
 
@@ -324,12 +319,13 @@ camera_core_overlay_callback(void *arg1, void *arg)
 
 	count = 0;
 	j = ((cam->pix.width - 1) * cam->fbuf.fmt.bytesperline);
-	for (i = 0 ; i < cam->pix.sizeimage; i += cam->pix.bytesperline) {
+	for (i = 0; i < cam->pix.sizeimage; i += cam->pix.bytesperline) {
 		for (index = 0; index < cam->pix.bytesperline; index++) {
-			fb_buf[j] = *(((unsigned char *) cam->overlay_base) +
-								 i + index);
+			fb_buf[j] = *(((unsigned char *)cam->overlay_base) +
+				      i + index);
 			index++;
-			fb_buf[j + 1] = *(((unsigned char *) cam->overlay_base) + i + index);
+			fb_buf[j + 1] =
+			    *(((unsigned char *)cam->overlay_base) + i + index);
 			j = j - cam->fbuf.fmt.bytesperline;
 		}
 		count += 2;
@@ -338,7 +334,8 @@ camera_core_overlay_callback(void *arg1, void *arg)
 
 	while (cam->overlay_cnt < 2) {
 		err = camera_core_sgdma_queue(cam, &cam->overlay_sglist, 1,
-			camera_core_overlay_callback, NULL);
+					      camera_core_overlay_callback,
+					      NULL);
 		if (err)
 			break;
 		++cam->overlay_cnt;
@@ -348,9 +345,7 @@ camera_core_overlay_callback(void *arg1, void *arg)
 
 }
 
-
-static void
-camera_core_start_overlay(struct camera_device *cam)
+static void camera_core_start_overlay(struct camera_device *cam)
 {
 	int err;
 	unsigned long irqflags;
@@ -361,10 +356,11 @@ camera_core_start_overlay(struct camera_device *cam)
 	spin_lock_irqsave(&cam->overlay_lock, irqflags);
 
 	sg_dma_address(&cam->overlay_sglist) = cam->overlay_base_phys;
-	sg_dma_len(&cam->overlay_sglist)= cam->pix.sizeimage;
+	sg_dma_len(&cam->overlay_sglist) = cam->pix.sizeimage;
 	while (cam->overlay_cnt < 2) {
 		err = camera_core_sgdma_queue(cam, &cam->overlay_sglist, 1,
-				camera_core_overlay_callback, NULL);
+					      camera_core_overlay_callback,
+					      NULL);
 		if (err)
 			break;
 		++cam->overlay_cnt;
@@ -373,13 +369,11 @@ camera_core_start_overlay(struct camera_device *cam)
 	spin_unlock_irqrestore(&cam->overlay_lock, irqflags);
 }
 
-/* ------------------ videobuf_queue_ops --------------------------------*/
-
-/* This routine is called from interrupt context when a scatter-gather DMA
+/* ------------------ videobuf_queue_ops --------------------------------
+ * This routine is called from interrupt context when a scatter-gather DMA
  * transfer of a videobuf_buffer completes.
  */
-static void
-camera_core_vbq_complete(void *arg1, void *arg)
+static void camera_core_vbq_complete(void *arg1, void *arg)
 {
 	struct camera_device *cam = (struct camera_device *)arg1;
 	struct videobuf_buffer *vb = (struct videobuf_buffer *)arg;
@@ -396,8 +390,8 @@ camera_core_vbq_complete(void *arg1, void *arg)
 	spin_unlock(&cam->vbq_lock);
 }
 
-static void
-camera_core_vbq_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
+static void camera_core_vbq_release(struct videobuf_queue *q,
+				    struct videobuf_buffer *vb)
 {
 	videobuf_waiton(vb, 0, 0);
 	videobuf_dma_unmap(q, &vb->dma);
@@ -410,14 +404,14 @@ camera_core_vbq_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
  * number requested, the currently selected image size, and the maximum
  * amount of memory permitted for kernel capture buffers.
  */
-static int
-camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, unsigned int *size)
+static int camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt,
+				 unsigned int *size)
 {
 	struct camera_fh *fh = q->priv_data;
 	struct camera_device *cam = fh->cam;
 
 	if (*cnt <= 0)
-		*cnt = VIDEO_MAX_FRAME; /* supply a default number of buffers */
+		*cnt = VIDEO_MAX_FRAME;	/* Supply a default number of buffers */
 
 	if (*cnt > VIDEO_MAX_FRAME)
 		*cnt = VIDEO_MAX_FRAME;
@@ -432,9 +426,9 @@ camera_core_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, unsigned int
 	return 0;
 }
 
-static int
-camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
-        enum v4l2_field field)
+static int camera_core_vbq_prepare(struct videobuf_queue *q,
+				   struct videobuf_buffer *vb,
+				   enum v4l2_field field)
 {
 	struct camera_fh *fh = q->priv_data;
 	struct camera_device *cam = fh->cam;
@@ -457,13 +451,13 @@ camera_core_vbq_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
 	if (!err)
 		vb->state = STATE_PREPARED;
 	else
-		camera_core_vbq_release (q, vb);
+		camera_core_vbq_release(q, vb);
 
 	return err;
 }
 
-static void
-camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
+static void camera_core_vbq_queue(struct videobuf_queue *q,
+				  struct videobuf_buffer *vb)
 {
 	struct camera_fh *fh = q->priv_data;
 	struct camera_device *cam = fh->cam;
@@ -472,25 +466,20 @@ camera_core_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 
 	vb->state = STATE_QUEUED;
 	err = camera_core_sgdma_queue(cam, vb->dma.sglist, vb->dma.sglen,
-                camera_core_vbq_complete, vb);
+				      camera_core_vbq_complete, vb);
 	if (err) {
 		/* Oops.  We're not supposed to get any errors here.  The only
-		* way we could get an error is if we ran out of scatter-gather
-		* DMA slots, but we are supposed to have at least as many
-		* scatter-gather DMA slots as video buffers so that can't
-		* happen.
-		*/
+		 * way we could get an error is if we ran out of scatter-gather
+		 * DMA slots, but we are supposed to have at least as many
+		 * scatter-gather DMA slots as video buffers so that can't
+		 * happen.
+		 */
 		dev_dbg(cam->dev, "Failed to queue a video buffer for SGDMA\n");
 		vb->state = state;
 	}
 }
 
-
-/*
- *
- * IOCTL interface.
- *
- */
+/* IOCTL interface. */
 static int vidioc_querycap(struct file *file, void *fh,
 			   struct v4l2_capability *cap)
 {
@@ -501,10 +490,8 @@ static int vidioc_querycap(struct file *file, void *fh,
 	strlcpy(cap->card, cam->vfd->name, sizeof(cap->card));
 	cap->version = OMAP1CAM_VERSION;
 	cap->capabilities =
-		V4L2_CAP_VIDEO_CAPTURE |
-		V4L2_CAP_VIDEO_OVERLAY |
-		V4L2_CAP_READWRITE |
-		V4L2_CAP_STREAMING;
+	    V4L2_CAP_VIDEO_CAPTURE |
+	    V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_READWRITE | V4L2_CAP_STREAMING;
 
 	return 0;
 }
@@ -512,27 +499,25 @@ static int vidioc_querycap(struct file *file, void *fh,
 static int vidioc_enum_fmt_cap(struct file *file, void *fh,
 			       struct v4l2_fmtdesc *f)
 {
-	struct camera_fh *ofh  = fh;
+	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 
 	return vidioc_int_enum_fmt_cap(cam->sdev, f);
 }
 
-static int vidioc_g_fmt_cap(struct file *file, void *fh,
-			    struct v4l2_format *f)
+static int vidioc_g_fmt_cap(struct file *file, void *fh, struct v4l2_format *f)
 {
-	struct camera_fh *ofh  = fh;
+	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 
-	/* get the current format */
+	/* Get the current format */
 	memset(&f->fmt.pix, 0, sizeof(f->fmt.pix));
 	f->fmt.pix = cam->pix;
 
 	return 0;
 }
 
-static int vidioc_s_fmt_cap(struct file *file, void *fh,
-			    struct v4l2_format *f)
+static int vidioc_s_fmt_cap(struct file *file, void *fh, struct v4l2_format *f)
 {
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
@@ -565,8 +550,7 @@ static int vidioc_reqbufs(struct file *file, void *fh,
 	return videobuf_reqbufs(&ofh->vbq, b);
 }
 
-static int vidioc_querybuf(struct file *file, void *fh,
-			   struct v4l2_buffer *b)
+static int vidioc_querybuf(struct file *file, void *fh, struct v4l2_buffer *b)
 {
 	struct camera_fh *ofh = fh;
 
@@ -599,8 +583,7 @@ static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
 		return -EBUSY;
 	} else
 		cam->streaming = ofh;
-		/* FIXME: start camera interface */
-
+	/* FIXME: start camera interface */
 
 	spin_unlock(&cam->img_lock);
 
@@ -620,7 +603,7 @@ static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
 	spin_lock(&cam->img_lock);
 	if (cam->streaming == ofh)
 		cam->streaming = NULL;
-		/* FIXME: stop camera interface */
+	/* FIXME: stop camera interface */
 
 	spin_unlock(&cam->img_lock);
 	return 0;
@@ -662,8 +645,7 @@ static int vidioc_queryctrl(struct file *file, void *fh,
 	return vidioc_int_queryctrl(cam->sdev, a);
 }
 
-static int vidioc_g_ctrl(struct file *file, void *fh,
-			 struct v4l2_control *a)
+static int vidioc_g_ctrl(struct file *file, void *fh, struct v4l2_control *a)
 {
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
@@ -671,8 +653,7 @@ static int vidioc_g_ctrl(struct file *file, void *fh,
 	return vidioc_int_g_ctrl(cam->sdev, a);
 }
 
-static int vidioc_s_ctrl(struct file *file, void *fh,
-			 struct v4l2_control *a)
+static int vidioc_s_ctrl(struct file *file, void *fh, struct v4l2_control *a)
 {
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
@@ -711,15 +692,13 @@ static int vidioc_s_fbuf(struct file *file, void *fh,
 	return 0;
 }
 
-static int vidioc_overlay(struct file *file, void *fh,
-			 unsigned int i)
+static int vidioc_overlay(struct file *file, void *fh, unsigned int i)
 {
 	struct camera_fh *ofh = fh;
 	struct camera_device *cam = ofh->cam;
 	int enable = i;
 
-	/*
-	 * check whether the capture format and
+	/* Check whether the capture format and
 	 * the display format matches
 	 * return failure if they are different
 	 */
@@ -733,7 +712,7 @@ static int vidioc_overlay(struct file *file, void *fh,
 	    (cam->pix.height > cam->fbuf.fmt.width))
 		return -EINVAL;
 
-	if (!cam->previewing && enable)	{
+	if (!cam->previewing && enable) {
 		cam->previewing = fh;
 		cam->overlay_cnt = 0;
 		camera_core_start_overlay(cam);
@@ -743,22 +722,17 @@ static int vidioc_overlay(struct file *file, void *fh,
 	return 0;
 }
 
-/*
- *  file operations
- */
-
-static unsigned
-int camera_core_poll(struct file *file, struct poll_table_struct *wait)
+/* File operations */
+static unsigned int camera_core_poll(struct file *file,
+				     struct poll_table_struct *wait)
 {
 	return -EINVAL;
 }
 
-/* ------------------------------------------------------------ */
-/* callback routine for read DMA completion. We just start another DMA
+/* Callback routine for read DMA completion. We just start another DMA
  * transfer unless overlay has been turned off
  */
-static void
-camera_core_capture_callback(void *arg1, void *arg)
+static void camera_core_capture_callback(void *arg1, void *arg)
 {
 	struct camera_device *cam = (struct camera_device *)arg1;
 	int err;
@@ -778,33 +752,38 @@ camera_core_capture_callback(void *arg1, void *arg)
 		sg_dma_address(&cam->capture_sglist) = cam->capture_base_phys;
 		sg_dma_len(&cam->capture_sglist) = cam->pix.sizeimage;
 		err = camera_core_sgdma_queue(cam, &cam->capture_sglist, 1,
-			camera_core_capture_callback, NULL);
+					      camera_core_capture_callback,
+					      NULL);
 	} else {
 		cam->capture_completed = 1;
 		if (cam->reading) {
 			/* Wake up any process which are waiting for the
-			** DMA to complete */
+			 * DMA to complete
+			 */
 			wake_up_interruptible(&camera_dev->new_video_frame);
-			sg_dma_address(&cam->capture_sglist) = cam->capture_base_phys;
+			sg_dma_address(&cam->capture_sglist) =
+			    cam->capture_base_phys;
 			sg_dma_len(&cam->capture_sglist) = cam->pix.sizeimage;
-			err = camera_core_sgdma_queue(cam, &cam->capture_sglist, 1,
-				camera_core_capture_callback, NULL);
+			err =
+			   camera_core_sgdma_queue(cam, &cam->capture_sglist,
+						   1,
+						   camera_core_capture_callback,
+						   NULL);
 		}
 	}
 
 	spin_unlock_irqrestore(&cam->capture_lock, irqflags);
 }
 
-
-static ssize_t
-camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
+static ssize_t camera_core_read(struct file *file, char *data, size_t count,
+				loff_t *ppos)
 {
 	struct camera_fh *fh = file->private_data;
 	struct camera_device *cam = fh->cam;
 	int err;
 	unsigned long irqflags;
 	long timeout;
-#if 0	/* use video_buf to do capture */
+#if 0				/* Use video_buf to do capture */
 	int i;
 	for (i = 0; i < 14; i++)
 		videobuf_read_one(file, &fh->vbq, data, count, ppos);
@@ -813,10 +792,12 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
 #endif
 
 	if (!cam->capture_base) {
-		cam->capture_base = (unsigned long)dma_alloc_coherent(NULL,
-				cam->pix.sizeimage,
-				(dma_addr_t *) &cam->capture_base_phys,
-				GFP_KERNEL | GFP_DMA);
+		cam->capture_base = (unsigned long)
+		    dma_alloc_coherent(NULL,
+				       cam->pix.sizeimage,
+				       (dma_addr_t *) &
+				       cam->capture_base_phys,
+				       GFP_KERNEL | GFP_DMA);
 	}
 	if (!cam->capture_base) {
 		dev_err(cam->dev, "cannot allocate capture buffer\n");
@@ -827,39 +808,37 @@ camera_core_read(struct file *file, char *data, size_t count, loff_t *ppos)
 	cam->reading = fh;
 	cam->capture_started = 1;
 	sg_dma_address(&cam->capture_sglist) = cam->capture_base_phys;
-	sg_dma_len(&cam->capture_sglist)= cam->pix.sizeimage;
+	sg_dma_len(&cam->capture_sglist) = cam->pix.sizeimage;
 	spin_unlock_irqrestore(&cam->capture_lock, irqflags);
 
 	err = camera_core_sgdma_queue(cam, &cam->capture_sglist, 1,
-			camera_core_capture_callback, NULL);
+				      camera_core_capture_callback, NULL);
 
 	/* Wait till DMA is completed */
 	timeout = HZ * 10;
 	cam->capture_completed = 0;
 	while (cam->capture_completed == 0) {
 		timeout = interruptible_sleep_on_timeout
-				(&cam->new_video_frame, timeout);
+		    (&cam->new_video_frame, timeout);
 		if (timeout == 0) {
 			dev_err(cam->dev, "timeout waiting video frame\n");
-			return -EIO; /* time out */
+			return -EIO;	/* Time out */
 		}
 	}
-	/* copy the data to the user buffer */
+	/* Copy the data to the user buffer */
 	err = copy_to_user(data, (void *)cam->capture_base, cam->pix.sizeimage);
 	return (cam->pix.sizeimage - err);
 
 }
 
-static int
-camera_core_mmap(struct file *file, struct vm_area_struct *vma)
+static int camera_core_mmap(struct file *file, struct vm_area_struct *vma)
 {
 	struct camera_fh *fh = file->private_data;
 
 	return videobuf_mmap_mapper(&fh->vbq, vma);
 }
 
-static int
-camera_core_release(struct inode *inode, struct file *file)
+static int camera_core_release(struct inode *inode, struct file *file)
 {
 	struct camera_fh *fh = file->private_data;
 	struct camera_device *cam = fh->cam;
@@ -882,8 +861,8 @@ camera_core_release(struct inode *inode, struct file *file)
 
 	if (cam->capture_base) {
 		dma_free_coherent(NULL, cam->pix.sizeimage,
-					(void *)cam->capture_base,
-					cam->capture_base_phys);
+				  (void *)cam->capture_base,
+				  cam->capture_base_phys);
 		cam->capture_base = 0;
 		cam->capture_base_phys = 0;
 	}
@@ -899,8 +878,7 @@ camera_core_release(struct inode *inode, struct file *file)
 	return 0;
 }
 
-static int
-camera_core_open(struct inode *inode, struct file *file)
+static int camera_core_open(struct inode *inode, struct file *file)
 {
 	int minor = iminor(inode);
 	struct camera_device *cam = camera_dev;
@@ -911,7 +889,7 @@ camera_core_open(struct inode *inode, struct file *file)
 	if (!cam || !cam->vfd || (cam->vfd->minor != minor))
 		return -ENODEV;
 
-	/* allocate per-filehandle data */
+	/* Allocate per-filehandle data */
 	fh = kmalloc(sizeof(*fh), GFP_KERNEL);
 	if (NULL == fh)
 		return -ENOMEM;
@@ -938,7 +916,8 @@ camera_core_open(struct inode *inode, struct file *file)
 	spin_unlock(&cam->img_lock);
 
 	videobuf_queue_init(&fh->vbq, &cam->vbq_ops, NULL, &cam->vbq_lock,
-		fh->type, V4L2_FIELD_NONE, sizeof(struct videobuf_buffer), fh);
+			    fh->type, V4L2_FIELD_NONE,
+			    sizeof(struct videobuf_buffer), fh);
 
 	cam->capture_completed = 0;
 	cam->capture_started = 0;
@@ -951,7 +930,8 @@ camera_core_open(struct inode *inode, struct file *file)
 	}
 	rval = vidioc_s_fmt_cap(file, fh, &format);
 	if (rval) {
-		dev_err(cam->dev, "Camera sensor configuration failed (%d)\n", rval);
+		dev_err(cam->dev, "Camera sensor configuration failed (%d)\n",
+			rval);
 		cam->cam_hardware->close(cam->hardware_data);
 		cam->active = 0;
 		rval = -ENODEV;
@@ -1003,25 +983,24 @@ static int camera_core_resume(struct platform_device *pdev)
 
 	return 0;
 }
-#endif	/* CONFIG_PM */
+#endif /* CONFIG_PM */
 
 static struct file_operations camera_core_fops = {
-	.owner			= THIS_MODULE,
-	.llseek			= no_llseek,
-	.read			= camera_core_read,
-	.poll			= camera_core_poll,
-	.ioctl			= video_ioctl2,
-	.mmap			= camera_core_mmap,
-	.open			= camera_core_open,
-	.release		= camera_core_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= camera_core_read,
+	.poll		= camera_core_poll,
+	.ioctl		= video_ioctl2,
+	.mmap		= camera_core_mmap,
+	.open		= camera_core_open,
+	.release	= camera_core_release,
 };
-static ssize_t
-camera_streaming_show(struct device *dev, struct device_attribute *attr,
-		char *buf)
+static ssize_t camera_streaming_show(struct device *dev,
+				     struct device_attribute *attr, char *buf)
 {
 	struct camera_device *cam = dev_get_drvdata(dev);
 
-	return sprintf(buf, "%s\n", cam->streaming ?  "active" : "inactive");
+	return sprintf(buf, "%s\n", cam->streaming ? "active" : "inactive");
 }
 
 static DEVICE_ATTR(streaming, S_IRUGO, camera_streaming_show, NULL);
@@ -1034,12 +1013,11 @@ static void camera_device_unregister(struct v4l2_int_device *ctl)
 }
 
 static int camera_device_register(struct v4l2_int_device *ctl,
-				       struct v4l2_int_device *s)
+				  struct v4l2_int_device *s)
 {
 	struct camera_device *cam = ctl->priv;
 	struct video_device *vfd;
 	int rval;
-	/*Initialise the pointer to the sensor interface and camera interface */
 
 	/* We already have a slave. */
 	if (cam->sdev)
@@ -1053,7 +1031,7 @@ static int camera_device_register(struct v4l2_int_device *ctl,
 		goto err;
 	}
 
-	/* initialize the video_device struct */
+	/* Initialize the video_device struct */
 	vfd = cam->vfd = video_device_alloc();
 	if (!vfd) {
 		dev_err(cam->dev, " could not allocate video device struct\n");
@@ -1066,7 +1044,7 @@ static int camera_device_register(struct v4l2_int_device *ctl,
 	strlcpy(vfd->name, CAM_NAME, sizeof(vfd->name));
 	vfd->type = VID_TYPE_CAPTURE | VID_TYPE_OVERLAY | VID_TYPE_CHROMAKEY;
 
-	/* need to register for a VID_HARDWARE_* ID in videodev.h */
+	/* Need to register for a VID_HARDWARE_* ID in videodev.h */
 	vfd->hardware = 0;
 	vfd->fops = &camera_core_fops;
 	video_set_drvdata(vfd, cam);
@@ -1093,17 +1071,16 @@ static int camera_device_register(struct v4l2_int_device *ctl,
 	vfd->vidioc_s_fbuf = vidioc_s_fbuf;
 	vfd->vidioc_overlay = vidioc_overlay;
 
-
 	dev_info(cam->dev, "%s interface with %s sensor\n",
-		cam->cam_hardware->name, cam->sdev->name);
+		 cam->cam_hardware->name, cam->sdev->name);
 
 	if (video_register_device(vfd, VFL_TYPE_GRABBER, video_nr) < 0) {
-		dev_err(cam->dev, "could not register Video for Linux device\n");
+		dev_err(cam->dev,
+			"could not register Video for Linux device\n");
 		rval = -ENODEV;
 		goto err;
 	}
 
-
 	rval = camera_sensor_init(cam);
 	if (rval)
 		goto err;
@@ -1136,7 +1113,7 @@ static struct v4l2_int_device camera = {
 static int __init camera_core_probe(struct platform_device *pdev)
 {
 	struct camera_device *cam;
-	int	status = 0;
+	int status = 0;
 
 	cam = kzalloc(sizeof(struct camera_device), GFP_KERNEL);
 	if (!cam) {
@@ -1149,7 +1126,7 @@ static int __init camera_core_probe(struct platform_device *pdev)
 
 	cam->dev = &pdev->dev;
 
-	/* initialize the camera interface */
+	/* Initialize the camera interface */
 	cam->cam_hardware = &camera_hardware_if;
 	cam->hardware_data = cam->cam_hardware->init();
 	if (!cam->hardware_data) {
@@ -1161,38 +1138,41 @@ static int __init camera_core_probe(struct platform_device *pdev)
 	/* Save the pointer to camera device in a global variable */
 	camera_dev = cam;
 
-	/* initialize the videobuf queue ops */
+	/* Initialize the videobuf queue ops */
 	cam->vbq_ops.buf_setup = camera_core_vbq_setup;
 	cam->vbq_ops.buf_prepare = camera_core_vbq_prepare;
 	cam->vbq_ops.buf_queue = camera_core_vbq_queue;
 	cam->vbq_ops.buf_release = camera_core_vbq_release;
 
-	/* initilize the overlay interface */
+	/* Initialize the overlay interface */
 	cam->overlay_size = overlay_mem;
 	if (cam->overlay_size > 0) {
-		cam->overlay_base = (unsigned long) dma_alloc_coherent(NULL,
-					cam->overlay_size,
-					(dma_addr_t *) &cam->overlay_base_phys,
-					GFP_KERNEL | GFP_DMA);
+		cam->overlay_base = (unsigned long)
+		    dma_alloc_coherent(NULL,
+				       cam->overlay_size,
+				       (dma_addr_t *) &
+				       cam->overlay_base_phys,
+				       GFP_KERNEL | GFP_DMA);
 		if (!cam->overlay_base) {
-			dev_err(cam->dev, "cannot allocate overlay framebuffer\n");
+			dev_err(cam->dev,
+				"cannot allocate overlay framebuffer\n");
 			status = -ENOMEM;
 			goto err;
 		}
 	}
-	memset((void*)cam->overlay_base, 0, cam->overlay_size);
+	memset((void *)cam->overlay_base, 0, cam->overlay_size);
 	spin_lock_init(&cam->overlay_lock);
 	spin_lock_init(&cam->capture_lock);
 
-	/* initialize the spinlock used to serialize access to the image
+	/* Initialize the spinlock used to serialize access to the image
 	 * parameters
 	 */
 	spin_lock_init(&cam->img_lock);
 
-	/* initialise the wait queue */
+	/* Initialize the wait queue */
 	init_waitqueue_head(&cam->new_video_frame);
 
-	/* Initialise the DMA structures */
+	/* Initialize the DMA structures */
 	camera_core_sgdma_init(cam);
 
 	platform_set_drvdata(pdev, cam);
@@ -1204,7 +1184,7 @@ static int __init camera_core_probe(struct platform_device *pdev)
 
 	return 0;
 
- err:
+err:
 	vidioc_int_dev_exit(cam->sdev);
 	cam->overlay_base = 0;
 	return status;
@@ -1219,21 +1199,21 @@ static int camera_core_remove(struct platform_device *pdev)
 	if (vfd) {
 		if (vfd->minor == -1) {
 			/* The device never got registered, so release the
-			** video_device struct directly
-			*/
+			 * video_device struct directly
+			 */
 			video_device_release(vfd);
 		} else {
-			/* The unregister function will release the video_device
-			** struct as well as unregistering it.
-			*/
+			/* The unregister function will release the
+			 * video_device struct as well as unregistering it.
+			 */
 			video_unregister_device(vfd);
 		}
 		cam->vfd = NULL;
 	}
 	if (cam->overlay_base) {
 		dma_free_coherent(NULL, cam->overlay_size,
-					(void *)cam->overlay_base,
-					cam->overlay_base_phys);
+				  (void *)cam->overlay_base,
+				  cam->overlay_base_phys);
 		cam->overlay_base = 0;
 	}
 	cam->overlay_base_phys = 0;
@@ -1247,27 +1227,26 @@ static int camera_core_remove(struct platform_device *pdev)
 }
 
 static struct platform_driver camera_core_driver = {
-	.driver = {
-		.name		= CAM_NAME,
-		.owner		= THIS_MODULE,
+	.driver	= {
+		.name	= CAM_NAME,
+		.owner	= THIS_MODULE,
 	},
-	.probe			= camera_core_probe,
-	.remove			= camera_core_remove,
+	.probe		= camera_core_probe,
+	.remove		= camera_core_remove,
 #ifdef CONFIG_PM
-	.suspend		= camera_core_suspend,
-	.resume			= camera_core_resume,
+	.suspend	= camera_core_suspend,
+	.resume		= camera_core_resume,
 #endif
 };
 
 /* FIXME register omap16xx or omap24xx camera device in arch/arm/...
- * system init code, with its resources and mux setup, NOT here.
+ * system initialization code, with its resources and mux setup, NOT here.
  * Then MODULE_ALIAS(CAM_NAME) so it hotplugs and coldplugs; this
  * "legacy" driver style is trouble.
  */
 static struct platform_device *cam;
 
-static void __exit
-camera_core_cleanup(void)
+static void __exit camera_core_cleanup(void)
 {
 	platform_driver_unregister(&camera_core_driver);
 	platform_device_unregister(cam);
@@ -1275,8 +1254,7 @@ camera_core_cleanup(void)
 
 static char banner[] __initdata = KERN_INFO "OMAP Camera driver initializing\n";
 
-static int __init
-camera_core_init(void)
+static int __init camera_core_init(void)
 {
 
 	printk(banner);
@@ -1293,10 +1271,11 @@ MODULE_LICENSE("GPL");
 
 module_param(video_nr, int, 0);
 MODULE_PARM_DESC(video_nr,
-		"Minor number for video device (-1 ==> auto assign)");
+		 "Minor number for video device (-1 ==> auto assign)");
 module_param(capture_mem, int, 0);
 MODULE_PARM_DESC(capture_mem,
-        "Maximum amount of memory for capture buffers (default 4800KB)");
+		 "Maximum amount of memory for capture buffers "
+		 "(default 4800KB)");
 
 module_init(camera_core_init);
 module_exit(camera_core_cleanup);
-- 
1.5.3.4.206.g58ba4

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

* [PATCH 6/6] OMAP1: CAMERA: Remove unecessary files from Makefile and Kconfig.
  2007-10-09 12:52         ` [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard Eduardo Valentin
@ 2007-10-09 12:52           ` Eduardo Valentin
  0 siblings, 0 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-09 12:52 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

- Once ov9640 is implemented using v4l2-int-device API,
this patch removes unecessary files from Makefile and Kconfig.

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 drivers/media/video/omap/Kconfig  |    6 ------
 drivers/media/video/omap/Makefile |    3 ---
 2 files changed, 0 insertions(+), 9 deletions(-)

diff --git a/drivers/media/video/omap/Kconfig b/drivers/media/video/omap/Kconfig
index 809193b..0fb0686 100644
--- a/drivers/media/video/omap/Kconfig
+++ b/drivers/media/video/omap/Kconfig
@@ -4,9 +4,3 @@ config VIDEO_OMAP_CAMERA
 	depends on VIDEO_DEV && (ARCH_OMAP16XX || ARCH_OMAP24XX)
 	help
 	  V4L2 camera driver support for OMAP1/2 based boards.
-	
-config VIDEO_CAMERA_SENSOR_OV9640
-	tristate "OV9640 sensor support"
-	depends on VIDEO_OMAP_CAMERA
-	help
-	  OmniVision 9640 camera sensor support
diff --git a/drivers/media/video/omap/Makefile b/drivers/media/video/omap/Makefile
index 36ae615..9b4a998 100644
--- a/drivers/media/video/omap/Makefile
+++ b/drivers/media/video/omap/Makefile
@@ -1,11 +1,8 @@
 # Makefile for OMAP1/2 camera driver
 
 obj-$(CONFIG_VIDEO_OMAP_CAMERA) += omapcamera.o
-obj-$(CONFIG_VIDEO_CAMERA_SENSOR_OV9640) += sensor_ov9640.o
 
 objs-y$(CONFIG_ARCH_OMAP16XX) += omap16xxcam.o camera_core.o
-objs-y$(CONFIG_MACH_OMAP_H3) += h3_sensor_power.o
-objs-y$(CONFIG_MACH_OMAP_H4) += h4_sensor_power.o
 
 omapcamera-objs := $(objs-yy)
 
-- 
1.5.3.4.206.g58ba4

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

* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
  2007-10-09 12:52   ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
  2007-10-09 12:52     ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
@ 2007-10-10 14:06     ` Eduardo Valentin
  2007-10-10 14:06       ` Eduardo Valentin
  2007-10-31 10:41     ` Tony Lindgren
  2 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-10 14:06 UTC (permalink / raw)
  To: linux-omap-mailing-list

Hi all,

This is an update for the last patch 02/06. Thanks to the comments from David Brownell, I've optimized a small piece of code in this patch.

Thanks,

Eduardo Valentin

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

* [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
  2007-10-10 14:06     ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
@ 2007-10-10 14:06       ` Eduardo Valentin
  0 siblings, 0 replies; 13+ messages in thread
From: Eduardo Valentin @ 2007-10-10 14:06 UTC (permalink / raw)
  To: linux-omap-mailing-list; +Cc: Eduardo Valentin

From: Eduardo Valentin <eduardo.valentin@indt.org.br>

This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 arch/arm/mach-omap1/board-h3.c |  113 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 113 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index df77cf5..f69802e 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -26,6 +26,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/input.h>
 #include <linux/clk.h>
+#include <linux/i2c.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/tsc2101.h>
 
@@ -37,6 +38,8 @@
 #include <asm/mach/flash.h>
 #include <asm/mach/map.h>
 
+#include <media/v4l2-int-device.h>
+
 #include <asm/arch/gpio.h>
 #include <asm/arch/gpioexpander.h>
 #include <asm/arch/irqs.h>
@@ -50,6 +53,8 @@
 #include <asm/arch/mcbsp.h>
 #include <asm/arch/omap-alsa.h>
 
+#include <../drivers/media/video/ov9640.h>
+
 extern int omap_gpio_init(void);
 
 static int h3_keymap[] = {
@@ -547,6 +552,111 @@ static int nand_dev_ready(struct nand_platform_data *data)
 	return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
 }
 
+/*
+ * Common OV9640 register initialization for all image sizes, pixel formats,
+ * and frame rates
+ */
+const static struct ov9640_reg ov9640_common[] = {
+
+	{ 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 },	/* COM7, CLKRC, COM8 */
+	{ 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 },	/* BLUE, RED, COM1 */
+	{ 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA },	/* COM5, COM6, COM9 */
+	{ 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 },	/* ?, PSHFT, AEW */
+	{ 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 },	/* AEB, VPT, BBIAS */
+	{ 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 },	/* EXHCH, EXHCL, HREF */
+	{ 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 },	/* CHLF, ADC, ACOM */
+	{ 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 },	/* OFON, TSLB, COM11 */
+	{ 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 },	/* COM13, COM14, EDGE */
+	{ 0x41, 0x02 }, { 0x42, 0xC8 },		/* COM16, COM17 */
+	{ 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C },	/* ?, ?, ? */
+	{ 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 },	/* ?, ?, ? */
+	{ 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 },	/* ?, ?, ? */
+	{ 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C },	/* ?, ?, ? */
+	{ 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 },	/* ?, ?, ? */
+	{ 0x61, 0xCE },					/* ? */
+	{ 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 },	/* LCC1, LCC2, LCC3 */
+	{ 0x65, 0x00 }, { 0x66, 0x00 },			/* LCC4, LCC5 */
+	{ 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F },	/* HV, MBD, DBLV */
+	{ 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B },	/* GSP1, GSP2, GSP3 */
+	{ 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 },	/* GSP4, GSP5, GSP6 */
+	{ 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 },	/* GSP7, GSP8, GSP9 */
+	{ 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 },	/* GSP10,GSP11,GSP12 */
+	{ 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 },	/* GSP13,GSP14,GSP15 */
+	{ 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 },	/* GSP16,GST1, GST2 */
+	{ 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 },	/* GST3, GST4, GST5 */
+	{ 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 },	/* GST6, GST7, GST8 */
+	{ 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C },	/* GST9, GST10,GST11 */
+	{ 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 },	/* GST12,GST13,GST14 */
+	{ 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 },	/* GST15, COM8 */
+	{ 0x22, 0x8a }, /* GROS */
+	{ OV9640_REG_TERM, OV9640_VAL_TERM }
+};
+
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+static int ov9640_sensor_power_set(int power)
+{
+	unsigned char expa;
+	int err;
+
+	/* read current state of GPIO EXPA outputs */
+	err = read_gpio_expa(&expa, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error reading GPIO EXPA\n");
+		return err;
+	}
+	/* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up/down sensor */
+	if (power)
+		expa |= 0x08;
+	else
+		expa &= ~0x08;
+
+	err = write_gpio_expa(expa, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error writing to GPIO EXPA\n");
+		return err;
+	}
+
+	return err;
+}
+
+static struct v4l2_ifparm ifparm = {
+	.if_type = V4L2_IF_TYPE_BT656,
+	.u = {
+		.bt656 = {
+			 .frame_start_on_rising_vs = 1,
+			 .nobt_vs_inv = 1,
+			 .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
+			 .clock_min = OV9640_XCLK_MIN,
+			 .clock_max = OV9640_XCLK_MAX,
+		 },
+	},
+};
+
+static int ov9640_ifparm(struct v4l2_ifparm *p)
+{
+	*p = ifparm;
+
+	return 0;
+}
+#else
+static int ov9640_sensor_power_set(int power) { return 0; }
+static int ov9640_ifparm(struct v4l2_ifparm *p) { return 0; }
+#endif
+
+static struct ov9640_platform_data h3_ov9640_platform_data = {
+	.power_set	= ov9640_sensor_power_set,
+	.default_regs	= ov9640_common,
+	.ifparm		= ov9640_ifparm,
+};
+
+static struct i2c_board_info __initdata h3_i2c_board_info[] = {
+	{
+		I2C_BOARD_INFO("ov9640", 0x30),
+		.platform_data = &h3_ov9640_platform_data,
+	},
+};
+
+
 static void __init h3_init(void)
 {
 	/* Here we assume the NOR boot config:  NOR on CS3 (possibly swapped
@@ -569,6 +679,9 @@ static void __init h3_init(void)
 	/* GPIO10 pullup/down register, Enable pullup on GPIO10 */
 	omap_cfg_reg(V2_1710_GPIO10);
 
+	i2c_register_board_info(1, h3_i2c_board_info,
+				ARRAY_SIZE(h3_i2c_board_info));
+
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 	spi_register_board_info(h3_spi_board_info,
 				ARRAY_SIZE(h3_spi_board_info));
-- 
1.5.3.4.206.g58ba4

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

* Re: [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api
  2007-10-09 12:52 [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Eduardo Valentin
  2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
@ 2007-10-22  6:31 ` Trilok Soni
  1 sibling, 0 replies; 13+ messages in thread
From: Trilok Soni @ 2007-10-22  6:31 UTC (permalink / raw)
  To: Eduardo Valentin; +Cc: linux-omap-mailing-list

Hi Eduardo,

On 10/9/07, Eduardo Valentin <edubezval@gmail.com> wrote:
> Hi all,
>
> This patch set converts omap1 camera to use v4l2-int-device api. It was
> tested on H3 with ov9640 sensor, so board-h3.c was modified to add ov9640
> specific initializations. The gpio-expander code was modified also to use
> the i2c adapter id configured with i2c board specific info. Currently, it is
> working only with read method. To work with MMAP, camera_core.c needs more
> re-work.
>
> Here is the overall diffstat:
>  b/arch/arm/mach-omap1/board-h3.c         |  141 +++++++++
>  b/drivers/i2c/chips/gpio_expander_omap.c |    5
>  b/drivers/media/video/omap/Kconfig       |    6
>  b/drivers/media/video/omap/Makefile      |    4
>  b/drivers/media/video/omap/camera_core.c |  394 ++++++++++++++++++---------
>  b/drivers/media/video/omap/camera_core.h |   27 -
>  b/drivers/media/video/omap/omap16xxcam.c |  442 +++++++++++++++----------------
>  drivers/media/video/omap/camera_core.c   |  404 +++++++++++++---------------
>  8 files changed, 827 insertions(+), 596 deletions(-)
>

Thanx for sending OMAP1 changes to fit with new framework. So, it
looks like that new ov9640.c is ready for upstream.

-- 
--Trilok Soni

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

* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
  2007-10-09 12:52   ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
  2007-10-09 12:52     ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
  2007-10-10 14:06     ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
@ 2007-10-31 10:41     ` Tony Lindgren
  2007-11-01 15:32       ` Eduardo Valentin
  2 siblings, 1 reply; 13+ messages in thread
From: Tony Lindgren @ 2007-10-31 10:41 UTC (permalink / raw)
  To: Eduardo Valentin; +Cc: Eduardo Valentin, linux-omap-mailing-list

Hi,

* Eduardo Valentin <edubezval@gmail.com> [071009 05:53]:
> From: Eduardo Valentin <eduardo.valentin@indt.org.br>
> 
> This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
> 
> Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
> ---
>  arch/arm/mach-omap1/board-h3.c |  140 ++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 140 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
> index df77cf5..8ecc5f2 100644
> --- a/arch/arm/mach-omap1/board-h3.c
> +++ b/arch/arm/mach-omap1/board-h3.c

<snip>

> @@ -547,6 +552,138 @@ static int nand_dev_ready(struct nand_platform_data *data)
>  	return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
>  }
>  
> +/*
> + * Common OV9640 register initialization for all image sizes, pixel formats,
> + * and frame rates
> + */
> +const static struct ov9640_reg ov9640_common[] = {
> +
> +	{ 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 },	/* COM7, CLKRC, COM8 */
> +	{ 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 },	/* BLUE, RED, COM1 */
> +	{ 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA },	/* COM5, COM6, COM9 */
> +	{ 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 },	/* ?, PSHFT, AEW */
> +	{ 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 },	/* AEB, VPT, BBIAS */
> +	{ 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 },	/* EXHCH, EXHCL, HREF */
> +	{ 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 },	/* CHLF, ADC, ACOM */
> +	{ 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 },	/* OFON, TSLB, COM11 */
> +	{ 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 },	/* COM13, COM14, EDGE */
> +	{ 0x41, 0x02 }, { 0x42, 0xC8 },		/* COM16, COM17 */
> +	{ 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C },	/* ?, ?, ? */
> +	{ 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 },	/* ?, ?, ? */
> +	{ 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 },	/* ?, ?, ? */
> +	{ 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C },	/* ?, ?, ? */
> +	{ 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 },	/* ?, ?, ? */
> +	{ 0x61, 0xCE },					/* ? */
> +	{ 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 },	/* LCC1, LCC2, LCC3 */
> +	{ 0x65, 0x00 }, { 0x66, 0x00 },			/* LCC4, LCC5 */
> +	{ 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F },	/* HV, MBD, DBLV */
> +	{ 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B },	/* GSP1, GSP2, GSP3 */
> +	{ 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 },	/* GSP4, GSP5, GSP6 */
> +	{ 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 },	/* GSP7, GSP8, GSP9 */
> +	{ 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 },	/* GSP10,GSP11,GSP12 */
> +	{ 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 },	/* GSP13,GSP14,GSP15 */
> +	{ 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 },	/* GSP16,GST1, GST2 */
> +	{ 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 },	/* GST3, GST4, GST5 */
> +	{ 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 },	/* GST6, GST7, GST8 */
> +	{ 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C },	/* GST9, GST10,GST11 */
> +	{ 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 },	/* GST12,GST13,GST14 */
> +	{ 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 },	/* GST15, COM8 */
> +	{ 0x22, 0x8a }, /* GROS */
> +	{ OV9640_REG_TERM, OV9640_VAL_TERM }
> +};
> +
> +#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)

<snip>

How about moving the struct ov9640_reg to be within CONFIG_VIDEO_OV9640?

Regards,

Tony

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

* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
  2007-10-31 10:41     ` Tony Lindgren
@ 2007-11-01 15:32       ` Eduardo Valentin
  2007-11-15  1:46         ` Tony Lindgren
  0 siblings, 1 reply; 13+ messages in thread
From: Eduardo Valentin @ 2007-11-01 15:32 UTC (permalink / raw)
  To: Tony Lindgren; +Cc: Eduardo Valentin, linux-omap-mailing-list

[-- Attachment #1: Type: text/plain, Size: 4010 bytes --]

Hi Tony,

I'm re-sending the patch. As I said, it was based on board-h4.c. But I
totally agree with you. I believe this new one is a better way to
implement it. Unnecessary structures and functions are not created if
the OV9640 is not selected. I've just compiled tested this new patch.

Cheers,

On 10/31/07, Tony Lindgren <tony@atomide.com> wrote:
> Hi,
>
> * Eduardo Valentin <edubezval@gmail.com> [071009 05:53]:
> > From: Eduardo Valentin <eduardo.valentin@indt.org.br>
> >
> > This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.
> >
> > Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
> > ---
> >  arch/arm/mach-omap1/board-h3.c |  140 ++++++++++++++++++++++++++++++++++++++++
> >  1 files changed, 140 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
> > index df77cf5..8ecc5f2 100644
> > --- a/arch/arm/mach-omap1/board-h3.c
> > +++ b/arch/arm/mach-omap1/board-h3.c
>
> <snip>
>
> > @@ -547,6 +552,138 @@ static int nand_dev_ready(struct nand_platform_data *data)
> >       return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
> >  }
> >
> > +/*
> > + * Common OV9640 register initialization for all image sizes, pixel formats,
> > + * and frame rates
> > + */
> > +const static struct ov9640_reg ov9640_common[] = {
> > +
> > +     { 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 }, /* COM7, CLKRC, COM8 */
> > +     { 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 }, /* BLUE, RED, COM1 */
> > +     { 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA }, /* COM5, COM6, COM9 */
> > +     { 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 }, /* ?, PSHFT, AEW */
> > +     { 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 }, /* AEB, VPT, BBIAS */
> > +     { 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 }, /* EXHCH, EXHCL, HREF */
> > +     { 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 }, /* CHLF, ADC, ACOM */
> > +     { 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 }, /* OFON, TSLB, COM11 */
> > +     { 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 }, /* COM13, COM14, EDGE */
> > +     { 0x41, 0x02 }, { 0x42, 0xC8 },         /* COM16, COM17 */
> > +     { 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C }, /* ?, ?, ? */
> > +     { 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 }, /* ?, ?, ? */
> > +     { 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 }, /* ?, ?, ? */
> > +     { 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C }, /* ?, ?, ? */
> > +     { 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 }, /* ?, ?, ? */
> > +     { 0x61, 0xCE },                                 /* ? */
> > +     { 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 }, /* LCC1, LCC2, LCC3 */
> > +     { 0x65, 0x00 }, { 0x66, 0x00 },                 /* LCC4, LCC5 */
> > +     { 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F }, /* HV, MBD, DBLV */
> > +     { 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B }, /* GSP1, GSP2, GSP3 */
> > +     { 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 }, /* GSP4, GSP5, GSP6 */
> > +     { 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 }, /* GSP7, GSP8, GSP9 */
> > +     { 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 }, /* GSP10,GSP11,GSP12 */
> > +     { 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 }, /* GSP13,GSP14,GSP15 */
> > +     { 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 }, /* GSP16,GST1, GST2 */
> > +     { 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 }, /* GST3, GST4, GST5 */
> > +     { 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 }, /* GST6, GST7, GST8 */
> > +     { 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C }, /* GST9, GST10,GST11 */
> > +     { 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 }, /* GST12,GST13,GST14 */
> > +     { 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 }, /* GST15, COM8 */
> > +     { 0x22, 0x8a }, /* GROS */
> > +     { OV9640_REG_TERM, OV9640_VAL_TERM }
> > +};
> > +
> > +#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
>
> <snip>
>
> How about moving the struct ov9640_reg to be within CONFIG_VIDEO_OV9640?
>
> Regards,
>
> Tony
>


-- 
Eduardo Bezerra Valentin

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-OMAP-Update-ov9640-ifparm-for-H3-board.patch --]
[-- Type: text/x-diff; name=0001-OMAP-Update-ov9640-ifparm-for-H3-board.patch, Size: 5604 bytes --]

From b6030eac258261550b946ab211124ced3536285e Mon Sep 17 00:00:00 2001
From: Eduardo Valentin <eduardo.valentin@indt.org.br>
Date: Wed, 10 Oct 2007 10:06:18 -0400
Subject: [PATCH] OMAP: Update ov9640 ifparm for H3 board.

This code is based on board-h4.c and drivers/media/video/omap/h3_sensor_power.c codes.

Signed-off-by: Eduardo Valentin <eduardo.valentin@indt.org.br>
---
 arch/arm/mach-omap1/board-h3.c |  112 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 112 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c
index df77cf5..f6095f0 100644
--- a/arch/arm/mach-omap1/board-h3.c
+++ b/arch/arm/mach-omap1/board-h3.c
@@ -26,6 +26,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/input.h>
 #include <linux/clk.h>
+#include <linux/i2c.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/tsc2101.h>
 
@@ -37,6 +38,8 @@
 #include <asm/mach/flash.h>
 #include <asm/mach/map.h>
 
+#include <media/v4l2-int-device.h>
+
 #include <asm/arch/gpio.h>
 #include <asm/arch/gpioexpander.h>
 #include <asm/arch/irqs.h>
@@ -50,6 +53,8 @@
 #include <asm/arch/mcbsp.h>
 #include <asm/arch/omap-alsa.h>
 
+#include <../drivers/media/video/ov9640.h>
+
 extern int omap_gpio_init(void);
 
 static int h3_keymap[] = {
@@ -547,6 +552,110 @@ static int nand_dev_ready(struct nand_platform_data *data)
 	return omap_get_gpio_datain(H3_NAND_RB_GPIO_PIN);
 }
 
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+/*
+ * Common OV9640 register initialization for all image sizes, pixel formats,
+ * and frame rates
+ */
+const static struct ov9640_reg ov9640_common[] = {
+
+	{ 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x88 },	/* COM7, CLKRC, COM8 */
+	{ 0x01, 0x58 }, { 0x02, 0x24 }, { 0x04, 0x00 },	/* BLUE, RED, COM1 */
+	{ 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0xcA },	/* COM5, COM6, COM9 */
+	{ 0x16, 0x02 }, { 0x1B, 0x01 }, { 0x24, 0x70 },	/* ?, PSHFT, AEW */
+	{ 0x25, 0x68 }, { 0x26, 0xD3 }, { 0x27, 0x90 },	/* AEB, VPT, BBIAS */
+	{ 0x2A, 0x00 }, { 0x2B, 0x00 }, { 0x32, 0x24 },	/* EXHCH, EXHCL, HREF */
+	{ 0x33, 0x02 }, { 0x37, 0x02 }, { 0x38, 0x13 },	/* CHLF, ADC, ACOM */
+	{ 0x39, 0xF0 }, { 0x3A, 0x00 }, { 0x3B, 0x01 },	/* OFON, TSLB, COM11 */
+	{ 0x3D, 0x90 }, { 0x3E, 0x02 }, { 0x3F, 0xF2 },	/* COM13, COM14, EDGE */
+	{ 0x41, 0x02 }, { 0x42, 0xC8 },		/* COM16, COM17 */
+	{ 0x43, 0xF0 }, { 0x44, 0x10 }, { 0x45, 0x6C },	/* ?, ?, ? */
+	{ 0x46, 0x6C }, { 0x47, 0x44 }, { 0x48, 0x44 },	/* ?, ?, ? */
+	{ 0x49, 0x03 }, { 0x59, 0x49 }, { 0x5A, 0x94 },	/* ?, ?, ? */
+	{ 0x5B, 0x46 }, { 0x5C, 0x84 }, { 0x5D, 0x5C },	/* ?, ?, ? */
+	{ 0x5E, 0x08 }, { 0x5F, 0x00 }, { 0x60, 0x14 },	/* ?, ?, ? */
+	{ 0x61, 0xCE },					/* ? */
+	{ 0x62, 0x70 }, { 0x63, 0x00 }, { 0x64, 0x04 },	/* LCC1, LCC2, LCC3 */
+	{ 0x65, 0x00 }, { 0x66, 0x00 },			/* LCC4, LCC5 */
+	{ 0x69, 0x00 }, { 0x6A, 0x3E }, { 0x6B, 0x3F },	/* HV, MBD, DBLV */
+	{ 0x6C, 0x40 }, { 0x6D, 0x30 }, { 0x6E, 0x4B },	/* GSP1, GSP2, GSP3 */
+	{ 0x6F, 0x60 }, { 0x70, 0x70 }, { 0x71, 0x70 },	/* GSP4, GSP5, GSP6 */
+	{ 0x72, 0x70 }, { 0x73, 0x70 }, { 0x74, 0x60 },	/* GSP7, GSP8, GSP9 */
+	{ 0x75, 0x60 }, { 0x76, 0x50 }, { 0x77, 0x48 },	/* GSP10,GSP11,GSP12 */
+	{ 0x78, 0x3A }, { 0x79, 0x2E }, { 0x7A, 0x28 },	/* GSP13,GSP14,GSP15 */
+	{ 0x7B, 0x22 }, { 0x7C, 0x04 }, { 0x7D, 0x07 },	/* GSP16,GST1, GST2 */
+	{ 0x7E, 0x10 }, { 0x7F, 0x28 }, { 0x80, 0x36 },	/* GST3, GST4, GST5 */
+	{ 0x81, 0x44 }, { 0x82, 0x52 }, { 0x83, 0x60 },	/* GST6, GST7, GST8 */
+	{ 0x84, 0x6C }, { 0x85, 0x78 }, { 0x86, 0x8C },	/* GST9, GST10,GST11 */
+	{ 0x87, 0x9E }, { 0x88, 0xBB }, { 0x89, 0xD2 },	/* GST12,GST13,GST14 */
+	{ 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 },	/* GST15, COM8 */
+	{ 0x22, 0x8a }, /* GROS */
+	{ OV9640_REG_TERM, OV9640_VAL_TERM }
+};
+
+static int ov9640_sensor_power_set(int power)
+{
+	unsigned char expa;
+	int err;
+
+	/* read current state of GPIO EXPA outputs */
+	err = read_gpio_expa(&expa, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error reading GPIO EXPA\n");
+		return err;
+	}
+	/* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up/down sensor */
+	if (power)
+		expa |= 0x08;
+	else
+		expa &= ~0x08;
+
+	err = write_gpio_expa(expa, 0x27);
+	if (err) {
+		printk(KERN_ERR "Error writing to GPIO EXPA\n");
+		return err;
+	}
+
+	return err;
+}
+
+static struct v4l2_ifparm ifparm = {
+	.if_type = V4L2_IF_TYPE_BT656,
+	.u = {
+		.bt656 = {
+			 .frame_start_on_rising_vs = 1,
+			 .nobt_vs_inv = 1,
+			 .mode = V4L2_IF_TYPE_BT656_MODE_NOBT_8BIT,
+			 .clock_min = OV9640_XCLK_MIN,
+			 .clock_max = OV9640_XCLK_MAX,
+		 },
+	},
+};
+
+static int ov9640_ifparm(struct v4l2_ifparm *p)
+{
+	*p = ifparm;
+
+	return 0;
+}
+
+static struct ov9640_platform_data h3_ov9640_platform_data = {
+	.power_set	= ov9640_sensor_power_set,
+	.default_regs	= ov9640_common,
+	.ifparm		= ov9640_ifparm,
+};
+#endif
+
+static struct i2c_board_info __initdata h3_i2c_board_info[] = {
+#if defined(CONFIG_VIDEO_OV9640) || defined(CONFIG_VIDEO_OV9640_MODULE)
+	{
+		I2C_BOARD_INFO("ov9640", 0x30),
+		.platform_data = &h3_ov9640_platform_data,
+	},
+#endif
+};
+
+
 static void __init h3_init(void)
 {
 	/* Here we assume the NOR boot config:  NOR on CS3 (possibly swapped
@@ -569,6 +678,9 @@ static void __init h3_init(void)
 	/* GPIO10 pullup/down register, Enable pullup on GPIO10 */
 	omap_cfg_reg(V2_1710_GPIO10);
 
+	i2c_register_board_info(1, h3_i2c_board_info,
+				ARRAY_SIZE(h3_i2c_board_info));
+
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 	spi_register_board_info(h3_spi_board_info,
 				ARRAY_SIZE(h3_spi_board_info));
-- 
1.5.3.4.206.g58ba4


[-- Attachment #3: Type: text/plain, Size: 0 bytes --]



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

* Re: [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board.
  2007-11-01 15:32       ` Eduardo Valentin
@ 2007-11-15  1:46         ` Tony Lindgren
  0 siblings, 0 replies; 13+ messages in thread
From: Tony Lindgren @ 2007-11-15  1:46 UTC (permalink / raw)
  To: Eduardo Valentin; +Cc: Eduardo Valentin, linux-omap-mailing-list

* Eduardo Valentin <edubezval@gmail.com> [071101 08:32]:
> Hi Tony,
> 
> I'm re-sending the patch. As I said, it was based on board-h4.c. But I
> totally agree with you. I believe this new one is a better way to
> implement it. Unnecessary structures and functions are not created if
> the OV9640 is not selected. I've just compiled tested this new patch.

Thanks for updating it. I'll push the whole series today.

Tony

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

end of thread, other threads:[~2007-11-15  1:46 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-09 12:52 [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Eduardo Valentin
2007-10-09 12:52 ` [PATCH 1/6] OMAP1: CAMERA: Changed omap16xxcam.c to the coding style standard Eduardo Valentin
2007-10-09 12:52   ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-09 12:52     ` [PATCH 3/6] OMAP: Update gpio expander code to the corret i2c adapter id Eduardo Valentin
2007-10-09 12:52       ` [PATCH 4/6] OMAP1: CAMERA: Convert camera_core.c to use v4l2-int-device API Eduardo Valentin
2007-10-09 12:52         ` [PATCH 5/6] OMAP1: CAMERA: Changed camera_core.c to the coding style standard Eduardo Valentin
2007-10-09 12:52           ` [PATCH 6/6] OMAP1: CAMERA: Remove unecessary files from Makefile and Kconfig Eduardo Valentin
2007-10-10 14:06     ` [PATCH 2/6] OMAP: Update ov9640 ifparm for H3 board Eduardo Valentin
2007-10-10 14:06       ` Eduardo Valentin
2007-10-31 10:41     ` Tony Lindgren
2007-11-01 15:32       ` Eduardo Valentin
2007-11-15  1:46         ` Tony Lindgren
2007-10-22  6:31 ` [RFC][PATCH 0/6] OMAP1: CAMERA: Converts omap1 camera to use v4l2-int-device api Trilok Soni

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