aboutsummaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0032-MT9V113-Fixed-sensor-nitialization-issues.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0032-MT9V113-Fixed-sensor-nitialization-issues.patch')
-rw-r--r--extras/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0032-MT9V113-Fixed-sensor-nitialization-issues.patch294
1 files changed, 294 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0032-MT9V113-Fixed-sensor-nitialization-issues.patch b/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0032-MT9V113-Fixed-sensor-nitialization-issues.patch
new file mode 100644
index 00000000..72d9aa66
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0032-MT9V113-Fixed-sensor-nitialization-issues.patch
@@ -0,0 +1,294 @@
+From d35c02203462b5c94c7be1abeba9be2a175646fe Mon Sep 17 00:00:00 2001
+From: Vaibhav Hiremath <hvaibhav@ti.com>
+Date: Fri, 9 Jul 2010 17:38:09 +0530
+Subject: [PATCH 32/75] MT9V113: Fixed sensor nitialization issues
+
+With this patch sensor is now able to generate HS, VS and pixel clock, also
+CCDC is able to generate HS/VS, VD0, VD1 interrupts.
+
+There are some issues with Buffer processing in ISR routine because of which
+DQBUF still hangs.
+---
+ drivers/media/video/mt9v113.c | 155 ++++++++++++++++++++----------------
+ drivers/media/video/omap34xxcam.c | 2 +-
+ 2 files changed, 87 insertions(+), 70 deletions(-)
+
+diff --git a/drivers/media/video/mt9v113.c b/drivers/media/video/mt9v113.c
+index 755a88a..8f8ba35 100644
+--- a/drivers/media/video/mt9v113.c
++++ b/drivers/media/video/mt9v113.c
+@@ -389,8 +389,8 @@ static int mt9v113_read_reg(struct i2c_client *client, unsigned short reg)
+ err = -ENODEV;
+ return err;
+ }else {
+- // TODO: addr should be set up where else
+- msg->addr = MT9V113_I2C_ADDR;//client->addr;
++ /* TODO: addr should be set up where else client->addr */
++ msg->addr = MT9V113_I2C_ADDR;
+ msg->flags = 0;
+ msg->len = I2C_TWO_BYTE_TRANSFER;
+ msg->buf = data;
+@@ -432,8 +432,8 @@ static int mt9v113_write_reg(struct i2c_client *client, unsigned short reg, unsi
+ if (!client->adapter) {
+ err = -ENODEV;
+ } else {
+- // TODO: addr should be set up where else
+- msg->addr = MT9V113_I2C_ADDR;//client->addr;
++ /* TODO:addr should be set up where else client->addr */
++ msg->addr = MT9V113_I2C_ADDR;
+ msg->flags = 0;
+ msg->len = I2C_FOUR_BYTE_TRANSFER;
+ msg->buf = data;
+@@ -446,51 +446,11 @@ static int mt9v113_write_reg(struct i2c_client *client, unsigned short reg, unsi
+ err = i2c_transfer(client->adapter, msg, 1);
+ }
+ }
+- if (err < 0) {
++ if (err < 0)
+ printk(KERN_INFO "\n I2C write failed");
+- }
+- return err;
+-}
+-
+-/* configure mux, for DM355 EVM only */
+-#ifndef CONFIG_MACH_DM355_LEOPARD
+-static int mt9v113_en_mux(struct i2c_client *client)
+-{
+- int err = 0;
+- int trycnt = 0;
+- /* unsigned short readval = 0;*/
+-
+- struct i2c_msg msg[1];
+- unsigned char data[4];
+- err = -1;
+- printk(KERN_INFO
+- "\n entering mt9v113_en_mux \n");
+-
+- while ((err < 0) && (trycnt < 5)) {
+- trycnt++;
+- if (!client->adapter) {
+- err = -ENODEV;
+- } else {
+- msg->addr = 0x25;
+- msg->flags = 0;
+- msg->len = I2C_TWO_BYTE_TRANSFER;
+- msg->buf = data;
+- data[0] = (unsigned char)(0x08 & I2C_TXRX_DATA_MASK);
+- data[1] = (unsigned char)(0x80 & I2C_TXRX_DATA_MASK);
+
+- err = i2c_transfer(client->adapter, msg, 1);
+- if (err < 0) {
+- printk(KERN_INFO
+- "\n ERROR in ECP register write\n");
+- }
+- }
+- }
+- if (err < 0) {
+- printk(KERN_INFO "\n I2C write failed");
+- }
+ return err;
+ }
+-#endif
+
+ /*
+ * mt9v113_write_regs : Initializes a list of registers
+@@ -550,9 +510,10 @@ static int mt9v113_configure(struct mt9v113_decoder *decoder)
+ if (err)
+ return err;
+
+-// if (debug)
+-// mt9v113_reg_dump(decoder);
+-
++#if 0
++ if (debug)
++ mt9v113_reg_dump(decoder);
++#endif
+ return 0;
+ }
+
+@@ -573,6 +534,62 @@ static int mt9v113_vga_mode(struct mt9v113_decoder *decoder)
+ }
+
+
++/**
++ * ioctl_enum_framesizes - V4L2 sensor if handler for vidioc_int_enum_framesizes
++ * @s: pointer to standard V4L2 device structure
++ * @frms: pointer to standard V4L2 framesizes enumeration structure
++ *
++ * Returns possible framesizes depending on choosen pixel format
++ **/
++static int ioctl_enum_framesizes(struct v4l2_int_device *s,
++ struct v4l2_frmsizeenum *frms)
++{
++ struct mt9v113_decoder *decoder = s->priv;
++ int ifmt;
++
++ for (ifmt = 0; ifmt < decoder->num_fmts; ifmt++) {
++ if (frms->pixel_format == decoder->fmt_list[ifmt].pixelformat)
++ break;
++ }
++ /* Is requested pixelformat not found on sensor? */
++ if (ifmt == decoder->num_fmts)
++ return -EINVAL;
++
++ /* Do we already reached all discrete framesizes? */
++ if (frms->index >= decoder->num_stds)
++ return -EINVAL;
++
++ frms->type = V4L2_FRMSIZE_TYPE_DISCRETE;
++ frms->discrete.width = decoder->std_list[frms->index].width;
++ frms->discrete.height = decoder->std_list[frms->index].height;
++
++ return 0;
++
++}
++
++static int ioctl_enum_frameintervals(struct v4l2_int_device *s,
++ struct v4l2_frmivalenum *frmi)
++{
++ struct mt9v113_decoder *decoder = s->priv;
++ int ifmt;
++
++ if (frmi->index >= 1)
++ return -EINVAL;
++
++ for (ifmt = 0; ifmt < decoder->num_fmts; ifmt++) {
++ if (frmi->pixel_format == decoder->fmt_list[ifmt].pixelformat)
++ break;
++ }
++ /* Is requested pixelformat not found on sensor? */
++ if (ifmt == decoder->num_fmts)
++ return -EINVAL;
++
++ frmi->type = V4L2_FRMSIZE_TYPE_DISCRETE;
++ frmi->discrete.numerator = 1;
++ frmi->discrete.denominator = 10;
++ return 0;
++}
++
+ /*
+ * 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)
+@@ -585,15 +602,9 @@ static int mt9v113_detect(struct mt9v113_decoder *decoder)
+ {
+ unsigned short val=0;
+
+-#ifndef CONFIG_MACH_DM355_LEOPARD
+-// mt9v113_en_mux(decoder->client);
+-#endif
+-
+ val = mt9v113_read_reg(decoder->client, REG_CHIP_ID);
+
+- v4l_dbg(1, debug, decoder->client,
+- "chip id detected 0x%x\n",
+- val);
++ v4l_dbg(1, debug, decoder->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
+@@ -1042,7 +1053,7 @@ ioctl_s_fmt_cap(struct v4l2_int_device *s, struct v4l2_format *f)
+ if (rval)
+ return rval;
+
+- decoder->pix = *pix;
++ decoder->pix = *pix;
+
+ return rval;
+ }
+@@ -1177,7 +1188,7 @@ static int ioctl_g_ifparm(struct v4l2_int_device *s, struct v4l2_ifparm *p)
+ return rval;
+ }
+
+- p->u.bt656.clock_curr = 27000000; // TODO: read clock rate from sensor
++ p->u.bt656.clock_curr = 27000000; /* TODO:read clock rate from sensor */
+
+ return 0;
+ }
+@@ -1211,12 +1222,17 @@ static int ioctl_s_power(struct v4l2_int_device *s, enum v4l2_power on)
+ struct mt9v113_decoder *decoder = s->priv;
+ int err = 0;
+
++ if (decoder->state == STATE_DETECTED)
++ return 0;
++
+ switch (on) {
+ case V4L2_POWER_OFF:
+ /* Power Down Sequence */
+- err =
+- mt9v113_write_reg(decoder->client, REG_OPERATION_MODE,
+- 0x01);
++/* TODO: FIXME: implement proper OFF and Standby code here */
++#if 0
++ err = mt9v113_write_reg(decoder->client, REG_OPERATION_MODE,
++ 0x01);
++#endif
+ /* Disable mux for mt9v113 data path */
+ if (decoder->pdata->power_set)
+ err |= decoder->pdata->power_set(s, on);
+@@ -1242,9 +1258,10 @@ static int ioctl_s_power(struct v4l2_int_device *s, enum v4l2_power on)
+ "Unable to detect decoder\n");
+ return err;
+ }
++ /* Only VGA mode for now */
++ err |= mt9v113_configure(decoder);
++ err |= mt9v113_vga_mode(decoder);
+ }
+- // Only VGA mode for now
+- err |= mt9v113_vga_mode(decoder);
+ break;
+
+ default:
+@@ -1263,14 +1280,11 @@ static int ioctl_s_power(struct v4l2_int_device *s, enum v4l2_power on)
+ */
+ static int ioctl_init(struct v4l2_int_device *s)
+ {
+-// struct mt9v113_decoder *decoder = s->priv;
++ struct mt9v113_decoder *decoder = s->priv;
+ int err = 0;
+
+- /* Set default standard to auto */
+- //mt9v113_reg_list[REG_VIDEO_STD].val =
+- // VIDEO_STD_AUTO_SWITCH_BIT;
+-// err |= mt9v113_configure(decoder);
+-// err |= mt9v113_vga_mode(decoder);
++ err |= mt9v113_configure(decoder);
++ err |= mt9v113_vga_mode(decoder);
+
+ return err;
+ }
+@@ -1298,7 +1312,6 @@ static int ioctl_dev_init(struct v4l2_int_device *s)
+ struct mt9v113_decoder *decoder = s->priv;
+ int err;
+
+- printk("%s: %d\n", __func__, __LINE__);
+ err = mt9v113_detect(decoder);
+ if (err < 0) {
+ v4l_err(decoder->client,
+@@ -1340,6 +1353,10 @@ static struct v4l2_int_ioctl_desc mt9v113_ioctl_desc[] = {
+ {vidioc_int_s_std_num, (v4l2_int_ioctl_func *) ioctl_s_std},
+ {vidioc_int_s_video_routing_num,
+ (v4l2_int_ioctl_func *) ioctl_s_routing},
++ {vidioc_int_enum_framesizes_num,
++ (v4l2_int_ioctl_func *)ioctl_enum_framesizes},
++ {vidioc_int_enum_frameintervals_num,
++ (v4l2_int_ioctl_func *)ioctl_enum_frameintervals},
+ };
+
+ static struct v4l2_int_slave mt9v113_slave = {
+diff --git a/drivers/media/video/omap34xxcam.c b/drivers/media/video/omap34xxcam.c
+index 6301ed3..2e8153b 100644
+--- a/drivers/media/video/omap34xxcam.c
++++ b/drivers/media/video/omap34xxcam.c
+@@ -1852,8 +1852,8 @@ static int omap34xxcam_open(struct file *file)
+ vdev->slave_config[OMAP34XXCAM_SLAVE_SENSOR]
+ .cur_input = route.input;
+ }
+- sensor_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
++ sensor_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+ /* Get the format the sensor is using. */
+ rval = vidioc_int_g_fmt_cap(vdev->vdev_sensor, &sensor_format);
+--
+1.6.6.1
+