[RFC v1] mt9v113: VGA camera sensor driver and support for BeagleBoard

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

 



* Adds support for mt9v113 sensor by borrowing heavily from PSP 2.6.37 kernel patches
* Adapted to changes in v4l2 framework and ISP driver

Signed-off-by: Joel A Fernandes <agnel.joel@xxxxxxxxx>
---
This patch will apply against the 2.6.39 kernel built from the OE-development tree (Which is essentially
the v2.6.39 from the main tree with OE patches for BeagleBoard support and a few other features)

If you have the Leapord imaging camera board with this particular sensor, I would apprecite it if anyone could
try this patch out and provide any feedback/test results.

To get the complete tree which works on a BeagleBoard-xM with all the OE patches and this patch,
you can clone: https://github.com/joelagnel/linux-omap-2.6/tree/oedev-2.6.39-mt9v113

It will compile and work on a BeagleBoard-xM with the defconfig at:
http://cgit.openembedded.org/cgit.cgi/openembedded/tree/recipes/linux/linux-omap-2.6.39/beagleboard/defconfig

Also you will need to apply my media-ctl patch (or clone the tree) to setup the formats:
https://github.com/joelagnel/media-ctl/commit/cdf24d1249ac1ff3cd6f70ad80c3b76ac28ba0d5

Binaries for quick testing on a BeagleBoard-xM:
U-boot: http://utdallas.edu/~joel.fernandes/u-boot.bin
U-boot: http://utdallas.edu/~joel.fernandes/MLO
uEnv.txt: http://utdallas.edu/~joel.fernandes/uEnv.txt
media-ctl: http://utdallas.edu/~joel.fernandes/media-ctl
kernel: http://utdallas.edu/~joel.fernandes/uImage

media-ctl/yavta commands you could use to get it to show a picture can be found at:
http://utdallas.edu/~joel.fernandes/stream.sh

Note:
The BeagleBoard camera board file in this patch replaces the old one, so this will take away support for the 5M
sensor (mt9p031), I hope this can be forgiven considering this is an RFC :). I am working on a common board file
that will work for both sensors.

 arch/arm/mach-omap2/board-omap3beagle-camera.c |  218 ++++--
 drivers/media/video/Kconfig                    |    7 +
 drivers/media/video/Makefile                   |    1 +
 drivers/media/video/mt9v113.c                  | 1027 ++++++++++++++++++++++++
 drivers/media/video/mt9v113_regs.h             |  294 +++++++
 drivers/media/video/omap3isp/ispccdc.c         |   10 +-
 drivers/media/video/omap3isp/ispvideo.c        |    7 +-
 include/media/mt9v113.h                        |   70 ++
 include/media/v4l2-chip-ident.h                |    1 +
 9 files changed, 1577 insertions(+), 58 deletions(-)
 create mode 100644 drivers/media/video/mt9v113.c
 create mode 100644 drivers/media/video/mt9v113_regs.h
 create mode 100644 include/media/mt9v113.h

diff --git a/arch/arm/mach-omap2/board-omap3beagle-camera.c b/arch/arm/mach-omap2/board-omap3beagle-camera.c
index 2632557..3d3ae53 100644
--- a/arch/arm/mach-omap2/board-omap3beagle-camera.c
+++ b/arch/arm/mach-omap2/board-omap3beagle-camera.c
@@ -1,95 +1,203 @@
-#include <linux/gpio.h>
-#include <linux/regulator/machine.h>
+/*
+ * BeagleXM: Driver for Leopard Module Board
+ *
+ * Copyright (C) 2011 Texas Instruments Inc
+ * Author: Vaibhav Hiremath <hvaibhav@xxxxxx>
+ *
+ * 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 program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/io.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
+
+#include <mach/gpio.h>
+
+#include <media/mt9v113.h>
+
+#include <../drivers/media/video/omap3isp/isp.h>
 
-#include <plat/i2c.h>
-
-#include <media/mt9p031.h>
-#include <asm/mach-types.h>
 #include "devices.h"
-#include "../../../drivers/media/video/omap3isp/isp.h"
 
-#define MT9P031_RESET_GPIO	98
-#define MT9P031_XCLK		ISP_XCLK_A
+#define CAM_USE_XCLKA			1
+#define LEOPARD_RESET_GPIO		98
+
+static struct regulator *beagle_1v8;
+static struct regulator *beagle_2v8;
 
-static struct regulator *reg_1v8, *reg_2v8;
+#define debg(msg) printk(KERN_ERR "BB Debug: " #msg)
 
-static int beagle_cam_set_xclk(struct v4l2_subdev *subdev, int hz)
+static int beagle_mt9v113_s_power(struct v4l2_subdev *subdev, int on)
 {
 	struct isp_device *isp = v4l2_dev_to_isp_device(subdev->v4l2_dev);
-	int ret;
 
-	ret = isp->platform_cb.set_xclk(isp, hz, MT9P031_XCLK);
+	if (!beagle_1v8 || !beagle_2v8) {
+		dev_err(isp->dev, "No regulator available\n");
+		return -ENODEV;
+	}
+	if (on) {
+		debg(Powering on);
+		/*
+		 * Power Up Sequence
+		 */
+		/* Set RESET_BAR to 0 */
+		gpio_set_value(LEOPARD_RESET_GPIO, 0);
+		/* Turn on VDD */
+		debg(Regulator 1v8 switching on);
+		regulator_enable(beagle_1v8);
+		mdelay(1);
+		debg(Regulator 2v8 switching on);
+		regulator_enable(beagle_2v8);
+
+		mdelay(50);
+		/* Enable EXTCLK */
+		debg(Setting isp xclk);
+		if (isp->platform_cb.set_xclk)
+			isp->platform_cb.set_xclk(isp, 24000000, CAM_USE_XCLKA);
+		/*
+		 * Wait at least 70 CLK cycles (w/EXTCLK = 24MHz):
+		 * ((1000000 * 70) / 24000000) = aprox 3 us.
+		 */
+		udelay(3);
+		/* Set RESET_BAR to 1 */
+		gpio_set_value(LEOPARD_RESET_GPIO, 1);
+		/*
+		 * Wait at least 100 CLK cycles (w/EXTCLK = 24MHz):
+		 * ((1000000 * 100) / 24000000) = aprox 5 us.
+		 */
+		udelay(5);
+	} else {
+		debg(Power off);
+		/*
+		 * Power Down Sequence
+		 */
+		if (regulator_is_enabled(beagle_1v8))
+			regulator_disable(beagle_1v8);
+		if (regulator_is_enabled(beagle_2v8))
+			regulator_disable(beagle_2v8);
+
+		if (isp->platform_cb.set_xclk)
+			isp->platform_cb.set_xclk(isp, 0, CAM_USE_XCLKA);
+	}
+
 	return 0;
 }
 
-static int beagle_cam_reset(struct v4l2_subdev *subdev, int active)
+static int beagle_mt9v113_configure_interface(struct v4l2_subdev *subdev,
+					      u32 pixclk)
 {
-	/* Set RESET_BAR to !active */
-	gpio_set_value(MT9P031_RESET_GPIO, !active);
+	struct isp_device *isp = v4l2_dev_to_isp_device(subdev->v4l2_dev);
+
+	if (isp->platform_cb.set_pixel_clock)
+		isp->platform_cb.set_pixel_clock(isp, pixclk);
 
 	return 0;
 }
 
-static struct mt9p031_platform_data beagle_mt9p031_platform_data = {
-	.set_xclk               = beagle_cam_set_xclk,
-	.reset                  = beagle_cam_reset,
-	.vdd_io			= MT9P031_VDD_IO_1V8,
-	.version		= MT9P031_COLOR_VERSION,
+static struct mt9v113_platform_data beagle_mt9v113_platform_data = {
+	.s_power		= beagle_mt9v113_s_power,
+	.configure_interface	= beagle_mt9v113_configure_interface,
 };
 
-static struct i2c_board_info mt9p031_camera_i2c_device = {
-	I2C_BOARD_INFO("mt9p031", 0x48),
-	.platform_data = &beagle_mt9p031_platform_data,
+
+#define MT9V113_I2C_BUS_NUM		2
+
+static struct i2c_board_info beagle_camera_i2c_devices[] = {
+	{
+		I2C_BOARD_INFO(MT9V113_MODULE_NAME, MT9V113_I2C_ADDR),
+		.platform_data = &beagle_mt9v113_platform_data,
+	},
 };
 
-static struct isp_subdev_i2c_board_info mt9p031_camera_subdevs[] = {
+static struct isp_subdev_i2c_board_info beagle_camera_primary_subdevs[] = {
 	{
-		.board_info = &mt9p031_camera_i2c_device,
-		.i2c_adapter_id = 2,
+		.board_info = &beagle_camera_i2c_devices[0],
+		.i2c_adapter_id = MT9V113_I2C_BUS_NUM,
 	},
-	{ NULL, 0, },
+	{ NULL, 0 },
 };
 
 static struct isp_v4l2_subdevs_group beagle_camera_subdevs[] = {
 	{
-		.subdevs = mt9p031_camera_subdevs,
+		.subdevs = beagle_camera_primary_subdevs,
 		.interface = ISP_INTERFACE_PARALLEL,
 		.bus = {
-				.parallel = {
-					.data_lane_shift = 0,
-					.clk_pol = 1,
-					.bridge = ISPCTRL_PAR_BRIDGE_DISABLE,
-				}
+			.parallel = {
+				.data_lane_shift	= 2,
+				.clk_pol		= 0,
+				.bridge			= 3,
+			},
 		},
 	},
-	{ },
+	{ NULL, 0 },
 };
 
 static struct isp_platform_data beagle_isp_platform_data = {
 	.subdevs = beagle_camera_subdevs,
 };
 
-static int __init beagle_camera_init(void)
+static int __init beagle_cam_init(void)
 {
-	if (!machine_is_omap3_beagle() || !cpu_is_omap3630())
-		return 0;
-
-	reg_1v8 = regulator_get(NULL, "cam_1v8");
-	if (IS_ERR(reg_1v8))
-		pr_err("%s: cannot get cam_1v8 regulator\n", __func__);
-	else
-		regulator_enable(reg_1v8);
-
-	reg_2v8 = regulator_get(NULL, "cam_2v8");
-	if (IS_ERR(reg_2v8))
-		pr_err("%s: cannot get cam_2v8 regulator\n", __func__);
-	else
-		regulator_enable(reg_2v8);
-
-	omap_register_i2c_bus(2, 100, NULL, 0);
-	gpio_request(MT9P031_RESET_GPIO, "cam_rst");
-	gpio_direction_output(MT9P031_RESET_GPIO, 0);
+	/*
+	 * Regulator supply required for camera interface
+	 */
+	beagle_1v8 = regulator_get(NULL, "cam_1v8");
+	if (IS_ERR(beagle_1v8)) {
+		printk(KERN_ERR "cam_1v8 regulator missing\n");
+		return PTR_ERR(beagle_1v8);
+	}
+	beagle_2v8 = regulator_get(NULL, "cam_2v8");
+	if (IS_ERR(beagle_2v8)) {
+		printk(KERN_ERR "cam_2v8 regulator missing\n");
+		regulator_put(beagle_1v8);
+		return PTR_ERR(beagle_2v8);
+	}
+	/*
+	 * Sensor reset GPIO
+	 */
+	if (gpio_request(LEOPARD_RESET_GPIO, "cam_rst") != 0) {
+		printk(KERN_ERR "beagle-cam: Could not request GPIO %d\n",
+				LEOPARD_RESET_GPIO);
+		regulator_put(beagle_1v8);
+		regulator_put(beagle_2v8);
+		return -ENODEV;
+	}
+	/* set to output mode */
+	gpio_direction_output(LEOPARD_RESET_GPIO, 0);
+
 	omap3_init_camera(&beagle_isp_platform_data);
+
 	return 0;
 }
-late_initcall(beagle_camera_init);
+
+static void __exit beagle_cam_exit(void)
+{
+	if (regulator_is_enabled(beagle_1v8))
+		regulator_disable(beagle_1v8);
+	regulator_put(beagle_1v8);
+	if (regulator_is_enabled(beagle_2v8))
+		regulator_disable(beagle_2v8);
+	regulator_put(beagle_2v8);
+
+	gpio_free(LEOPARD_RESET_GPIO);
+}
+
+module_init(beagle_cam_init);
+module_exit(beagle_cam_exit);
+
+MODULE_AUTHOR("Texas Instruments");
+MODULE_DESCRIPTION("BeagleXM Camera Module");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
index 3a5bc57..7721aaa 100644
--- a/drivers/media/video/Kconfig
+++ b/drivers/media/video/Kconfig
@@ -351,6 +351,13 @@ config VIDEO_MT9V032
 	  This is a Video4Linux2 sensor-level driver for the Micron
 	  MT9V032 752x480 CMOS sensor.
 
+config VIDEO_MT9V113
+       tristate "Aptina MT9V113 VGA CMOS IMAGE SENSOR"
+       depends on VIDEO_V4L2 && I2C
+       ---help---
+         This is a Video4Linux2 sensor-level driver for the Aptina MT9V113
+         image sensor.
+
 config VIDEO_TCM825X
 	tristate "TCM825x camera sensor support"
 	depends on I2C && VIDEO_V4L2
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile
index 6679c6a..b2c13f2 100644
--- a/drivers/media/video/Makefile
+++ b/drivers/media/video/Makefile
@@ -68,6 +68,7 @@ obj-$(CONFIG_VIDEO_TVEEPROM) += tveeprom.o
 obj-$(CONFIG_VIDEO_MT9P031) += mt9p031.o
 obj-$(CONFIG_VIDEO_MT9V011) += mt9v011.o
 obj-$(CONFIG_VIDEO_MT9V032) += mt9v032.o
+obj-$(CONFIG_VIDEO_MT9V113) += mt9v113.o
 obj-$(CONFIG_VIDEO_SR030PC30)	+= sr030pc30.o
 obj-$(CONFIG_VIDEO_NOON010PC30)	+= noon010pc30.o
 
diff --git a/drivers/media/video/mt9v113.c b/drivers/media/video/mt9v113.c
new file mode 100644
index 0000000..96512a4
--- /dev/null
+++ b/drivers/media/video/mt9v113.c
@@ -0,0 +1,1027 @@
+/*
+ * drivers/media/video/mt9v113.c
+ *
+ * Based on TI TVP5146/47 decoder driver
+ *
+ *
+ * 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 program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/v4l2-mediabus.h>
+
+#include <media/v4l2-chip-ident.h>
+#include <media/v4l2-device.h>
+#include <media/v4l2-subdev.h>
+#include <media/v4l2-ctrls.h>
+#include <media/mt9v113.h>
+
+#include "mt9v113_regs.h"
+
+/* Macro's */
+#define I2C_RETRY_COUNT                 (5)
+
+#define MT9V113_DEF_WIDTH		640
+#define MT9V113_DEF_HEIGHT		480
+
+/* Debug functions */
+static int debug = 1;
+module_param(debug, bool, 0644);
+MODULE_PARM_DESC(debug, "Debug level (0-1)");
+
+/*
+ * struct mt9v113 - sensor object
+ * @subdev: v4l2_subdev associated data
+ * @pad: media entity associated data
+ * @format: associated media bus format
+ * @rect: configured resolution/window
+ * @pdata: Board specific
+ * @ver: Chip version
+ * @power: Current power state (0: off, 1: on)
+ */
+struct mt9v113 {
+	struct v4l2_subdev subdev;
+	struct media_pad pad;
+	struct v4l2_mbus_framefmt format;
+	struct v4l2_rect rect;
+
+	struct v4l2_ctrl_handler ctrls;
+
+	const struct mt9v113_platform_data *pdata;
+	unsigned int ver;
+	bool power;
+};
+
+#define to_mt9v113(sd)	container_of(sd, struct mt9v113, subdev)
+/*
+ * struct mt9v113_fmt -
+ * @mbus_code: associated media bus code
+ * @fmt: format descriptor
+ */
+struct mt9v113_fmt {
+	unsigned int mbus_code;
+	struct v4l2_fmtdesc fmt;
+};
+/*
+ * List of image formats supported by mt9v113
+ * Currently we are using 8 bit and 8x2 bit mode only, but can be
+ * extended to 10 bit mode.
+ */
+static const struct mt9v113_fmt mt9v113_fmt_list[] = {
+	{
+		.mbus_code = V4L2_MBUS_FMT_UYVY8_2X8,
+		.fmt = {
+			.index = 0,
+			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+			.flags = 0,
+			.description = "8-bit UYVY 4:2:2 Format",
+			.pixelformat = V4L2_PIX_FMT_UYVY,
+		},
+	},
+	{
+		.mbus_code = V4L2_MBUS_FMT_YUYV8_2X8,
+		.fmt = {
+			.index = 1,
+			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+			.flags = 0,
+			.description = "8-bit YUYV 4:2:2 Format",
+			.pixelformat = V4L2_PIX_FMT_YUYV,
+		},
+	},
+	{
+		.mbus_code = V4L2_MBUS_FMT_RGB565_2X8_LE,
+		.fmt = {
+			.index = 2,
+			.type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
+			.flags = 0,
+			.description = "16-bit RGB565 format",
+			.pixelformat = V4L2_PIX_FMT_RGB565,
+		},
+	},
+};
+
+/* MT9V113 register set for VGA mode */
+static struct mt9v113_reg mt9v113_vga_reg[] = {
+	{TOK_WRITE, 0x098C, 0x2739}, /* crop_X0_A */
+	{TOK_WRITE, 0x0990, 0x0000}, /* val: 0 */
+	{TOK_WRITE, 0x098C, 0x273B}, /* crop_X1_A */
+	{TOK_WRITE, 0x0990, 0x027F}, /* val: 639 */
+	{TOK_WRITE, 0x098C, 0x273D}, /* crop_Y0_A */
+	{TOK_WRITE, 0x0990, 0x0000}, /* val: 0 */
+	{TOK_WRITE, 0x098C, 0x273F}, /* crop_Y1_A */
+	{TOK_WRITE, 0x0990, 0x01DF}, /* val: 479 */
+	{TOK_WRITE, 0x098C, 0x2703}, /* output_width_A */
+	{TOK_WRITE, 0x0990, 0x0280}, /* val: 640 */
+	{TOK_WRITE, 0x098C, 0x2705}, /* out_height_A */
+	{TOK_WRITE, 0x0990, 0x01E0}, /* val: 480 */
+	{TOK_WRITE, 0x098C, 0xA103}, /* cmd */
+	{TOK_WRITE, 0x0990, 0x0005}, /* val: 5 - Refresh */
+	{TOK_DELAY, 0, 100},
+	{TOK_TERM, 0, 0},
+};
+
+/* MT9V113 default register values */
+static struct mt9v113_reg mt9v113_reg_list[] = {
+	{TOK_WRITE, 0x0018, 0x4028},
+	{TOK_DELAY, 0, 100},
+	{TOK_WRITE, 0x001A, 0x0011},
+	{TOK_WRITE, 0x001A, 0x0010},
+	{TOK_WRITE, 0x0018, 0x4028},
+	{TOK_DELAY, 0, 100},
+	{TOK_WRITE, 0x098C, 0x02F0},
+	{TOK_WRITE, 0x0990, 0x0000},
+	{TOK_WRITE, 0x098C, 0x02F2},
+	{TOK_WRITE, 0x0990, 0x0210},
+	{TOK_WRITE, 0x098C, 0x02F4},
+	{TOK_WRITE, 0x0990, 0x001A},
+	{TOK_WRITE, 0x098C, 0x2145},
+	{TOK_WRITE, 0x0990, 0x02F4},
+	{TOK_WRITE, 0x098C, 0xA134},
+	{TOK_WRITE, 0x0990, 0x0001},
+	{TOK_WRITE, 0x31E0, 0x0001},
+	{TOK_WRITE, 0x001A, 0x0210},
+	{TOK_WRITE, 0x001E, 0x0777},
+	{TOK_WRITE, 0x0016, 0x42DF},
+	{TOK_WRITE, 0x0014, 0x2145},
+	{TOK_WRITE, 0x0014, 0x2145},
+	{TOK_WRITE, 0x0010, 0x0431},
+	{TOK_WRITE, 0x0012, 0x0000},
+	{TOK_WRITE, 0x0014, 0x244B},
+	{TOK_WRITE, 0x0014, 0x304B},
+	{TOK_DELAY, 0, 100},
+	{TOK_WRITE, 0x0014, 0xB04A},
+	{TOK_WRITE, 0x098C, 0xAB1F},
+	{TOK_WRITE, 0x0990, 0x00C7},
+	{TOK_WRITE, 0x098C, 0xAB31},
+	{TOK_WRITE, 0x0990, 0x001E},
+	{TOK_WRITE, 0x098C, 0x274F},
+	{TOK_WRITE, 0x0990, 0x0004},
+	{TOK_WRITE, 0x098C, 0x2741},
+	{TOK_WRITE, 0x0990, 0x0004},
+	{TOK_WRITE, 0x098C, 0xAB20},
+	{TOK_WRITE, 0x0990, 0x0054},
+	{TOK_WRITE, 0x098C, 0xAB21},
+	{TOK_WRITE, 0x0990, 0x0046},
+	{TOK_WRITE, 0x098C, 0xAB22},
+	{TOK_WRITE, 0x0990, 0x0002},
+	{TOK_WRITE, 0x098C, 0xAB24},
+	{TOK_WRITE, 0x0990, 0x0005},
+	{TOK_WRITE, 0x098C, 0x2B28},
+	{TOK_WRITE, 0x0990, 0x170C},
+	{TOK_WRITE, 0x098C, 0x2B2A},
+	{TOK_WRITE, 0x0990, 0x3E80},
+	{TOK_WRITE, 0x3210, 0x09A8},
+	{TOK_WRITE, 0x098C, 0x2306},
+	{TOK_WRITE, 0x0990, 0x0315},
+	{TOK_WRITE, 0x098C, 0x2308},
+	{TOK_WRITE, 0x0990, 0xFDDC},
+	{TOK_WRITE, 0x098C, 0x230A},
+	{TOK_WRITE, 0x0990, 0x003A},
+	{TOK_WRITE, 0x098C, 0x230C},
+	{TOK_WRITE, 0x0990, 0xFF58},
+	{TOK_WRITE, 0x098C, 0x230E},
+	{TOK_WRITE, 0x0990, 0x02B7},
+	{TOK_WRITE, 0x098C, 0x2310},
+	{TOK_WRITE, 0x0990, 0xFF31},
+	{TOK_WRITE, 0x098C, 0x2312},
+	{TOK_WRITE, 0x0990, 0xFF4C},
+	{TOK_WRITE, 0x098C, 0x2314},
+	{TOK_WRITE, 0x0990, 0xFE4C},
+	{TOK_WRITE, 0x098C, 0x2316},
+	{TOK_WRITE, 0x0990, 0x039E},
+	{TOK_WRITE, 0x098C, 0x2318},
+	{TOK_WRITE, 0x0990, 0x001C},
+	{TOK_WRITE, 0x098C, 0x231A},
+	{TOK_WRITE, 0x0990, 0x0039},
+	{TOK_WRITE, 0x098C, 0x231C},
+	{TOK_WRITE, 0x0990, 0x007F},
+	{TOK_WRITE, 0x098C, 0x231E},
+	{TOK_WRITE, 0x0990, 0xFF77},
+	{TOK_WRITE, 0x098C, 0x2320},
+	{TOK_WRITE, 0x0990, 0x000A},
+	{TOK_WRITE, 0x098C, 0x2322},
+	{TOK_WRITE, 0x0990, 0x0020},
+	{TOK_WRITE, 0x098C, 0x2324},
+	{TOK_WRITE, 0x0990, 0x001B},
+	{TOK_WRITE, 0x098C, 0x2326},
+	{TOK_WRITE, 0x0990, 0xFFC6},
+	{TOK_WRITE, 0x098C, 0x2328},
+	{TOK_WRITE, 0x0990, 0x0086},
+	{TOK_WRITE, 0x098C, 0x232A},
+	{TOK_WRITE, 0x0990, 0x00B5},
+	{TOK_WRITE, 0x098C, 0x232C},
+	{TOK_WRITE, 0x0990, 0xFEC3},
+	{TOK_WRITE, 0x098C, 0x232E},
+	{TOK_WRITE, 0x0990, 0x0001},
+	{TOK_WRITE, 0x098C, 0x2330},
+	{TOK_WRITE, 0x0990, 0xFFEF},
+	{TOK_WRITE, 0x098C, 0xA348},
+	{TOK_WRITE, 0x0990, 0x0008},
+	{TOK_WRITE, 0x098C, 0xA349},
+	{TOK_WRITE, 0x0990, 0x0002},
+	{TOK_WRITE, 0x098C, 0xA34A},
+	{TOK_WRITE, 0x0990, 0x0090},
+	{TOK_WRITE, 0x098C, 0xA34B},
+	{TOK_WRITE, 0x0990, 0x00FF},
+	{TOK_WRITE, 0x098C, 0xA34C},
+	{TOK_WRITE, 0x0990, 0x0075},
+	{TOK_WRITE, 0x098C, 0xA34D},
+	{TOK_WRITE, 0x0990, 0x00EF},
+	{TOK_WRITE, 0x098C, 0xA351},
+	{TOK_WRITE, 0x0990, 0x0000},
+	{TOK_WRITE, 0x098C, 0xA352},
+	{TOK_WRITE, 0x0990, 0x007F},
+	{TOK_WRITE, 0x098C, 0xA354},
+	{TOK_WRITE, 0x0990, 0x0043},
+	{TOK_WRITE, 0x098C, 0xA355},
+	{TOK_WRITE, 0x0990, 0x0001},
+	{TOK_WRITE, 0x098C, 0xA35D},
+	{TOK_WRITE, 0x0990, 0x0078},
+	{TOK_WRITE, 0x098C, 0xA35E},
+	{TOK_WRITE, 0x0990, 0x0086},
+	{TOK_WRITE, 0x098C, 0xA35F},
+	{TOK_WRITE, 0x0990, 0x007E},
+	{TOK_WRITE, 0x098C, 0xA360},
+	{TOK_WRITE, 0x0990, 0x0082},
+	{TOK_WRITE, 0x098C, 0x2361},
+	{TOK_WRITE, 0x0990, 0x0040},
+	{TOK_WRITE, 0x098C, 0xA363},
+	{TOK_WRITE, 0x0990, 0x00D2},
+	{TOK_WRITE, 0x098C, 0xA364},
+	{TOK_WRITE, 0x0990, 0x00F6},
+	{TOK_WRITE, 0x098C, 0xA302},
+	{TOK_WRITE, 0x0990, 0x0000},
+	{TOK_WRITE, 0x098C, 0xA303},
+	{TOK_WRITE, 0x0990, 0x00EF},
+	{TOK_WRITE, 0x098C, 0xAB20},
+	{TOK_WRITE, 0x0990, 0x0024},
+	{TOK_WRITE, 0x098C, 0xA103},
+	{TOK_WRITE, 0x0990, 0x0006},
+	{TOK_DELAY, 0, 100},
+	{TOK_WRITE, 0x098C, 0xA103},
+	{TOK_WRITE, 0x0990, 0x0005},
+	{TOK_DELAY, 0, 100},
+	{TOK_WRITE, 0x098C, 0x222D},
+	{TOK_WRITE, 0x0990, 0x0088},
+	{TOK_WRITE, 0x098C, 0xA408},
+	{TOK_WRITE, 0x0990, 0x0020},
+	{TOK_WRITE, 0x098C, 0xA409},
+	{TOK_WRITE, 0x0990, 0x0023},
+	{TOK_WRITE, 0x098C, 0xA40A},
+	{TOK_WRITE, 0x0990, 0x0027},
+	{TOK_WRITE, 0x098C, 0xA40B},
+	{TOK_WRITE, 0x0990, 0x002A},
+	{TOK_WRITE, 0x098C, 0x2411},
+	{TOK_WRITE, 0x0990, 0x0088},
+	{TOK_WRITE, 0x098C, 0x2413},
+	{TOK_WRITE, 0x0990, 0x00A4},
+	{TOK_WRITE, 0x098C, 0x2415},
+	{TOK_WRITE, 0x0990, 0x0088},
+	{TOK_WRITE, 0x098C, 0x2417},
+	{TOK_WRITE, 0x0990, 0x00A4},
+	{TOK_WRITE, 0x098C, 0xA404},
+	{TOK_WRITE, 0x0990, 0x0010},
+	{TOK_WRITE, 0x098C, 0xA40D},
+	{TOK_WRITE, 0x0990, 0x0002},
+	{TOK_WRITE, 0x098C, 0xA40E},
+	{TOK_WRITE, 0x0990, 0x0003},
+	{TOK_WRITE, 0x098C, 0xA103},
+	{TOK_WRITE, 0x0990, 0x0006},
+	{TOK_DELAY, 0, 100},
+	/* test pattern all white*/
+	/* {TOK_WRITE, 0x098C, 0xA766},
+	{TOK_WRITE, 0x0990, 0x0001},
+	*/
+	{TOK_WRITE, 0x098C, 0xA103},
+	{TOK_WRITE, 0x0990, 0x0005},
+	{TOK_DELAY, 0, 100},
+	{TOK_TERM, 0, 0},
+};
+
+static int mt9v113_read_reg(struct i2c_client *client, unsigned short reg)
+{
+	int err = 0;
+	struct i2c_msg msg[1];
+	unsigned char data[2];
+	unsigned short val = 0;
+
+	if (!client->adapter)
+		return -ENODEV;
+
+	msg->addr = client->addr;
+	msg->flags = 0;
+	msg->len = I2C_TWO_BYTE_TRANSFER;
+	msg->buf = data;
+	data[0] = (reg & I2C_TXRX_DATA_MASK_UPPER) >> I2C_TXRX_DATA_SHIFT;
+	data[1] = (reg & I2C_TXRX_DATA_MASK);
+	err = i2c_transfer(client->adapter, msg, 1);
+	if (err >= 0) {
+		msg->flags = I2C_M_RD;
+		msg->len = I2C_TWO_BYTE_TRANSFER;	/* 2 byte read */
+		err = i2c_transfer(client->adapter, msg, 1);
+		if (err >= 0) {
+			val = ((data[0] & I2C_TXRX_DATA_MASK) <<
+				I2C_TXRX_DATA_SHIFT) |
+				(data[1] & I2C_TXRX_DATA_MASK);
+		}
+	}
+
+	v4l_dbg(1, debug, client,
+		 "mt9v113_read_reg reg=0x%x, val=0x%x\n", reg, val);
+
+	return (int)(0xffff & val);
+}
+
+static int mt9v113_write_reg(struct i2c_client *client, unsigned short reg,
+			     unsigned short val)
+{
+	int err = -EAGAIN; /* To enter below loop, err has to be negative */
+	int trycnt = 0;
+	struct i2c_msg msg[1];
+	unsigned char data[4];
+
+	v4l_dbg(1, debug, client,
+			"mt9v113_write_reg reg=0x%x, val=0x%x\n", reg, val);
+
+	if (!client->adapter)
+		return -ENODEV;
+
+	while ((err < 0) && (trycnt < I2C_RETRY_COUNT)) {
+		trycnt++;
+		msg->addr = client->addr;
+		msg->flags = 0;
+		msg->len = I2C_FOUR_BYTE_TRANSFER;
+		msg->buf = data;
+		data[0] = (reg & I2C_TXRX_DATA_MASK_UPPER) >>
+			I2C_TXRX_DATA_SHIFT;
+		data[1] = (reg & I2C_TXRX_DATA_MASK);
+		data[2] = (val & I2C_TXRX_DATA_MASK_UPPER) >>
+			I2C_TXRX_DATA_SHIFT;
+		data[3] = (val & I2C_TXRX_DATA_MASK);
+		err = i2c_transfer(client->adapter, msg, 1);
+	}
+	if (err < 0)
+		printk(KERN_INFO "\n I2C write failed");
+
+	return err;
+}
+
+/*
+ * mt9v113_write_regs : Initializes a list of registers
+ *		if token is TOK_TERM, then entire write operation terminates
+ *		if token is TOK_DELAY, then a delay of 'val' msec is introduced
+ *		if token is TOK_SKIP, then the register write is skipped
+ *		if token is TOK_WRITE, then the register write is performed
+ *
+ * reglist - list of registers to be written
+ * Returns zero if successful, or non-zero otherwise.
+ */
+static int mt9v113_write_regs(struct i2c_client *client,
+			      const struct mt9v113_reg reglist[])
+{
+	int err;
+	const struct mt9v113_reg *next = reglist;
+
+	for (; next->token != TOK_TERM; next++) {
+		if (next->token == TOK_DELAY) {
+			msleep(next->val);
+			continue;
+		}
+
+		if (next->token == TOK_SKIP)
+			continue;
+
+		err = mt9v113_write_reg(client, next->reg, next->val);
+		if (err < 0) {
+			v4l_err(client, "Write failed. Err[%d]\n", err);
+			return err;
+		}
+	}
+	return 0;
+}
+
+/*
+ * Configure the mt9v113 with the current register settings
+ * Returns zero if successful, or non-zero otherwise.
+ */
+static int mt9v113_def_config(struct v4l2_subdev *subdev)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(subdev);
+
+	/* common register initialization */
+	return mt9v113_write_regs(client, mt9v113_reg_list);
+}
+
+/*
+ * Configure the MT9V113 to VGA mode
+ * Returns zero if successful, or non-zero otherwise.
+ */
+static int mt9v113_vga_mode(struct v4l2_subdev *subdev)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(subdev);
+
+	return mt9v113_write_regs(client, mt9v113_vga_reg);
+}
+
+/*
+ * Detect if an mt9v113 is present, and if so which revision.
+ * A device is considered to be detected if the chip ID (LSB and MSB)
+ * registers match the expected values.
+ * Any value of the rom version register is accepted.
+ * Returns ENODEV error number if no device is detected, or zero
+ * if a device is detected.
+ */
+static int mt9v113_detect(struct v4l2_subdev *subdev)
+{
+	struct mt9v113 *decoder = to_mt9v113(subdev);
+	struct i2c_client *client = v4l2_get_subdevdata(subdev);
+	unsigned short val = 0;
+
+	val = mt9v113_read_reg(client, REG_CHIP_ID);
+	v4l_dbg(1, debug, client, "chip id detected 0x%x\n", val);
+
+	if (MT9V113_CHIP_ID != val) {
+		/* We didn't read the values we expected, so this must not be
+		 * MT9V113.
+		 */
+		v4l_err(client, "chip id mismatch read 0x%x, expecting 0x%x\n",
+				val, MT9V113_CHIP_ID);
+		return -ENODEV;
+	}
+
+	decoder->ver = val;
+
+	v4l_info(client, "%s found at 0x%x (%s)\n", client->name,
+			client->addr << 1, client->adapter->name);
+	return 0;
+}
+
+
+/* --------------------------------------------------------------------------
+ * V4L2 subdev core operations
+ */
+/*
+ * mt9v113_g_chip_ident - get chip identifier
+ */
+static int mt9v113_g_chip_ident(struct v4l2_subdev *subdev,
+			       struct v4l2_dbg_chip_ident *chip)
+{
+	struct i2c_client *client = v4l2_get_subdevdata(subdev);
+
+	return v4l2_chip_ident_i2c_client(client, chip, V4L2_IDENT_MT9V113, 0);
+}
+
+/*
+ * mt9v113_dev_init - sensor init, tries to detect the sensor
+ * @subdev: pointer to standard V4L2 subdev structure
+ */
+static int mt9v113_dev_init(struct v4l2_subdev *subdev)
+{
+	struct mt9v113 *decoder = to_mt9v113(subdev);
+	int rval;
+
+	rval = decoder->pdata->s_power(subdev, 1);
+	if (rval)
+		return rval;
+
+	rval = mt9v113_detect(subdev);
+
+	decoder->pdata->s_power(subdev, 0);
+
+	return rval;
+}
+
+/*
+ * mt9v113_s_config - set the platform data for future use
+ * @subdev: pointer to standard V4L2 subdev structure
+ * @irq:
+ * @platform_data: sensor platform_data
+ */
+static int mt9v113_s_config(struct v4l2_subdev *subdev, int irq,
+			   void *platform_data)
+{
+	struct mt9v113 *decoder = to_mt9v113(subdev);
+	int rval;
+
+	if (platform_data == NULL)
+		return -ENODEV;
+
+	decoder->pdata = platform_data;
+
+	rval = mt9v113_dev_init(subdev);
+	if (rval)
+		return rval;
+
+	return 0;
+}
+
+/*
+ * mt9v113_s_power - Set power function
+ * @subdev: pointer to standard V4L2 subdev structure
+ * @on: power state to which device is to be set
+ *
+ * Sets devices power state to requested state, if possible.
+ */
+static int mt9v113_s_power(struct v4l2_subdev *subdev, int on)
+{
+	struct mt9v113 *decoder = to_mt9v113(subdev);
+	struct i2c_client *client = v4l2_get_subdevdata(subdev);
+	int rval;
+
+	if (on) {
+		rval = decoder->pdata->s_power(subdev, 1);
+		if (rval)
+			goto out;
+		rval = mt9v113_def_config(subdev);
+		if (rval) {
+			decoder->pdata->s_power(subdev, 0);
+			goto out;
+		}
+		rval = mt9v113_vga_mode(subdev);
+		if (rval) {
+			decoder->pdata->s_power(subdev, 0);
+			goto out;
+		}
+	} else {
+		rval = decoder->pdata->s_power(subdev, 0);
+		if (rval)
+			goto out;
+	}
+
+	decoder->power = on;
+out:
+	if (rval < 0)
+		v4l_err(client, "Unable to set target power state\n");
+
+	return rval;
+}
+
+/* --------------------------------------------------------------------------
+ * V4L2 subdev file operations
+ */
+static int mt9v113_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
+{
+	struct v4l2_mbus_framefmt *format;
+	struct v4l2_rect *crop;
+
+	/*
+	 * Default configuration -
+	 *	Resolution: VGA
+	 *	Format: UYVY
+	 *	crop = window
+	 */
+	crop = v4l2_subdev_get_try_crop(fh, 0);
+	crop->left = 0;
+	crop->top = 0;
+	crop->width = MT9V113_DEF_WIDTH;
+	crop->height = MT9V113_DEF_HEIGHT;
+
+	format = v4l2_subdev_get_try_format(fh, 0);
+	format->code = V4L2_MBUS_FMT_UYVY8_2X8;
+	format->width = MT9V113_DEF_WIDTH;
+	format->height = MT9V113_DEF_HEIGHT;
+	format->field = V4L2_FIELD_NONE;
+	format->colorspace = V4L2_COLORSPACE_JPEG;
+
+	return 0;
+}
+
+/* --------------------------------------------------------------------------
+ * V4L2 subdev video operations
+ */
+static int mt9v113_s_stream(struct v4l2_subdev *subdev, int streaming)
+{
+	/*
+	 * FIXME: We should put here the specific reg setting to turn on
+	 * streaming in sensor.
+	 */
+	return 0;
+}
+
+/* --------------------------------------------------------------------------
+ * V4L2 subdev pad operations
+ */
+static int mt9v113_enum_mbus_code(struct v4l2_subdev *subdev,
+				  struct v4l2_subdev_fh *fh,
+				  struct v4l2_subdev_mbus_code_enum *code)
+{
+	struct mt9v113 *mt9v113 = to_mt9v113(subdev);
+
+	if (code->index >= ARRAY_SIZE(mt9v113_fmt_list))
+		return -EINVAL;
+
+	code->code = mt9v113->format.code;
+
+	return 0;
+}
+
+static int mt9v113_enum_frame_size(struct v4l2_subdev *subdev,
+				   struct v4l2_subdev_fh *fh,
+				   struct v4l2_subdev_frame_size_enum *fse)
+{
+	int i;
+
+	/* Is requested media-bus format/pixelformat not found on sensor? */
+	for (i = 0; i < ARRAY_SIZE(mt9v113_fmt_list); i++) {
+		if (fse->code == mt9v113_fmt_list[i].mbus_code)
+			goto fmt_found;
+	}
+	if (i >= ARRAY_SIZE(mt9v113_fmt_list))
+		return -EINVAL;
+
+fmt_found:
+	/*
+	 * Currently only supports VGA resolution
+	 */
+	fse->min_width = fse->max_width = MT9V113_DEF_WIDTH;
+	fse->min_height = fse->max_height = MT9V113_DEF_HEIGHT;
+
+	return 0;
+}
+
+static int mt9v113_get_pad_format(struct v4l2_subdev *subdev,
+				  struct v4l2_subdev_fh *fh,
+				  struct v4l2_subdev_format *fmt)
+{
+	struct mt9v113 *mt9v113 = to_mt9v113(subdev);
+
+	fmt->format = mt9v113->format;
+	return 0;
+}
+
+static int mt9v113_set_pad_format(struct v4l2_subdev *subdev,
+				  struct v4l2_subdev_fh *fh,
+				  struct v4l2_subdev_format *fmt)
+{
+	int i;
+	struct mt9v113 *mt9v113 = to_mt9v113(subdev);
+
+	for (i = 0; i < ARRAY_SIZE(mt9v113_fmt_list); i++) {
+		if (fmt->format.code == mt9v113_fmt_list[i].mbus_code)
+			goto fmt_found;
+	}
+	if (i >= ARRAY_SIZE(mt9v113_fmt_list))
+		return -EINVAL;
+
+fmt_found:
+	/*
+	 * Only VGA resolution supported
+	 */
+	fmt->format.width = MT9V113_DEF_WIDTH;
+	fmt->format.height = MT9V113_DEF_HEIGHT;
+	fmt->format.field = V4L2_FIELD_NONE;
+	fmt->format.colorspace = V4L2_COLORSPACE_JPEG;
+
+	mt9v113->format = fmt->format;
+
+	return 0;
+}
+
+static int mt9v113_get_crop(struct v4l2_subdev *subdev,
+		struct v4l2_subdev_fh *fh, struct v4l2_subdev_crop *crop)
+{
+	struct mt9v113 *mt9v113 = to_mt9v113(subdev);
+
+	crop->rect = mt9v113->rect;
+	return 0;
+}
+
+static int mt9v113_set_crop(struct v4l2_subdev *subdev,
+		struct v4l2_subdev_fh *fh, struct v4l2_subdev_crop *crop)
+{
+	struct mt9v113 *mt9v113 = to_mt9v113(subdev);
+	struct v4l2_rect rect;
+
+	/*
+	 * Only VGA resolution/window is supported
+	 */
+	rect.left = 0;
+	rect.top = 0;
+	rect.width = MT9V113_DEF_WIDTH;
+	rect.height = MT9V113_DEF_HEIGHT;
+
+	mt9v113->rect = rect;
+	crop->rect = rect;
+
+	return 0;
+}
+
+static const struct v4l2_subdev_core_ops mt9v113_core_ops = {
+	.g_chip_ident = mt9v113_g_chip_ident,
+//	.s_config = mt9v113_s_config,
+	.s_power = mt9v113_s_power,
+};
+
+static const struct v4l2_subdev_internal_ops mt9v113_subdev_internal_ops = {
+	.open		= mt9v113_open,
+	.registered	= mt9v113_dev_init,
+};
+
+static const struct v4l2_subdev_video_ops mt9v113_video_ops = {
+	.s_stream = mt9v113_s_stream,
+};
+
+static const struct v4l2_subdev_pad_ops mt9v113_pad_ops = {
+	.enum_mbus_code	 = mt9v113_enum_mbus_code,
+	.enum_frame_size = mt9v113_enum_frame_size,
+	.get_fmt	 = mt9v113_get_pad_format,
+	.set_fmt	 = mt9v113_set_pad_format,
+	.get_crop	 = mt9v113_get_crop,
+	.set_crop	 = mt9v113_set_crop,
+};
+
+static const struct v4l2_subdev_ops mt9v113_ops = {
+	.core	= &mt9v113_core_ops,
+	.video	= &mt9v113_video_ops,
+	.pad	= &mt9v113_pad_ops,
+};
+
+
+/* -----------------------------------------------------------------------------
+ * V4L2 subdev control operations
+ */
+
+#define V4L2_CID_TEST_PATTERN		(V4L2_CID_USER_BASE | 0x1001)
+
+/*
+ * mt9v113_s_ctrl - V4L2 decoder interface handler for VIDIOC_S_CTRL ioctl
+ * @s: pointer to standard V4L2 device structure
+ * @ctrl: pointer to v4l2_control structure
+ *
+ * If the requested control is supported, sets the control's current
+ * value in HW. Otherwise, returns -EINVAL if the control is not supported.
+ */
+static int mt9v113_s_ctrl(struct v4l2_ctrl *ctrl)
+{
+        struct mt9v113 *mt9v113 =
+			container_of(ctrl->handler, struct mt9v113, ctrls);
+
+	struct i2c_client *client = v4l2_get_subdevdata(&mt9v113->subdev);
+	int err = -EINVAL, value;
+
+	if (ctrl == NULL)
+		return err;
+
+	value = (__s32) ctrl->val;
+
+	switch (ctrl->id) {
+	case V4L2_CID_BRIGHTNESS:
+		if (ctrl->val < 0 || ctrl->val > 255) {
+			v4l_err(client, "invalid brightness setting %d\n",
+					ctrl->val);
+			return -ERANGE;
+		}
+		err = mt9v113_write_reg(client, REG_BRIGHTNESS, value);
+		if (err)
+			return err;
+
+		mt9v113_reg_list[REG_BRIGHTNESS].val = value;
+		break;
+	case V4L2_CID_CONTRAST:
+		if (ctrl->val < 0 || ctrl->val > 255) {
+			v4l_err(client, "invalid contrast setting %d\n",
+					ctrl->val);
+			return -ERANGE;
+		}
+		err = mt9v113_write_reg(client, REG_CONTRAST, value);
+		if (err)
+			return err;
+
+		mt9v113_reg_list[REG_CONTRAST].val = value;
+		break;
+	case V4L2_CID_SATURATION:
+		if (ctrl->val < 0 || ctrl->val > 255) {
+			v4l_err(client, "invalid saturation setting %d\n",
+					ctrl->val);
+			return -ERANGE;
+		}
+		err = mt9v113_write_reg(client, REG_SATURATION, value);
+		if (err)
+			return err;
+
+		mt9v113_reg_list[REG_SATURATION].val = value;
+		break;
+	case V4L2_CID_HUE:
+		if (value == 180)
+			value = 0x7F;
+		else if (value == -180)
+			value = 0x80;
+		else if (value == 0)
+			value = 0;
+		else {
+			v4l_err(client, "invalid hue setting %d\n",
+					ctrl->val);
+			return -ERANGE;
+		}
+		err = mt9v113_write_reg(client, REG_HUE, value);
+		if (err)
+			return err;
+
+		mt9v113_reg_list[REG_HUE].val = value;
+		break;
+	case V4L2_CID_AUTOGAIN:
+		if (value == 1)
+			value = 0x0F;
+		else if (value == 0)
+			value = 0x0C;
+		else {
+			v4l_err(client, "invalid auto gain setting %d\n",
+					ctrl->val);
+			return -ERANGE;
+		}
+		err = mt9v113_write_reg(client, REG_AFE_GAIN_CTRL, value);
+		if (err)
+			return err;
+
+		mt9v113_reg_list[REG_AFE_GAIN_CTRL].val = value;
+		break;
+	case V4L2_CID_TEST_PATTERN:
+		switch (ctrl->val) {
+		case 0:
+			break;
+		}
+		/* FIXME Add proper Test pattern code here */
+		return mt9v113_write_reg(client, 0, 0);
+
+	default:
+		v4l_err(client, "invalid control id %d\n", ctrl->id);
+		return err;
+	}
+
+	v4l_dbg(1, debug, client,
+			"Set Control: ID - %d - %d", ctrl->id, ctrl->val);
+
+	return err;
+}
+
+static struct v4l2_ctrl_ops mt9v113_ctrl_ops = {
+	.s_ctrl = mt9v113_s_ctrl,
+};
+
+static const struct v4l2_ctrl_config mt9v113_ctrls[] = {
+	{
+		.ops		= &mt9v113_ctrl_ops,
+		.id		= V4L2_CID_TEST_PATTERN,
+		.type		= V4L2_CTRL_TYPE_INTEGER,
+		.name		= "Test pattern",
+		.min		= 0,
+		.max		= 1023,
+		.step		= 1,
+		.def		= 0,
+		.flags		= 0,
+	}
+};
+
+
+/*
+ * mt9v113_probe - sensor driver i2c probe handler
+ * @client: i2c driver client device structure
+ *
+ * Register sensor as an i2c client device and V4L2
+ * sub-device.
+ */
+static int mt9v113_probe(struct i2c_client *client,
+			 const struct i2c_device_id *id)
+{
+	struct mt9v113 *mt9v113;
+	int i, ret;
+
+	/* Check if the adapter supports the needed features */
+	if (!i2c_check_functionality(client->adapter,
+				I2C_FUNC_SMBUS_BYTE_DATA)) {
+		v4l_err(client, "mt9v113: I2C Adapter doesn't support" \
+				" I2C_FUNC_SMBUS_WORD\n");
+		return -EIO;
+	}
+	if (!client->dev.platform_data) {
+		v4l_err(client, "No platform data!!\n");
+		return -ENODEV;
+	}
+
+	mt9v113 = kzalloc(sizeof(*mt9v113), GFP_KERNEL);
+	if (mt9v113 == NULL) {
+		v4l_err(client, "Could not able to alocate memory!!\n");
+		return -ENOMEM;
+	}
+
+	mt9v113->pdata = client->dev.platform_data;
+
+	/*
+	 * Initialize and register available controls
+	 */
+	v4l2_ctrl_handler_init(&mt9v113->ctrls, ARRAY_SIZE(mt9v113_ctrls) + 4);
+	v4l2_ctrl_new_std(&mt9v113->ctrls, &mt9v113_ctrl_ops,
+			V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
+
+	for (i = 0; i < ARRAY_SIZE(mt9v113_ctrls); ++i)
+		v4l2_ctrl_new_custom(&mt9v113->ctrls, &mt9v113_ctrls[i], NULL);
+
+	mt9v113->subdev.ctrl_handler = &mt9v113->ctrls;
+
+	if (mt9v113->ctrls.error)
+		v4l_info(client, "%s: error while initialization control %d\n",
+				__func__, mt9v113->ctrls.error);
+
+	/*
+	 * Default configuration -
+	 *	Resolution: VGA
+	 *	Format: UYVY
+	 *	crop = window
+	 */
+	mt9v113->rect.left = 0;
+	mt9v113->rect.top = 0;
+	mt9v113->rect.width = MT9V113_DEF_WIDTH;
+	mt9v113->rect.height = MT9V113_DEF_HEIGHT;
+
+	mt9v113->format.code = V4L2_MBUS_FMT_UYVY8_2X8;
+	mt9v113->format.width = MT9V113_DEF_WIDTH;
+	mt9v113->format.height = MT9V113_DEF_HEIGHT;
+	mt9v113->format.field = V4L2_FIELD_NONE;
+	mt9v113->format.colorspace = V4L2_COLORSPACE_JPEG;
+
+	/*
+	 * Register as a subdev
+	 */
+	v4l2_i2c_subdev_init(&mt9v113->subdev, client, &mt9v113_ops);
+	mt9v113->subdev.internal_ops = &mt9v113_subdev_internal_ops;
+	mt9v113->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+
+	/*
+	 * Register as media entity
+	 */
+	mt9v113->pad.flags = MEDIA_PAD_FL_SOURCE;
+	ret = media_entity_init(&mt9v113->subdev.entity, 1, &mt9v113->pad, 0);
+	if (ret < 0) {
+		v4l_err(client, "failed to register as a media entity\n");
+		kfree(mt9v113);
+	}
+
+	return ret;
+}
+
+/*
+ * mt9v113_remove - Sensor driver i2c remove handler
+ * @client: i2c driver client device structure
+ *
+ * Unregister sensor as an i2c client device and V4L2
+ * sub-device.
+ */
+static int __exit mt9v113_remove(struct i2c_client *client)
+{
+	struct v4l2_subdev *subdev = i2c_get_clientdata(client);
+	struct mt9v113 *mt9v113 = to_mt9v113(subdev);
+
+	v4l2_device_unregister_subdev(subdev);
+	media_entity_cleanup(&subdev->entity);
+	kfree(mt9v113);
+
+	return 0;
+}
+
+static const struct i2c_device_id mt9v113_id[] = {
+	{ MT9V113_MODULE_NAME, 0 },
+	{ },
+};
+
+MODULE_DEVICE_TABLE(i2c, mt9v113_id);
+
+static struct i2c_driver mt9v113_i2c_driver = {
+	.driver = {
+		.name = MT9V113_MODULE_NAME,
+		.owner = THIS_MODULE,
+	},
+	.probe = mt9v113_probe,
+	.remove = __exit_p(mt9v113_remove),
+	.id_table = mt9v113_id,
+};
+
+static int __init mt9v113_init(void)
+{
+	return i2c_add_driver(&mt9v113_i2c_driver);
+}
+
+static void __exit mt9v113_cleanup(void)
+{
+	i2c_del_driver(&mt9v113_i2c_driver);
+}
+
+module_init(mt9v113_init);
+module_exit(mt9v113_cleanup);
+
+MODULE_AUTHOR("Texas Instruments");
+MODULE_DESCRIPTION("MT9V113 camera sensor driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/video/mt9v113_regs.h b/drivers/media/video/mt9v113_regs.h
new file mode 100644
index 0000000..64b065f
--- /dev/null
+++ b/drivers/media/video/mt9v113_regs.h
@@ -0,0 +1,294 @@
+/*
+ * drivers/media/video/mt9v113_regs.h
+ *
+ * Copyright (C) 2008 Texas Instruments Inc
+ * Author: Vaibhav Hiremath <hvaibhav@xxxxxx>
+ *
+ * Contributors:
+ *     Sivaraj R <sivaraj@xxxxxx>
+ *     Brijesh R Jadav <brijesh.j@xxxxxx>
+ *     Hardik Shah <hardik.shah@xxxxxx>
+ *     Manjunath Hadli <mrh@xxxxxx>
+ *     Karicheri Muralidharan <m-karicheri2@xxxxxx>
+ *
+ * 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 program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _MT9V113_REGS_H
+#define _MT9V113_REGS_H
+
+/*
+ * MT9V113 registers
+ */
+#define REG_CHIP_ID				(0x00)
+
+/*
+ * MT9V113 registers
+ */
+#define REG_INPUT_SEL			(0x00)
+#define REG_AFE_GAIN_CTRL		(0x01)
+#define REG_VIDEO_STD			(0x02)
+#define REG_OPERATION_MODE		(0x03)
+#define REG_AUTOSWITCH_MASK		(0x04)
+
+#define REG_COLOR_KILLER		(0x05)
+#define REG_LUMA_CONTROL1		(0x06)
+#define REG_LUMA_CONTROL2		(0x07)
+#define REG_LUMA_CONTROL3		(0x08)
+
+#define REG_BRIGHTNESS			(0x09)
+#define REG_CONTRAST			(0x0A)
+#define REG_SATURATION			(0x0B)
+#define REG_HUE				(0x0C)
+
+#define REG_CHROMA_CONTROL1		(0x0D)
+#define REG_CHROMA_CONTROL2		(0x0E)
+
+/* 0x0F Reserved */
+
+#define REG_COMP_PR_SATURATION		(0x10)
+#define REG_COMP_Y_CONTRAST		(0x11)
+#define REG_COMP_PB_SATURATION		(0x12)
+
+/* 0x13 Reserved */
+
+#define REG_COMP_Y_BRIGHTNESS		(0x14)
+
+/* 0x15 Reserved */
+
+#define REG_AVID_START_PIXEL_LSB	(0x16)
+#define REG_AVID_START_PIXEL_MSB	(0x17)
+#define REG_AVID_STOP_PIXEL_LSB		(0x18)
+#define REG_AVID_STOP_PIXEL_MSB		(0x19)
+
+#define REG_HSYNC_START_PIXEL_LSB	(0x1A)
+#define REG_HSYNC_START_PIXEL_MSB	(0x1B)
+#define REG_HSYNC_STOP_PIXEL_LSB	(0x1C)
+#define REG_HSYNC_STOP_PIXEL_MSB	(0x1D)
+
+#define REG_VSYNC_START_LINE_LSB	(0x1E)
+#define REG_VSYNC_START_LINE_MSB	(0x1F)
+#define REG_VSYNC_STOP_LINE_LSB		(0x20)
+#define REG_VSYNC_STOP_LINE_MSB		(0x21)
+
+#define REG_VBLK_START_LINE_LSB		(0x22)
+#define REG_VBLK_START_LINE_MSB		(0x23)
+#define REG_VBLK_STOP_LINE_LSB		(0x24)
+#define REG_VBLK_STOP_LINE_MSB		(0x25)
+
+/* 0x26 - 0x27 Reserved */
+
+#define REG_FAST_SWTICH_CONTROL		(0x28)
+
+/* 0x29 Reserved */
+
+#define REG_FAST_SWTICH_SCART_DELAY	(0x2A)
+
+/* 0x2B Reserved */
+
+#define REG_SCART_DELAY			(0x2C)
+#define REG_CTI_DELAY			(0x2D)
+#define REG_CTI_CONTROL			(0x2E)
+
+/* 0x2F - 0x31 Reserved */
+
+#define REG_SYNC_CONTROL		(0x32)
+#define REG_OUTPUT_FORMATTER1		(0x33)
+#define REG_OUTPUT_FORMATTER2		(0x34)
+#define REG_OUTPUT_FORMATTER3		(0x35)
+#define REG_OUTPUT_FORMATTER4		(0x36)
+#define REG_OUTPUT_FORMATTER5		(0x37)
+#define REG_OUTPUT_FORMATTER6		(0x38)
+#define REG_CLEAR_LOST_LOCK		(0x39)
+
+#define REG_STATUS1			(0x3A)
+#define REG_STATUS2			(0x3B)
+
+#define REG_AGC_GAIN_STATUS_LSB		(0x3C)
+#define REG_AGC_GAIN_STATUS_MSB		(0x3D)
+
+/* 0x3E Reserved */
+
+#define REG_VIDEO_STD_STATUS		(0x3F)
+#define REG_GPIO_INPUT1			(0x40)
+#define REG_GPIO_INPUT2			(0x41)
+
+/* 0x42 - 0x45 Reserved */
+
+#define REG_AFE_COARSE_GAIN_CH1		(0x46)
+#define REG_AFE_COARSE_GAIN_CH2		(0x47)
+#define REG_AFE_COARSE_GAIN_CH3		(0x48)
+#define REG_AFE_COARSE_GAIN_CH4		(0x49)
+
+#define REG_AFE_FINE_GAIN_PB_B_LSB	(0x4A)
+#define REG_AFE_FINE_GAIN_PB_B_MSB	(0x4B)
+#define REG_AFE_FINE_GAIN_Y_G_CHROMA_LSB	(0x4C)
+#define REG_AFE_FINE_GAIN_Y_G_CHROMA_MSB	(0x4D)
+#define REG_AFE_FINE_GAIN_PR_R_LSB	(0x4E)
+#define REG_AFE_FINE_GAIN_PR_R_MSB	(0x4F)
+#define REG_AFE_FINE_GAIN_CVBS_LUMA_LSB	(0x50)
+#define REG_AFE_FINE_GAIN_CVBS_LUMA_MSB	(0x51)
+
+/* 0x52 - 0x68 Reserved */
+
+#define REG_FBIT_VBIT_CONTROL1		(0x69)
+
+/* 0x6A - 0x6B Reserved */
+
+#define REG_BACKEND_AGC_CONTROL		(0x6C)
+
+/* 0x6D - 0x6E Reserved */
+
+#define REG_AGC_DECREMENT_SPEED_CONTROL	(0x6F)
+#define REG_ROM_VERSION			(0x70)
+
+/* 0x71 - 0x73 Reserved */
+
+#define REG_AGC_WHITE_PEAK_PROCESSING	(0x74)
+#define REG_FBIT_VBIT_CONTROL2		(0x75)
+#define REG_VCR_TRICK_MODE_CONTROL	(0x76)
+#define REG_HORIZONTAL_SHAKE_INCREMENT	(0x77)
+#define REG_AGC_INCREMENT_SPEED		(0x78)
+#define REG_AGC_INCREMENT_DELAY		(0x79)
+
+/* 0x7A - 0x7F Reserved */
+
+#define REG_CHIP_ID_MSB			(0x80)
+#define REG_CHIP_ID_LSB			(0x81)
+
+/* 0x82 Reserved */
+
+#define REG_CPLL_SPEED_CONTROL		(0x83)
+
+/* 0x84 - 0x96 Reserved */
+
+#define REG_STATUS_REQUEST		(0x97)
+
+/* 0x98 - 0x99 Reserved */
+
+#define REG_VERTICAL_LINE_COUNT_LSB	(0x9A)
+#define REG_VERTICAL_LINE_COUNT_MSB	(0x9B)
+
+/* 0x9C - 0x9D Reserved */
+
+#define REG_AGC_DECREMENT_DELAY		(0x9E)
+
+/* 0x9F - 0xB0 Reserved */
+
+#define REG_VDP_TTX_FILTER_1_MASK1	(0xB1)
+#define REG_VDP_TTX_FILTER_1_MASK2	(0xB2)
+#define REG_VDP_TTX_FILTER_1_MASK3	(0xB3)
+#define REG_VDP_TTX_FILTER_1_MASK4	(0xB4)
+#define REG_VDP_TTX_FILTER_1_MASK5	(0xB5)
+#define REG_VDP_TTX_FILTER_2_MASK1	(0xB6)
+#define REG_VDP_TTX_FILTER_2_MASK2	(0xB7)
+#define REG_VDP_TTX_FILTER_2_MASK3	(0xB8)
+#define REG_VDP_TTX_FILTER_2_MASK4	(0xB9)
+#define REG_VDP_TTX_FILTER_2_MASK5	(0xBA)
+#define REG_VDP_TTX_FILTER_CONTROL	(0xBB)
+#define REG_VDP_FIFO_WORD_COUNT		(0xBC)
+#define REG_VDP_FIFO_INTERRUPT_THRLD	(0xBD)
+
+/* 0xBE Reserved */
+
+#define REG_VDP_FIFO_RESET		(0xBF)
+#define REG_VDP_FIFO_OUTPUT_CONTROL	(0xC0)
+#define REG_VDP_LINE_NUMBER_INTERRUPT	(0xC1)
+#define REG_VDP_PIXEL_ALIGNMENT_LSB	(0xC2)
+#define REG_VDP_PIXEL_ALIGNMENT_MSB	(0xC3)
+
+/* 0xC4 - 0xD5 Reserved */
+
+#define REG_VDP_LINE_START		(0xD6)
+#define REG_VDP_LINE_STOP		(0xD7)
+#define REG_VDP_GLOBAL_LINE_MODE	(0xD8)
+#define REG_VDP_FULL_FIELD_ENABLE	(0xD9)
+#define REG_VDP_FULL_FIELD_MODE		(0xDA)
+
+/* 0xDB - 0xDF Reserved */
+
+#define REG_VBUS_DATA_ACCESS_NO_VBUS_ADDR_INCR	(0xE0)
+#define REG_VBUS_DATA_ACCESS_VBUS_ADDR_INCR	(0xE1)
+#define REG_FIFO_READ_DATA			(0xE2)
+
+/* 0xE3 - 0xE7 Reserved */
+
+#define REG_VBUS_ADDRESS_ACCESS1	(0xE8)
+#define REG_VBUS_ADDRESS_ACCESS2	(0xE9)
+#define REG_VBUS_ADDRESS_ACCESS3	(0xEA)
+
+/* 0xEB - 0xEF Reserved */
+
+#define REG_INTERRUPT_RAW_STATUS0	(0xF0)
+#define REG_INTERRUPT_RAW_STATUS1	(0xF1)
+#define REG_INTERRUPT_STATUS0		(0xF2)
+#define REG_INTERRUPT_STATUS1		(0xF3)
+#define REG_INTERRUPT_MASK0		(0xF4)
+#define REG_INTERRUPT_MASK1		(0xF5)
+#define REG_INTERRUPT_CLEAR0		(0xF6)
+#define REG_INTERRUPT_CLEAR1		(0xF7)
+
+/* 0xF8 - 0xFF Reserved */
+
+/* The ID values we are looking for */
+#define MT9V113_CHIP_ID_MSB		(0x51)
+
+#define MT9V113_IMAGE_STD_VGA			(0x01)
+#define MT9V113_IMAGE_STD_QVGA			(0x02)
+#define MT9V113_IMAGE_STD_INVALID		(0xFF)
+
+/*
+ * Status bit
+ */
+#define STATUS_TV_VCR_BIT		(1<<0)
+#define STATUS_HORZ_SYNC_LOCK_BIT	(1<<1)
+#define STATUS_VIRT_SYNC_LOCK_BIT	(1<<2)
+#define STATUS_CLR_SUBCAR_LOCK_BIT	(1<<3)
+#define STATUS_LOST_LOCK_DETECT_BIT	(1<<4)
+#define STATUS_FEILD_RATE_BIT		(1<<5)
+#define STATUS_LINE_ALTERNATING_BIT	(1<<6)
+#define STATUS_PEAK_WHITE_DETECT_BIT	(1<<7)
+
+/* Tokens for register write */
+#define TOK_WRITE                       (0)     /* token for write operation */
+#define TOK_TERM                        (1)     /* terminating token */
+#define TOK_DELAY                       (2)     /* delay token for reg list */
+#define TOK_SKIP                        (3)     /* token to skip a register */
+/**
+ * struct mt9v113_reg - Structure for TVP5146/47 register initialization values
+ * @token - Token: TOK_WRITE, TOK_TERM etc..
+ * @reg - Register offset
+ * @val - Register Value for TOK_WRITE or delay in ms for TOK_DELAY
+ */
+struct mt9v113_reg {
+	unsigned short token;
+	unsigned short reg;
+	unsigned short val;
+};
+
+/**
+ * struct mt9v113_init_seq - Structure for TVP5146/47/46M2/47M1 power up
+ *		Sequence.
+ * @ no_regs - Number of registers to write for power up sequence.
+ * @ init_reg_seq - Array of registers and respective value to write.
+ */
+struct mt9v113_init_seq {
+	unsigned int no_regs;
+	const struct mt9v113_reg *init_reg_seq;
+};
+
+#define MT9V113_CHIP_ID			(0x2280)
+
+#endif				/* ifndef _MT9V113_REGS_H */
diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c
index 39d501b..cc62f66 100644
--- a/drivers/media/video/omap3isp/ispccdc.c
+++ b/drivers/media/video/omap3isp/ispccdc.c
@@ -57,6 +57,8 @@ static const unsigned int ccdc_fmts[] = {
 	V4L2_MBUS_FMT_SRGGB12_1X12,
 	V4L2_MBUS_FMT_SBGGR12_1X12,
 	V4L2_MBUS_FMT_SGBRG12_1X12,
+        V4L2_MBUS_FMT_UYVY8_2X8,
+        V4L2_MBUS_FMT_YUYV8_2X8,
 };
 
 /*
@@ -1176,7 +1178,13 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc)
 	else
 		syn_mode &= ~ISPCCDC_SYN_MODE_PACK8;
 
-	isp_reg_writel(isp, syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE);
+       if ((format->code == V4L2_MBUS_FMT_YUYV8_2X8) ||
+                       (format->code == V4L2_MBUS_FMT_UYVY8_2X8))
+               syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR16;
+       else
+               syn_mode &= ~ISPCCDC_SYN_MODE_INPMOD_MASK;
+
+       isp_reg_writel(isp, syn_mode, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_SYN_MODE);
 
 	/* Mosaic filter */
 	switch (format->code) {
diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c
index 9cd8f1a..b47fb6e 100644
--- a/drivers/media/video/omap3isp/ispvideo.c
+++ b/drivers/media/video/omap3isp/ispvideo.c
@@ -97,9 +97,12 @@ static struct isp_format_info formats[] = {
 	{ V4L2_MBUS_FMT_UYVY8_1X16, V4L2_MBUS_FMT_UYVY8_1X16,
 	  V4L2_MBUS_FMT_UYVY8_1X16, 0,
 	  V4L2_PIX_FMT_UYVY, 16, },
-	{ V4L2_MBUS_FMT_YUYV8_1X16, V4L2_MBUS_FMT_YUYV8_1X16,
-	  V4L2_MBUS_FMT_YUYV8_1X16, 0,
+	{ V4L2_MBUS_FMT_YUYV8_2X8, V4L2_MBUS_FMT_YUYV8_2X8,
+	  V4L2_MBUS_FMT_YUYV8_2X8, 0,
 	  V4L2_PIX_FMT_YUYV, 16, },
+	{ V4L2_MBUS_FMT_UYVY8_2X8, V4L2_MBUS_FMT_UYVY8_2X8,
+	  V4L2_MBUS_FMT_UYVY8_2X8, 0,
+	  V4L2_PIX_FMT_UYVY, 16, },
 };
 
 const struct isp_format_info *
diff --git a/include/media/mt9v113.h b/include/media/mt9v113.h
new file mode 100644
index 0000000..0d37f17
--- /dev/null
+++ b/include/media/mt9v113.h
@@ -0,0 +1,70 @@
+/*
+ * drivers/media/video/mt9v113.h
+ *
+ * Copyright (C) 2008 Texas Instruments Inc
+ * Author: Vaibhav Hiremath <hvaibhav@xxxxxx>
+ *
+ * Contributors:
+ *     Sivaraj R <sivaraj@xxxxxx>
+ *     Brijesh R Jadav <brijesh.j@xxxxxx>
+ *     Hardik Shah <hardik.shah@xxxxxx>
+ *     Manjunath Hadli <mrh@xxxxxx>
+ *     Karicheri Muralidharan <m-karicheri2@xxxxxx>
+ *
+ * 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 program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifndef _MT9V113_H
+#define _MT9V113_H
+
+#include <media/v4l2-subdev.h>
+#include <media/media-entity.h>
+
+/*
+ * Other macros
+ */
+#define MT9V113_MODULE_NAME		"mt9v113"
+
+/* Number of pixels and number of lines per frame for different standards */
+#define VGA_NUM_ACTIVE_PIXELS		640
+#define VGA_NUM_ACTIVE_LINES		480
+#define QVGA_NUM_ACTIVE_PIXELS		320
+#define QVGA_NUM_ACTIVE_LINES		240
+
+struct mt9v113_platform_data {
+	int (*s_power)(struct v4l2_subdev *subdev, int on);
+	int (*set_xclk)(struct v4l2_subdev *subdev, int hz);
+	int (*configure_interface)(struct v4l2_subdev *subdev, u32 pixclk);
+};
+
+/*i2c adress for MT9V113*/
+#define MT9V113_I2C_ADDR		(0x78 >> 1)
+
+#define I2C_ONE_BYTE_TRANSFER		(1)
+#define I2C_TWO_BYTE_TRANSFER		(2)
+#define I2C_THREE_BYTE_TRANSFER		(3)
+#define I2C_FOUR_BYTE_TRANSFER		(4)
+#define I2C_TXRX_DATA_MASK		(0x00FF)
+#define I2C_TXRX_DATA_MASK_UPPER	(0xFF00)
+#define I2C_TXRX_DATA_SHIFT		(8)
+
+#define MT9V113_VGA_30FPS  (1130)
+#define MT9V113_QVGA_30FPS  (1131)
+
+#define MT9V113_CLK_MAX		(54000000) /* 54MHz */
+#define MT9V113_CLK_MIN		(6000000)  /* 6Mhz */
+
+#endif				/* ifndef _MT9V113_H */
+
diff --git a/include/media/v4l2-chip-ident.h b/include/media/v4l2-chip-ident.h
index b3edb67..a3446cf 100644
--- a/include/media/v4l2-chip-ident.h
+++ b/include/media/v4l2-chip-ident.h
@@ -297,6 +297,7 @@ enum {
 	V4L2_IDENT_MT9T112		= 45022,
 	V4L2_IDENT_MT9V111		= 45031,
 	V4L2_IDENT_MT9V112		= 45032,
+	V4L2_IDENT_MT9V113              = 45033,
 
 	/* HV7131R CMOS sensor: just ident 46000 */
 	V4L2_IDENT_HV7131R		= 46000,
-- 
1.7.0.4

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


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux