[PATCH 3/3] ARM: OMAP1: Camera: Removes unused files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Eduardo Valentin <eduardo.valentin@xxxxxxxxxxx>

Removing duplicated and unused files from camera driver
for omap1.

Signed-off-by: Eduardo Valentin <eduardo.valentin@xxxxxxxxxxx>
---
 drivers/media/video/omap/camera_core.c     |    1 -
 drivers/media/video/omap/h3_sensor_power.c |   63 --
 drivers/media/video/omap/h3sensorpower.h   |   17 -
 drivers/media/video/omap/h4_sensor_power.c |   76 --
 drivers/media/video/omap/h4sensorpower.h   |   17 -
 drivers/media/video/omap/ov9640.h          |  179 ----
 drivers/media/video/omap/sensor_if.h       |   50 --
 drivers/media/video/omap/sensor_ov9640.c   | 1220 ----------------------------
 8 files changed, 0 insertions(+), 1623 deletions(-)
 delete mode 100644 drivers/media/video/omap/h3_sensor_power.c
 delete mode 100644 drivers/media/video/omap/h3sensorpower.h
 delete mode 100644 drivers/media/video/omap/h4_sensor_power.c
 delete mode 100644 drivers/media/video/omap/h4sensorpower.h
 delete mode 100644 drivers/media/video/omap/ov9640.h
 delete mode 100644 drivers/media/video/omap/sensor_if.h
 delete mode 100644 drivers/media/video/omap/sensor_ov9640.c

diff --git a/drivers/media/video/omap/camera_core.c b/drivers/media/video/omap/camera_core.c
index be033be..dce47fc 100644
--- a/drivers/media/video/omap/camera_core.c
+++ b/drivers/media/video/omap/camera_core.c
@@ -31,7 +31,6 @@
 
 #include <asm/io.h>
 
-#include "sensor_if.h"
 #include "camera_hw_if.h"
 #include "camera_core.h"
 
diff --git a/drivers/media/video/omap/h3_sensor_power.c b/drivers/media/video/omap/h3_sensor_power.c
deleted file mode 100644
index ae76688..0000000
--- a/drivers/media/video/omap/h3_sensor_power.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * drivers/media/video/omap/h3_sensor_power.c
- *
- * H3 sensor powerup/down functions.
- *
- * Author: Andy Lowe (source@xxxxxxxxxx)
- *
- * Copyright (C) 2004 MontaVista Software, Inc.
- * Copyright (C) 2004 Texas Instruments.
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-
-#include <asm/arch/gpioexpander.h>
-
-int h3_sensor_powerup(void);
-int h3_sensor_powerdown(void);
-
-int
-h3_sensor_powerup(void)
-{
-	unsigned char expa;
-	int err;
-
-	/* read the current state of GPIO EXPA output */
-	if (( err = read_gpio_expa(&expa, 0x27))) {
-		printk(KERN_ERR "Error reading GPIO EXPA \n");
-		return err;
-	}
-	/* set GPIO EXPA P7 CAMERA_MOD_EN to power-up sensor */
-	if ((err = write_gpio_expa(expa | 0x80, 0x27))) {
-		printk(KERN_ERR "Error writing to GPIO EXPA \n");
-		return err;
-	}
-	return 0;
-}
-
-int
-h3_sensor_powerdown(void)
-{
-	unsigned char expa;
-	int err;
-
-	/* read the current state of GPIO EXPA output */
-	if (( err = read_gpio_expa(&expa, 0x27))) {
-		printk(KERN_ERR "Error reading GPIO EXPA \n");
-		return err;
-	}
-	/* clear GPIO EXPA P7 CAMERA_MOD_EN to power-up sensor */
-	if ((err = write_gpio_expa(expa & ~0x80, 0x27))) {
-		printk(KERN_ERR "Error writing to GPIO EXPA \n");
-		return err;
-	}
-	return 0;
-}
-
-EXPORT_SYMBOL(h3_sensor_powerup);
-EXPORT_SYMBOL(h3_sensor_powerdown);
diff --git a/drivers/media/video/omap/h3sensorpower.h b/drivers/media/video/omap/h3sensorpower.h
deleted file mode 100644
index 8587729..0000000
--- a/drivers/media/video/omap/h3sensorpower.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * drivers/media/video/omap/h3sensorpower.h
- *
- * Copyright (C) 2005 Texas Instruments.
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef H3SENSORPOWER_H
-#define H3SENSORPOWER_H
-
-int h3_sensor_powerup(void);
-int h3_sensor_powerdown(void);
-
-#endif /*H3SENSORPOWER_H*/
diff --git a/drivers/media/video/omap/h4_sensor_power.c b/drivers/media/video/omap/h4_sensor_power.c
deleted file mode 100644
index f8db956..0000000
--- a/drivers/media/video/omap/h4_sensor_power.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * drivers/media/video/omap/h4_sensor_power.c
- *
- * H4 sensor powerup/down functions.
- *
- * Author: Andy Lowe (source@xxxxxxxxxx)
- *
- * Copyright (C) 2004 MontaVista Software, Inc.
- * Copyright (C) 2004 Texas Instruments.
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#include <linux/module.h>
-#include <linux/types.h>
-
-#include <asm/arch/gpioexpander.h>
-
-int h4_sensor_powerup(void);
-int h4_sensor_powerdown(void);
-
-int
-h4_sensor_powerup(void)
-{
-	unsigned char expa;
-	int err;
-
-	/* read current state of GPIO EXPA outputs */
-	if ((err = read_gpio_expa(&expa, 0x20))) {
-		printk(KERN_ERR "Error reading GPIO EXPA\n");
-		return err;
-	}
-	/* Set GPIO EXPA P3 (CAMERA_MODULE_EN) to power-up sensor */
-	if ((err = write_gpio_expa(expa | 0x08, 0x20))) {
-		printk(KERN_ERR "Error writing to GPIO EXPA\n");
-		return err;
-	}
-
-	/* read current state of GPIO EXPA outputs */
-	if ((err = read_gpio_expa(&expa, 0x22))) {
-		printk(KERN_ERR "Error reading GPIO EXPA\n");
-		return err;
-	}
-	/* Clear GPIO EXPA P7 (CAM_RST) */
-	if ((err = write_gpio_expa(expa & ~0x80, 0x22))) {
-		printk(KERN_ERR "Error writing to GPIO EXPA\n");
-		return err;
-	}
-
-	return 0;
-}
-
-int
-h4_sensor_powerdown(void)
-{
-	unsigned char expa;
-	int err;
-
-	/* read current state of GPIO EXPA outputs */
-	if ((err = read_gpio_expa(&expa, 0x20))) {
-		printk(KERN_ERR "Error reading GPIO EXPA\n");
-		return err;
-	}
-	/* Clear GPIO EXPA P3 (CAMERA_MODULE_EN) to power-down sensor */
-	if ((err = write_gpio_expa(expa & ~0x08, 0x20))) {
-		printk(KERN_ERR "Error writing to GPIO EXPA\n");
-		return err;
-	}
-
-	return 0;
-}
-
-EXPORT_SYMBOL(h4_sensor_powerup);
-EXPORT_SYMBOL(h4_sensor_powerdown);
diff --git a/drivers/media/video/omap/h4sensorpower.h b/drivers/media/video/omap/h4sensorpower.h
deleted file mode 100644
index 4eeae11..0000000
--- a/drivers/media/video/omap/h4sensorpower.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * drivers/media/video/omap/h4sensorpower.h
- *
- * Copyright (C) 2005 Texas Instruments.
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-#ifndef H4SENSORPOWER_H
-#define H4SENSORPOWER_H
-
-int h4_sensor_powerup(void);
-int h4_sensor_powerdown(void);
-
-#endif /*H4SENSORPOWER_H*/
diff --git a/drivers/media/video/omap/ov9640.h b/drivers/media/video/omap/ov9640.h
deleted file mode 100644
index 4cdba05..0000000
--- a/drivers/media/video/omap/ov9640.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * drivers/media/video/omap/ov9640.h
- *
- * Register definitions for the OmniVision OV9640 CameraChip.
- *
- * Author: Andy Lowe (source@xxxxxxxxxx)
- *
- * Copyright (C) 2004 MontaVista Software, Inc.
- * Copyright (C) 2004 Texas Instruments.
- *
- * This file is licensed under the terms of the GNU General Public License 
- * version 2. This program is licensed "as is" without any warranty of any 
- * kind, whether express or implied.
- */
-
-#ifndef OV9640_H
-#define OV9640_H
-
-/* The OV9640 I2C sensor chip has a fixed slave address of 0x30. */
-#ifdef CONFIG_OMAP24XX_VIRTIO
-#define OV9640_I2C_ADDR		0x60
-#else
-#define OV9640_I2C_ADDR		0x30
-#endif
-
-/* define register offsets for the OV9640 sensor chip */
-#define OV9640_GAIN		0x00
-#define OV9640_BLUE		0x01
-#define OV9640_RED		0x02
-#define OV9640_VREF		0x03
-#define OV9640_COM1		0x04
-#define OV9640_BAVE		0x05
-#define OV9640_GEAVE		0x06
-#define OV9640_RAVE		0x08
-#define OV9640_COM2		0x09
-#define OV9640_PID		0x0A
-#define OV9640_VER		0x0B
-#define OV9640_COM3		0x0C
-#define OV9640_COM4		0x0D
-#define OV9640_COM5		0x0E
-#define OV9640_COM6		0x0F
-#define OV9640_AECH		0x10
-#define OV9640_CLKRC		0x11
-#define OV9640_COM7		0x12
-#define OV9640_COM8		0x13
-#define OV9640_COM9		0x14
-#define OV9640_COM10		0x15
-#define OV9640_HSTRT		0x17
-#define OV9640_HSTOP		0x18
-#define OV9640_VSTRT		0x19
-#define OV9640_VSTOP		0x1A
-#define OV9640_PSHFT		0x1B
-#define OV9640_MIDH		0x1C
-#define OV9640_MIDL		0x1D
-#define OV9640_MVFP		0x1E
-#define OV9640_LAEC		0x1F
-#define OV9640_BOS		0x20
-#define OV9640_GBOS		0x21
-#define OV9640_GROS		0x22
-#define OV9640_ROS		0x23
-#define OV9640_AEW		0x24
-#define OV9640_AEB		0x25
-#define OV9640_VPT		0x26
-#define OV9640_BBIAS		0x27
-#define OV9640_GBBIAS		0x28
-#define OV9640_EXHCH		0x2A
-#define OV9640_EXHCL		0x2B
-#define OV9640_RBIAS		0x2C
-#define OV9640_ADVFL		0x2D
-#define OV9640_ADVFH		0x2E
-#define OV9640_YAVE		0x2F
-#define OV9640_HSYST		0x30
-#define OV9640_HSYEN		0x31
-#define OV9640_HREF		0x32
-#define OV9640_CHLF		0x33
-#define OV9640_ARBLM		0x34
-#define OV9640_ADC		0x37
-#define OV9640_ACOM		0x38
-#define OV9640_OFON		0x39
-#define OV9640_TSLB		0x3A
-#define OV9640_COM11		0x3B
-#define OV9640_COM12		0x3C
-#define OV9640_COM13		0x3D
-#define OV9640_COM14		0x3E
-#define OV9640_EDGE		0x3F
-#define OV9640_COM15		0x40
-#define OV9640_COM16		0x41
-#define OV9640_COM17		0x42
-#define OV9640_MTX1		0x4F
-#define OV9640_MTX2		0x50
-#define OV9640_MTX3		0x51
-#define OV9640_MTX4		0x52
-#define OV9640_MTX5		0x53
-#define OV9640_MTX6		0x54
-#define OV9640_MTX7		0x55
-#define OV9640_MTX8		0x56
-#define OV9640_MTX9		0x57
-#define OV9640_MTXS		0x58
-#define OV9640_LCC1		0x62
-#define OV9640_LCC2		0x63
-#define OV9640_LCC3		0x64
-#define OV9640_LCC4		0x65
-#define OV9640_LCC5		0x66
-#define OV9640_MANU		0x67
-#define OV9640_MANV		0x68
-#define OV9640_HV		0x69
-#define OV9640_MBD		0x6A
-#define OV9640_DBLV		0x6B
-#define OV9640_GSP1		0x6C
-#define OV9640_GSP2		0x6D
-#define OV9640_GSP3		0x6E
-#define OV9640_GSP4		0x6F
-#define OV9640_GSP5		0x70
-#define OV9640_GSP6		0x71
-#define OV9640_GSP7		0x72
-#define OV9640_GSP8		0x73
-#define OV9640_GSP9		0x74
-#define OV9640_GSP10		0x75
-#define OV9640_GSP11		0x76
-#define OV9640_GSP12		0x77
-#define OV9640_GSP13		0x78
-#define OV9640_GSP14		0x79
-#define OV9640_GSP15		0x7A
-#define OV9640_GSP16		0x7B
-#define OV9640_GST1		0x7C
-#define OV9640_GST2		0x7D
-#define OV9640_GST3		0x7E
-#define OV9640_GST4		0x7F
-#define OV9640_GST5		0x80
-#define OV9640_GST6		0x81
-#define OV9640_GST7		0x82
-#define OV9640_GST8		0x83
-#define OV9640_GST9		0x84
-#define OV9640_GST10		0x85
-#define OV9640_GST11		0x86
-#define OV9640_GST12		0x87
-#define OV9640_GST13		0x88
-#define OV9640_GST14		0x89
-#define OV9640_GST15		0x8A
-
-#define OV9640_NUM_REGS		(OV9640_GST15 + 1)
-
-#define OV9640_PID_MAGIC	0x96	/* high byte of product ID number */
-#define OV9640_VER_REV2		0x48	/* low byte of product ID number */
-#define OV9640_VER_REV3		0x49	/* low byte of product ID number */
-#define OV9640_MIDH_MAGIC	0x7F	/* high byte of mfg ID */
-#define OV9640_MIDL_MAGIC	0xA2	/* low byte of mfg ID */
-
-/* define a structure for ov9640 register initialization values */
-struct ov9640_reg {
-	unsigned char reg;
-	unsigned char val;
-};
-
-enum image_size { QQCIF, QQVGA, QCIF, QVGA, CIF, VGA, SXGA };
-enum pixel_format { YUV, RGB565, RGB555 };
-#define NUM_IMAGE_SIZES 7
-#define NUM_PIXEL_FORMATS 3
-
-struct capture_size {
-	unsigned long width;
-	unsigned long height;
-};
-
-/* Array of image sizes supported by OV9640.  These must be ordered from 
- * smallest image size to largest.
- */
-const static struct capture_size ov9640_sizes[] = {
-	{   88,  72 },	/* QQCIF */
-	{  160, 120 },	/* QQVGA */
-	{  176, 144 },	/* QCIF */
-	{  320, 240 },	/* QVGA */
-	{  352, 288 },	/* CIF */
-	{  640, 480 },	/* VGA */
-	{ 1280, 960 },	/* SXGA */
-};
-
-#endif /* ifndef OV9640_H */
-
diff --git a/drivers/media/video/omap/sensor_if.h b/drivers/media/video/omap/sensor_if.h
deleted file mode 100644
index 47bb716..0000000
--- a/drivers/media/video/omap/sensor_if.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * drivers/media/video/omap/sensor_if.h
- *
- * Copyright (C) 2004 Texas Instruments, Inc. 
- * 
- * Sensor interface to OMAP camera capture drivers
- * Sensor driver should implement this interface
- *
- * 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. 
- */
- 
-#ifndef OMAP_SENSOR_IF_H
-#define OMAP_SENSOR_IF_H
-
-#define OMAP_SENSOR_NAME_LEN		31
-
-struct omap_camera_sensor {
-	unsigned int version;
-	char name[OMAP_SENSOR_NAME_LEN + 1];
-
-	void *(*init)(struct v4l2_pix_format *);
-	int (*cleanup)(void *);
-
-	int (*power_on)(void *);
-	int (*power_off)(void *);
-
-	int (*enum_pixformat)(struct v4l2_fmtdesc *, void *);
-	int (*try_format)(struct v4l2_pix_format *, void *);
-
-	unsigned long (*calc_xclk)(struct v4l2_pix_format *,
-				   struct v4l2_fract *, void *);
-
-	int (*configure)(struct v4l2_pix_format *, unsigned long,
-			 struct v4l2_fract *, void *);
-
-	int (*query_control) (struct v4l2_queryctrl *, void *);
-	int (*get_control)(struct v4l2_control *, void *);
-	int (*set_control)(struct v4l2_control *, void *);
-
-};
-
-extern struct omap_camera_sensor camera_sensor_if;
-
-#endif
diff --git a/drivers/media/video/omap/sensor_ov9640.c b/drivers/media/video/omap/sensor_ov9640.c
deleted file mode 100644
index 78c8250..0000000
--- a/drivers/media/video/omap/sensor_ov9640.c
+++ /dev/null
@@ -1,1220 +0,0 @@
-
-/*
- * drivers/media/video/omap/sensor_ov9640.c
- *
- * Ov9640 Sensor driver for OMAP camera sensor interface
- *
- * Author: Andy Lowe (source@xxxxxxxxxx)
- *
- * Copyright (C) 2004 MontaVista Software, Inc.
- * Copyright (C) 2004 Texas Instruments.
- *
- * This file is licensed under the terms of the GNU General Public License 
- * version 2. This program is licensed "as is" without any warranty of any 
- * kind, whether express or implied.
- */
-
-#include <linux/errno.h>
-#include <linux/i2c.h>
-#include <linux/videodev.h>
-#include <media/video-buf.h>
-#include <linux/delay.h>
-#include <asm/mach-types.h>
-#include <asm/arch/gpio.h>
-
-#include "sensor_if.h"
-#include "ov9640.h"
-#include "h3sensorpower.h"
-#include "h4sensorpower.h"
-
-
-struct ov9640_sensor {
-	/* I2C parameters */
-	struct i2c_client client;
-	int ver; /* OV9640 version */
-};
-
-static struct ov9640_sensor ov9640;
-
-/* list of image formats supported by OV9640 sensor */
-const static struct v4l2_fmtdesc ov9640_formats[] = {
-	{
-		/* Note:  V4L2 defines RGB565 as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	g2 g1 g0 r4 r3 r2 r1 r0	  b4 b3 b2 b1 b0 g5 g4 g3
-		 *
-		 * We interpret RGB565 as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	g2 g1 g0 b4 b3 b2 b1 b0	  r4 r3 r2 r1 r0 g5 g4 g3
-		 */
-		.description	= "RGB565, le",
-		.pixelformat	= V4L2_PIX_FMT_RGB565,
-	},{
-		/* Note:  V4L2 defines RGB565X as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	b4 b3 b2 b1 b0 g5 g4 g3	  g2 g1 g0 r4 r3 r2 r1 r0
-		 *
-		 * We interpret RGB565X as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	r4 r3 r2 r1 r0 g5 g4 g3	  g2 g1 g0 b4 b3 b2 b1 b0
-		 */
-		.description	= "RGB565, be",
-		.pixelformat	= V4L2_PIX_FMT_RGB565X,
-	},
-	{
-		.description	= "YUYV (YUV 4:2:2), packed",
-		.pixelformat	= V4L2_PIX_FMT_YUYV,
-	},{
-		.description	= "UYVY, packed",
-		.pixelformat	= V4L2_PIX_FMT_UYVY,
-	},
-	{
-		/* Note:  V4L2 defines RGB555 as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	g2 g1 g0 r4 r3 r2 r1 r0	  x  b4 b3 b2 b1 b0 g4 g3
-		 *
-		 * We interpret RGB555 as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	g2 g1 g0 b4 b3 b2 b1 b0	  x  r4 r3 r2 r1 r0 g4 g3
-		 */
-		.description	= "RGB555, le",
-		.pixelformat	= V4L2_PIX_FMT_RGB555,
-	},{
-		/* Note:  V4L2 defines RGB555X as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	x  b4 b3 b2 b1 b0 g4 g3	  g2 g1 g0 r4 r3 r2 r1 r0
-		 *
-		 * We interpret RGB555X as:
-		 *
-		 *	Byte 0			  Byte 1
-		 *	x  r4 r3 r2 r1 r0 g4 g3	  g2 g1 g0 b4 b3 b2 b1 b0
-		 */
-		.description	= "RGB555, be",
-		.pixelformat	= V4L2_PIX_FMT_RGB555X,
-	}
-};
-
-#define NUM_CAPTURE_FORMATS ARRAY_SIZE(ov9640_formats)
-#ifdef CONFIG_ARCH_OMAP24XX
-#define NUM_OVERLAY_FORMATS 4
-#else
-#define NUM_OVERLAY_FORMATS 2
-#endif
-
-/* register initialization tables for OV9640 */
-
-#define OV9640_REG_TERM 0xFF	/* terminating list entry for reg */
-#define OV9640_VAL_TERM 0xFF	/* terminating list entry for val */
-
-/* common OV9640 register initialization for all image sizes, pixel formats, 
- * and frame rates
- */
-const static struct ov9640_reg ov9640_common[] = {
-#ifdef CONFIG_ARCH_OMAP24XX
-	{ 0x12, 0x80 }, { 0x11, 0x80 }, { 0x13, 0x8F },	/* COM7, CLKRC, COM8 */
-	{ 0x01, 0x80 }, { 0x02, 0x80 }, { 0x04, 0x00 },	/* BLUE, RED, COM1 */
-	{ 0x0E, 0x81 }, { 0x0F, 0x4F }, { 0x14, 0x4A },	/* COM5, COM6, COM9 */
-#else
-	{ 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 */
-#endif
-	{ 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 */
-#ifdef CONFIG_ARCH_OMAP24XX
-	{ 0x8A, 0xE6 }, { 0x13, 0x8F }, { 0x00, 0x7F },	/* GST15, COM8 */
-#else
-	{ 0x8A, 0xE6 }, { 0x13, 0xaF }, { 0x15, 0x02 },	/* GST15, COM8 */
-	{ 0x22, 0x8a }, /* GROS */
-#endif
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-
-/* OV9640 register configuration for all combinations of pixel format and 
- * image size
- */
-	/* YUV (YCbCr) QQCIF */
-const static struct ov9640_reg qqcif_yuv[] = {
-	{ 0x12, 0x08 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x24 }, { 0x0C, 0x00 }, { 0x0D, 0x40 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* YUV (YCbCr) QQVGA */
-const static struct ov9640_reg qqvga_yuv[] = {
-	{ 0x12, 0x10 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x24 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* YUV (YCbCr) QCIF */
-const static struct ov9640_reg qcif_yuv[] = {
-	{ 0x12, 0x08 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* YUV (YCbCr) QVGA */
-const static struct ov9640_reg qvga_yuv[] = {
-	{ 0x12, 0x10 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* YUV (YCbCr) CIF */
-const static struct ov9640_reg cif_yuv[] = {
-	{ 0x12, 0x20 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* YUV (YCbCr) VGA */
-const static struct ov9640_reg vga_yuv[] = {
-	{ 0x12, 0x40 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* YUV (YCbCr) SXGA */
-const static struct ov9640_reg sxga_yuv[] = {
-	{ 0x12, 0x00 }, { 0x3C, 0x46 }, { 0x40, 0xC0 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x00 }, { 0x0D, 0x40 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x50 }, { 0x50, 0x43 }, { 0x51, 0x0D },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x19 }, { 0x53, 0x4C }, { 0x54, 0x65 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x40 }, { 0x56, 0x40 }, { 0x57, 0x40 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x0F }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 QQCIF */
-const static struct ov9640_reg qqcif_565[] = {
-	{ 0x12, 0x0C }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x24 }, { 0x0C, 0x00 }, { 0x0D, 0x40 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 QQVGA */
-const static struct ov9640_reg qqvga_565[] = {
-	{ 0x12, 0x14 }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x24 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 QCIF */
-const static struct ov9640_reg qcif_565[] = {
-	{ 0x12, 0x0C }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 QVGA */
-const static struct ov9640_reg qvga_565[] = {
-	{ 0x12, 0x14 }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 CIF */
-const static struct ov9640_reg cif_565[] = {
-	{ 0x12, 0x24 }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 VGA */
-const static struct ov9640_reg vga_565[] = {
-	{ 0x12, 0x44 }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB565 SXGA */
-const static struct ov9640_reg sxga_565[] = {
-	{ 0x12, 0x04 }, { 0x3C, 0x40 }, { 0x40, 0x10 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x00 }, { 0x0D, 0x40 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 QQCIF */
-const static struct ov9640_reg qqcif_555[] = {
-	{ 0x12, 0x0C }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x24 }, { 0x0C, 0x00 }, { 0x0D, 0x40 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 QQVGA */
-const static struct ov9640_reg qqvga_555[] = {
-	{ 0x12, 0x14 }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x24 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 QCIF */
-const static struct ov9640_reg qcif_555[] = {
-	{ 0x12, 0x0C }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 QVGA */
-const static struct ov9640_reg qvga_555[] = {
-	{ 0x12, 0x14 }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 CIF */
-const static struct ov9640_reg cif_555[] = {
-	{ 0x12, 0x24 }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 VGA */
-const static struct ov9640_reg vga_555[] = {
-	{ 0x12, 0x44 }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x04 }, { 0x0D, 0xC0 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-	/* RGB555 SXGA */
-const static struct ov9640_reg sxga_555[] = {
-	{ 0x12, 0x04 }, { 0x3C, 0x40 }, { 0x40, 0x30 },	/* COM7, COM12, COM15 */
-	{ 0x04, 0x00 }, { 0x0C, 0x00 }, { 0x0D, 0x40 },	/* COM1, COM3, COM4 */
-	{ 0x4F, 0x71 }, { 0x50, 0x3E }, { 0x51, 0x0C },	/* MTX1, MTX2, MTX3 */
-	{ 0x52, 0x33 }, { 0x53, 0x72 }, { 0x54, 0x00 },	/* MTX4, MTX5, MTX6 */
-	{ 0x55, 0x2B }, { 0x56, 0x66 }, { 0x57, 0xD2 },	/* MTX7, MTX8, MTX9 */
-	{ 0x58, 0x65 }, 				/* MTXS */
-	{ OV9640_REG_TERM, OV9640_VAL_TERM }
-};
-
- 
-#define DEF_GAIN         31
-#define DEF_AUTOGAIN      1
-#define DEF_EXPOSURE    154
-#define DEF_AEC           1
-#define DEF_FREEZE_AGCAEC 0
-#define DEF_BLUE        153
-#define DEF_RED         (255 - DEF_BLUE)
-#define DEF_AWB           1
-#define DEF_HFLIP         0
-#define DEF_VFLIP         0
-
-/* Our own specific controls */
-#define V4L2_CID_FREEZE_AGCAEC V4L2_CID_PRIVATE_BASE+0
-#define V4L2_CID_AUTOEXPOSURE V4L2_CID_PRIVATE_BASE+1
-#define V4L2_CID_LAST_PRIV  V4L2_CID_AUTOEXPOSURE
-
-/*  Video controls  */
-static struct vcontrol {
-        struct v4l2_queryctrl qc;
-        int current_value;
-        u8 reg;
-        u8 mask;
-        u8 start_bit;
-} control[] = {
-        { { V4L2_CID_GAIN, V4L2_CTRL_TYPE_INTEGER, "Gain", 0, 63, 1,
-            DEF_GAIN },
-          0, OV9640_GAIN, 0x3f, 0 },
-        { { V4L2_CID_AUTOGAIN, V4L2_CTRL_TYPE_BOOLEAN, "Auto Gain", 0, 1, 0,
-            DEF_AUTOGAIN },
-          0, OV9640_COM8, 0x04, 2 },
-        { { V4L2_CID_EXPOSURE, V4L2_CTRL_TYPE_INTEGER, "Exposure", 0, 255, 1,
-            DEF_EXPOSURE },
-          0, OV9640_AECH, 0xff, 0 },
-        { { V4L2_CID_AUTOEXPOSURE, V4L2_CTRL_TYPE_BOOLEAN, "Auto Exposure", 0, 1, 0,
-            DEF_AEC },
-          0, OV9640_COM8, 0x01, 0 },
-        { { V4L2_CID_FREEZE_AGCAEC, V4L2_CTRL_TYPE_BOOLEAN, "Freeze AGC/AEC", 0,1,0,
-            DEF_FREEZE_AGCAEC },
-          0, OV9640_COM9, 0x01, 0 },
-        { { V4L2_CID_RED_BALANCE, V4L2_CTRL_TYPE_INTEGER, "Red Balance", 0, 255, 1,
-            DEF_RED },
-          0, OV9640_RED, 0xff, 0 },
-        { { V4L2_CID_BLUE_BALANCE, V4L2_CTRL_TYPE_INTEGER, "Blue Balance", 0, 255, 1,
-            DEF_BLUE },
-          0, OV9640_BLUE, 0xff, 0 },
-        { { V4L2_CID_AUTO_WHITE_BALANCE, V4L2_CTRL_TYPE_BOOLEAN, "Auto White Balance", 0,1,0,
-            DEF_AWB },
-          0, OV9640_COM8, 0x02, 1 },
-        { { V4L2_CID_HFLIP, V4L2_CTRL_TYPE_BOOLEAN, "Mirror Image", 0, 1, 0,
-            DEF_HFLIP },
-          0, OV9640_MVFP, 0x20, 5 },
-        { { V4L2_CID_VFLIP, V4L2_CTRL_TYPE_BOOLEAN, "Vertical Flip", 0, 1, 0,
-            DEF_VFLIP },
-          0, OV9640_MVFP, 0x10, 4 },
-};
-
-#define NUM_CONTROLS ARRAY_SIZE(control)
-
-const static struct ov9640_reg *
-	ov9640_reg_init[NUM_PIXEL_FORMATS][NUM_IMAGE_SIZES] =
-{
- { qqcif_yuv, qqvga_yuv, qcif_yuv, qvga_yuv, cif_yuv, vga_yuv, sxga_yuv },
- { qqcif_565, qqvga_565, qcif_565, qvga_565, cif_565, vga_565, sxga_565 },
- { qqcif_555, qqvga_555, qcif_555, qvga_555, cif_555, vga_555, sxga_555 },
-};
-
-
-/* 
- * Read a value from a register in an OV9640 sensor device.  The value is 
- * returned in 'val'.
- * Returns zero if successful, or non-zero otherwise.
- */
-static int 
-ov9640_read_reg(struct i2c_client *client, u8 reg, u8 *val)
-{
-	int err;
-	struct i2c_msg msg[1];
-	unsigned char data[1];
-
-	if (!client->adapter)
-		return -ENODEV;
-
-	msg->addr = client->addr;
-	msg->flags = 0;
-	msg->len = 1;
-	msg->buf = data;
-	*data = reg;
-	err = i2c_transfer(client->adapter, msg, 1);
-	if (err >= 0) {
-		msg->flags = I2C_M_RD;
-		err = i2c_transfer(client->adapter, msg, 1);
-	}
-	if (err >= 0) {
-		*val = *data;
-		return 0;
-	}
-	return err;
-}
-
-/* Write a value to a register in an OV9640 sensor device.
- * Returns zero if successful, or non-zero otherwise.
- */
-static int 
-ov9640_write_reg(struct i2c_client *client, u8 reg, u8 val)
-{
-	int err;
-	struct i2c_msg msg[1];
-	unsigned char data[2];
-
-	if (!client->adapter)
-		return -ENODEV;
-	
-	msg->addr = client->addr;
-	msg->flags = 0;
-	msg->len = 2;
-	msg->buf = data;
-	data[0] = reg;
-	data[1] = val;
-	err = i2c_transfer(client->adapter, msg, 1);
-	if (err >= 0)
-		return 0;
-	return err;
-}
-
-static int 
-ov9640_write_reg_mask(struct i2c_client *client, u8 reg, u8 *val, u8 mask)
-{
-	u8 oldval, newval;
-	int rc;
-
-	if (mask == 0xff)
-		newval = *val;
-	else {
-		/* need to do read - modify - write */
-		if ((rc = ov9640_read_reg(client, reg, &oldval)))
-			return rc;
-		oldval &= (~mask);              /* Clear the masked bits */
-		*val &= mask;                  /* Enforce mask on value */
-		newval = oldval | *val;        /* Set the desired bits */
-	}
-
-	/* write the new value to the register */
-	if ((rc = ov9640_write_reg(client, reg, newval)))
-		return rc;
-
-	if ((rc = ov9640_read_reg(client, reg, &newval)))
-		return rc;
-
-	*val = newval & mask;
-	return 0;
-}
-
-static int 
-ov9640_read_reg_mask(struct i2c_client *client, u8 reg, u8 *val, u8 mask)
-{
-	int rc;
-
-	if ((rc = ov9640_read_reg(client, reg, val)))
-		return rc;
-	(*val) &= mask;
-
-	return 0;
-}
-
-/* Initialize a list of OV9640 registers.
- * The list of registers is terminated by the pair of values 
- * { OV9640_REG_TERM, OV9640_VAL_TERM }.
- * Returns zero if successful, or non-zero otherwise.
- */
-static int 
-ov9640_write_regs(struct i2c_client *client, const struct ov9640_reg reglist[])
-{
-	int err;
-	const struct ov9640_reg *next = reglist;
-	
-	while (!((next->reg == OV9640_REG_TERM) 
-		&& (next->val == OV9640_VAL_TERM)))
-	{
-		err = ov9640_write_reg(client, next->reg, next->val);
-		udelay(100);
-		if (err)
-			return err;
-		next++;
-	}
-	return 0;
-}
-
-/* Returns the index of the requested ID from the control structure array */
-static int
-find_vctrl(int id)
-{
-	int i;
-
-	if (id < V4L2_CID_BASE)
-		return -EDOM;
-
-	for (i = NUM_CONTROLS - 1; i >= 0; i--)
-		if (control[i].qc.id == id)
-			break;
-	if (i < 0)
-		i = -EINVAL;
-	return i;
-}
-
-/* Calculate the internal clock divisor (value of the CLKRC register) of the 
- * OV9640 given the image size, the frequency (in Hz) of its XCLK input and a 
- * desired frame period (in seconds).  The frame period 'fper' is expressed as 
- * a fraction.  The frame period is an input/output parameter.
- * Returns the value of the OV9640 CLKRC register that will yield the frame 
- * period returned in 'fper' at the specified xclk frequency.  The 
- * returned period will be as close to the requested period as possible.
- */
-static unsigned char
-ov9640_clkrc(enum image_size isize, unsigned long xclk, struct v4l2_fract *fper)
-{
-	unsigned long fpm, fpm_max;	/* frames per minute */
-	unsigned long divisor;
-	const unsigned long divisor_max = 64;
-#ifdef CONFIG_ARCH_OMAP24XX
-	const static unsigned long clks_per_frame[] =
-		{ 200000, 400000, 200000, 400000, 400000, 800000, 3200000 };
-      /*         QQCIF   QQVGA    QCIF    QVGA  CIF     VGA   	SXGA
-       *         199680,400000, 199680, 400000, 399360, 800000, 3200000
-       */
-#else
-	const static unsigned long clks_per_frame[] = 
-		{ 200000, 200000, 200000, 200000, 400000, 800000, 3200000 };
-#endif
-
-	if (fper->numerator > 0)
-		fpm = (fper->denominator*60)/fper->numerator;
-	else
-		fpm = 0xffffffff;
-	fpm_max = (xclk*60)/clks_per_frame[isize];
-	if (fpm_max == 0)
-		fpm_max = 1;
-	if (fpm > fpm_max)
-		fpm = fpm_max;
-	if (fpm == 0)
-		fpm = 1;
-	divisor = fpm_max/fpm;
-	if (divisor > divisor_max)
-		divisor = divisor_max;
-	fper->numerator = divisor*60;
-	fper->denominator = fpm_max;
-
-	/* try to reduce the fraction */
-	while (!(fper->denominator % 5) && !(fper->numerator % 5)) {
-		fper->numerator /= 5;
-		fper->denominator /= 5;
-	}
-	while (!(fper->denominator % 3) && !(fper->numerator % 3)) {
-		fper->numerator /= 3;
-		fper->denominator /= 3;
-	}
-	while (!(fper->denominator % 2) && !(fper->numerator % 2)) {
-		fper->numerator /= 2;
-		fper->denominator /= 2;
-	}
-	if (fper->numerator < fper->denominator) {
-		if (!(fper->denominator % fper->numerator)) {
-			fper->denominator /= fper->numerator;
-			fper->numerator = 1;
-		}
-	}
-	else {
-		if (!(fper->numerator % fper->denominator)) {
-			fper->numerator /= fper->denominator;
-			fper->denominator = 1;
-		}
-	}
-
-	/* we set bit 7 in CLKRC to enable the digital PLL */
-	return (0x80 | (divisor - 1));
-}
-
-/* Configure the OV9640 for a specified image size, pixel format, and frame 
- * period.  xclk is the frequency (in Hz) of the xclk input to the OV9640.  
- * fper is the frame period (in seconds) expressed as a fraction.
- * Returns zero if successful, or non-zero otherwise.
- * The actual frame period is returned in fper.
- */
-static int
-ov9640_configure(struct i2c_client *client, 
-	enum image_size isize, 
-	enum pixel_format pfmt,
-	unsigned long xclk,
-	struct v4l2_fract *fper)
-{
-	int err;
-	unsigned char clkrc;
-
-	/* common register initialization */
-	err = ov9640_write_regs(client, ov9640_common);
-	if (err)
-		return err;
-
-	/* configure image size and pixel format */
-	err = ov9640_write_regs(client, ov9640_reg_init[pfmt][isize]);
-	if (err)
-		return err;
-
-	/* configure frame rate */
-	clkrc = ov9640_clkrc(isize, xclk, fper);
-	err = ov9640_write_reg(client, OV9640_CLKRC, clkrc);
-	if (err)
-		return err;
-
-	return 0;
-}
-
-static int
-ov9640_powerup(void)
-{
-	int err;
-
-	if (machine_is_omap_h2())
-		return 0;
-
-#ifdef	CONFIG_OMAP_OSK_MISTRAL
-	if (machine_is_omap_osk())
-		omap_set_gpio_dataout(11, 1);
-#endif
-
-	if (machine_is_omap_h3()) {
-		err = h3_sensor_powerup();
-		if (err)
-			return err;
-	}
-
-	if (machine_is_omap_h4()) {
-		err = h4_sensor_powerup();
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
-static int
-ov9640_powerdown(void)
-{
-	int err;
-
-	if (machine_is_omap_h2())
-		return 0;
-
-#ifdef	CONFIG_OMAP_OSK_MISTRAL
-	if (machine_is_omap_osk())
-		omap_set_gpio_dataout(11, 0);
-#endif
-
-	if (machine_is_omap_h3()) {
-		err = h3_sensor_powerdown();
-		if (err)
-			return err;
-	}
-
-	if (machine_is_omap_h4()) {
-		err = h4_sensor_powerdown();
-		if (err)
-			return err;
-	}
-
-	return 0;
-}
-
-static int
-ov9640sensor_power_on(void *priv)
-{
-	return ov9640_powerup();
-}
-
-static int
-ov9640sensor_power_off(void *priv)
-{
-	return ov9640_powerdown();
-}
-
-/* Detect if an OV9640 is present, and if so which revision. 
- * A device is considered to be detected if the manufacturer ID (MIDH and MIDL) 
- * and the product ID (PID) registers match the expected values.  
- * Any value of the version ID (VER) register is accepted.
- * Here are the version numbers we know about:
- *	0x48 --> OV9640 Revision 1 or OV9640 Revision 2
- *	0x49 --> OV9640 Revision 3
- * Returns a negative error number if no device is detected, or the 
- * non-negative value of the version ID register if a device is detected.
- */
-static int
-ov9640_detect(struct i2c_client *client)
-{
-	u8 midh, midl, pid, ver;
-
-	if (!client)
-		return -ENODEV;
- 
-	if (ov9640_read_reg(client, OV9640_MIDH, &midh))
-		return -ENODEV;
-	if (ov9640_read_reg(client, OV9640_MIDL, &midl))
-		return -ENODEV;
-	if (ov9640_read_reg(client, OV9640_PID, &pid))
-		return -ENODEV;
-	if (ov9640_read_reg(client, OV9640_VER, &ver))
-		return -ENODEV;
-
-	if ((midh != OV9640_MIDH_MAGIC) 
-		|| (midl != OV9640_MIDL_MAGIC)
-		|| (pid != OV9640_PID_MAGIC))
-	{
-		/* We didn't read the values we expected, so 
-		 * this must not be an OV9640.
-		 */
-		return -ENODEV;
-	}
-	return ver;
-}
-
-static struct i2c_driver ov9640sensor_i2c_driver;
-
-/* This function registers an I2C client via i2c_attach_client() for an OV9640 
- * sensor device.  If 'probe' is non-zero, then the I2C client is only 
- * registered if the device can be detected.  If 'probe' is zero, then no 
- * device detection is attempted and the I2C client is always registered.
- * Returns zero if an I2C client is successfully registered, or non-zero 
- * otherwise.
- */
-static int 
-ov9640_i2c_attach_client(struct i2c_adapter *adap, int addr, int probe)
-{
-	struct ov9640_sensor *sensor = &ov9640;
-	struct i2c_client *client = &sensor->client;
-	int err;
-
-	if (client->adapter)
-		return -EBUSY;	/* our client is already attached */
-
-	client->addr = addr;
-	client->driver = &ov9640sensor_i2c_driver;
-	client->adapter = adap;
-	strcpy(client->name, ov9640sensor_i2c_driver.driver.name);
-
-	err = i2c_attach_client(client);
-	if (err) {
-		client->adapter = NULL;
-		return err;
-	}
-
-	if (probe) {
-		err = ov9640_detect(client);
-		if (err < 0) {
-			i2c_detach_client(client);
-			client->adapter = NULL;
-			return err;
-		}
-		sensor->ver = err;
-	}
-	return 0;
-}
-
-/* This function is called by i2c_del_adapter() and i2c_del_driver() 
- * if the adapter or driver with which this I2C client is associated is 
- * removed.  This function unregisters the client via i2c_detach_client().
- * Returns zero if the client is successfully detached, or non-zero 
- * otherwise.
- */
-static int 
-ov9640_i2c_detach_client(struct i2c_client *client)
-{
-	int err;
-
-	if (!client->adapter)
-		return -ENODEV;	/* our client isn't attached */
-
-	err = i2c_detach_client(client);
-	client->adapter = NULL;
-
-	return err;
-}
-
-/* This function will be called for each registered I2C bus adapter when our 
- * I2C driver is registered via i2c_add_driver().  It will also be called 
- * whenever a new I2C adapter is registered after our I2C driver is registered.
- * This function probes the specified I2C bus adapter to determine if an 
- * OV9640 sensor device is present.  If a device is detected, an I2C client 
- * is registered for it via ov9640_i2c_attach_client().  Note that we can't use 
- * the standard i2c_probe() function to look for the sensor because the OMAP 
- * I2C controller doesn't support probing.
- * Returns zero if an OV9640 device is detected and an I2C client successfully 
- * registered for it, or non-zero otherwise.
- */
-static int 
-ov9640_i2c_probe_adapter(struct i2c_adapter *adap)
-{
-	return ov9640_i2c_attach_client(adap, OV9640_I2C_ADDR, 1);
-}
-
-/* Find the best match for a requested image capture size.  The best match 
- * is chosen as the nearest match that has the same number or fewer pixels 
- * as the requested size, or the smallest image size if the requested size 
- * has fewer pixels than the smallest image.
- */
-static enum image_size
-ov9640_find_size(unsigned int width, unsigned int height)
-{
-	enum image_size isize;
-	unsigned long pixels = width*height;
-
-	for (isize = QQCIF; isize < SXGA; isize++) {
-		if (ov9640_sizes[isize + 1].height*
-			ov9640_sizes[isize + 1].width > pixels)
-		{
-			return isize;
-		}
-	}
-	return SXGA;
-}
-
-/* following are sensor interface functions implemented by 
- * OV9640 sensor driver.
- */
-static int
-ov9640sensor_query_control(struct v4l2_queryctrl *qc, void *priv)
-{
-	int i;
-
-	i = find_vctrl (qc->id);
-	if (i == -EINVAL) {
-		qc->flags = V4L2_CTRL_FLAG_DISABLED;
-		return 0;
-	}
-	if (i < 0)
-		return -EINVAL;
-
-	*qc = control[i].qc;
-	return 0;
-}
-
-static int
-ov9640sensor_get_control(struct v4l2_control *vc, void *priv)
-{
-	struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
-	struct i2c_client *client = &sensor->client;
-	int i, val;
-	struct vcontrol * lvc;
-	
-	i = find_vctrl(vc->id);
-	if (i < 0)
-		return -EINVAL;
-
-	lvc = &control[i];	
-	if (ov9640_read_reg_mask(client, lvc->reg, (u8 *)&val, lvc->mask))
-		return -EIO;
-		
-	val = val >> lvc->start_bit;	
-	if (val >= 0) {
-		vc->value = lvc->current_value = val;
-		return 0;
-	} else
-		return val;
-}
-
-static int
-ov9640sensor_set_control(struct v4l2_control *vc, void *priv)
-{
-	struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
-	struct i2c_client *client = &sensor->client;
-	struct vcontrol *lvc;
-	int val = vc->value;
-	int i;
-
-	i = find_vctrl(vc->id);
-	if (i < 0)
-		return -EINVAL;
-
-	lvc = &control[i];
-	val = val << lvc->start_bit;
-	if (ov9640_write_reg_mask(client, lvc->reg, (u8 *)&val, (u8)lvc->mask))
-		return -EIO;
-
-	val = val>> lvc->start_bit;
-	if (val >= 0) {
-		lvc->current_value = val;
-		return 0;
-	} else
-		return val;
-}
-
-/* Implement the VIDIOC_ENUM_FMT ioctl for the CAPTURE buffer type.
- */
-static int
-ov9640sensor_enum_pixformat(struct v4l2_fmtdesc *fmt, void *priv)
-{
-	int index = fmt->index;
-	enum v4l2_buf_type type = fmt->type;
-
-	memset(fmt, 0, sizeof(*fmt));
-	fmt->index = index;
-	fmt->type = type;
-
-	switch (fmt->type) {
-		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
-		if (index >= NUM_CAPTURE_FORMATS)
-			return -EINVAL;
-		break;
-
-		case V4L2_BUF_TYPE_VIDEO_OVERLAY:
-		if (index >= NUM_OVERLAY_FORMATS)
-			return -EINVAL;
-		break;
-
-		default:
-			return -EINVAL;
-	}
-
-	fmt->flags = ov9640_formats[index].flags;
-	strlcpy(fmt->description, ov9640_formats[index].description, sizeof(fmt->description));
-	fmt->pixelformat = ov9640_formats[index].pixelformat;
-
-	return 0;
-}
-
-/* Implement the VIDIOC_TRY_FMT ioctl for the CAPTURE buffer type.  This 
- * ioctl is used to negotiate the image capture size and pixel format 
- * without actually making it take effect.
- */
-static int
-ov9640sensor_try_format(struct v4l2_pix_format *pix, void *priv)
-{
-	enum image_size isize;
-	int ifmt;
-
-	isize = ov9640_find_size(pix->width, pix->height);
-	pix->width = ov9640_sizes[isize].width;
-	pix->height = ov9640_sizes[isize].height;
-	for (ifmt = 0; ifmt < NUM_CAPTURE_FORMATS; ifmt++) {
-		if (pix->pixelformat == ov9640_formats[ifmt].pixelformat)
-			break;
-	}
-	if (ifmt == NUM_CAPTURE_FORMATS)
-		ifmt = 0;
-	pix->pixelformat = ov9640_formats[ifmt].pixelformat;
-	pix->field = V4L2_FIELD_NONE;
-	pix->bytesperline = pix->width*2;
-	pix->sizeimage = pix->bytesperline*pix->height;
-	pix->priv = 0;
-	switch (pix->pixelformat) {
-		case V4L2_PIX_FMT_YUYV:
-		case V4L2_PIX_FMT_UYVY:
-		default:
-			pix->colorspace = V4L2_COLORSPACE_JPEG;
-			break;
-		case V4L2_PIX_FMT_RGB565:
-		case V4L2_PIX_FMT_RGB565X:
-		case V4L2_PIX_FMT_RGB555:
-		case V4L2_PIX_FMT_RGB555X:
-			pix->colorspace = V4L2_COLORSPACE_SRGB;
-			break;
-	}
-	return 0;
-}
-
-/* Given the image capture format in pix, the nominal frame period in 
- * timeperframe, calculate the required xclk frequency 
- * The nominal xclk input frequency of the OV9640 is 24MHz, maximum 
- * frequency is 48MHz, and minimum frequency is 10MHz.
- */
-static unsigned long
-ov9640sensor_calc_xclk(struct v4l2_pix_format *pix,
-			struct v4l2_fract *timeperframe, void *priv)
-{
-	unsigned long tgt_xclk;			/* target xclk */
-	unsigned long tgt_fpm;			/* target frames per minute */
- 	enum image_size isize;
-
-	/* We use arbitrary rules to select the xclk frequency.  If the 
-	 * capture size is VGA and the frame rate is greater than 900 
-	 * frames per minute, or if the capture size is SXGA and the 
-	 * frame rate is greater than 450 frames per minutes, then the 
-	 * xclk frequency will be set to 48MHz.  Otherwise, the xclk 
-	 * frequency will be set to 24MHz.  If the mclk frequency is such that 
-	 * the target xclk frequency is not achievable, then xclk will be set 
-	 * as close as to the target as possible.
-	 */
-	if ((timeperframe->numerator == 0) 
-		|| (timeperframe->denominator == 0))
-	{
-		/* supply a default nominal_timeperframe of 15 fps */
-		timeperframe->numerator = 1;
-		timeperframe->denominator = 15;
-	}
-	tgt_fpm = (timeperframe->denominator*60)
-		/ timeperframe->numerator;
-	tgt_xclk = 24000000;
-	isize = ov9640_find_size(pix->width, pix->height);
-	switch (isize) {
-		case SXGA:
-			if (tgt_fpm > 450)
-				tgt_xclk = 48000000;
-			break;
-		case VGA:
-			if (tgt_fpm > 900)
-				tgt_xclk = 48000000;
-			break;
-		default:
-			break;
-	}
-	return tgt_xclk;
-}
-
-/* Given a capture format in pix, the frame period in timeperframe, and
- * the xclk frequency, set the capture format of the OV9640 sensor.
- * The actual frame period will be returned in timeperframe.
- */
-static int
-ov9640sensor_configure(struct v4l2_pix_format *pix, unsigned long xclk,
-			struct v4l2_fract *timeperframe, void *priv)
-{
-	struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
-  	enum pixel_format pfmt = YUV;
-
-	switch (pix->pixelformat) {
-		case V4L2_PIX_FMT_RGB565:
-		case V4L2_PIX_FMT_RGB565X:
-			pfmt = RGB565;
-			break;
-		case V4L2_PIX_FMT_RGB555:
-		case V4L2_PIX_FMT_RGB555X:
-			pfmt = RGB555;
-			break;
-		case V4L2_PIX_FMT_YUYV:
-		case V4L2_PIX_FMT_UYVY:
-		default:
-			pfmt = YUV;
- 	}
-
-	return ov9640_configure(&sensor->client,
-				ov9640_find_size(pix->width, pix->height),
-				pfmt, xclk, timeperframe);
-}
-
-/* Prepare for the driver to exit.
- * Balances ov9640sensor_init().
- * This function must de-initialize the sensor and its associated data 
- * structures.
- */
-static int
-ov9640sensor_cleanup(void *priv)
-{
-	struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
-
-	if (sensor) {
-		i2c_del_driver(&ov9640sensor_i2c_driver);
-		ov9640_powerdown();
- 	}
-	return 0;
-}
-
-
-static struct i2c_driver ov9640sensor_i2c_driver = {
-	.driver = {
-		.name		= "ov9640",
-	},
-	.id		= I2C_DRIVERID_MISC, /*FIXME:accroding to i2c-ids.h */
-	.attach_adapter	= ov9640_i2c_probe_adapter,
-	.detach_client	= ov9640_i2c_detach_client,
-};
-
-
-/* Initialize the OV9640 sensor.
- * This routine allocates and initializes the data structure for the sensor, 
- * powers up the sensor, registers the I2C driver, and sets a default image 
- * capture format in pix.  The capture format is not actually programmed 
- * into the OV9640 sensor by this routine.
- * This function must return a non-NULL value to indicate that 
- * initialization is successful.
- */
-static void *
-ov9640sensor_init(struct v4l2_pix_format *pix)
-{
-	struct ov9640_sensor *sensor = &ov9640;
- 	int err;
-
-	memset(sensor, 0, sizeof(*sensor));
- 
-	/* power-up the sensor */
-	if (ov9640_powerup())
-		return NULL;
-
-	err = i2c_add_driver(&ov9640sensor_i2c_driver);
-	if (err) {
-		printk(KERN_ERR "Failed to register OV9640 I2C client.\n");
-		return NULL;
-	}
-	if (!sensor->client.adapter) {
-		printk(KERN_WARNING 
-			"Failed to detect OV9640 sensor chip.\n");
-		return NULL;
-	}
-	else
-		printk(KERN_INFO 
-			"OV9640 sensor chip version 0x%02x detected\n", sensor->ver);
-
-	/* Make the default capture format QCIF RGB565 */
-	pix->width = ov9640_sizes[QCIF].width;
-	pix->height = ov9640_sizes[QCIF].height;
-	pix->pixelformat = V4L2_PIX_FMT_RGB565;
-	ov9640sensor_try_format(pix, NULL);
-
-	return (void *)sensor;
-}
-
-struct omap_camera_sensor camera_sensor_if = {
-	.version	= 0x01,
-	.name		= "OV9640",
-	.init		= ov9640sensor_init,
-	.cleanup	= ov9640sensor_cleanup,
-	.enum_pixformat = ov9640sensor_enum_pixformat,
-	.try_format	= ov9640sensor_try_format,
-	.calc_xclk	= ov9640sensor_calc_xclk,
-	.configure	= ov9640sensor_configure,
-	.query_control	= ov9640sensor_query_control,
-	.get_control	= ov9640sensor_get_control,
-	.set_control	= ov9640sensor_set_control,
-	.power_on	= ov9640sensor_power_on,
-	.power_off	= ov9640sensor_power_off,
-};
-EXPORT_SYMBOL_GPL(camera_sensor_if);
-
-MODULE_LICENSE("GPL");
-
-#if 0
-void print_ov9640_regs(void *priv)
-{
-	struct ov9640_sensor *sensor = (struct ov9640_sensor *) priv;
-	u8 reg, val;
-	for (reg=0x00; reg <=0x8A; reg++)
-		if (ov9640_read_reg(&sensor->client,reg,&val))
-			printk("error reading %x\n", reg);
-		else
-			printk("reg %x = %x\n", reg, val);	 
-}
-#endif
-- 
1.5.3.4.206.g58ba4

-
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux