The patch number 11642 was added via Erik Andr?n <erik.and...@gmail.com>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Erik Andr?n  <erik.and...@gmail.com>
gspca - m5602-ov7660: Add a gain ctrl


Priority: normal

Signed-off-by: Erik Andr?n <erik.and...@gmail.com>


---

 linux/drivers/media/video/gspca/m5602/m5602_ov7660.c |   65 ++++++++++-
 linux/drivers/media/video/gspca/m5602/m5602_ov7660.h |    2 
 2 files changed, 62 insertions(+), 5 deletions(-)

diff -r ea2e457dd811 -r a92bc67f1c7d 
linux/drivers/media/video/gspca/m5602/m5602_ov7660.c
--- a/linux/drivers/media/video/gspca/m5602/m5602_ov7660.c      Thu Jan 22 
07:57:30 2009 +0100
+++ b/linux/drivers/media/video/gspca/m5602/m5602_ov7660.c      Thu Jan 22 
08:04:59 2009 +0100
@@ -18,7 +18,26 @@
 
 #include "m5602_ov7660.h"
 
-const static struct ctrl ov7660_ctrls[] = {};
+static int ov7660_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
+static int ov7660_set_gain(struct gspca_dev *gspca_dev, __s32 val);
+
+const static struct ctrl ov7660_ctrls[] = {
+#define GAIN_IDX 1
+       {
+               {
+                       .id             = V4L2_CID_GAIN,
+                       .type           = V4L2_CTRL_TYPE_INTEGER,
+                       .name           = "gain",
+                       .minimum        = 0x00,
+                       .maximum        = 0xff,
+                       .step           = 0x1,
+                       .default_value  = DEFAULT_GAIN,
+                       .flags          = V4L2_CTRL_FLAG_SLIDER
+               },
+               .set = ov7660_set_gain,
+               .get = ov7660_get_gain
+       },
+};
 
 static struct v4l2_pix_format ov7660_modes[] = {
        {
@@ -85,6 +104,11 @@ int ov7660_probe(struct sd *sd)
        return -ENODEV;
 
 sensor_found:
+       sensor_settings = kmalloc(
+               ARRAY_SIZE(ov7660_ctrls) * sizeof(s32), GFP_KERNEL);
+       if (!sensor_settings)
+               return -ENOMEM;
+
        sd->gspca_dev.cam.cam_mode = ov7660_modes;
        sd->gspca_dev.cam.nmodes = ARRAY_SIZE(ov7660_modes);
        sd->desc->ctrls = ov7660_ctrls;
@@ -100,6 +124,7 @@ int ov7660_init(struct sd *sd)
 int ov7660_init(struct sd *sd)
 {
        int i, err = 0;
+       s32 *sensor_settings = sd->sensor_priv;
 
        /* Init the sensor */
        for (i = 0; i < ARRAY_SIZE(init_ov7660); i++) {
@@ -119,6 +144,10 @@ int ov7660_init(struct sd *sd)
        if (dump_sensor)
                ov7660_dump_registers(sd);
 
+       err = ov7660_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]);
+       if (err < 0)
+               return err;
+
        return err;
 }
 
@@ -132,7 +161,38 @@ int ov7660_stop(struct sd *sd)
        return 0;
 }
 
-void ov7660_disconnect(struct sd *sd) {}
+void ov7660_disconnect(struct sd *sd)
+{
+       ov7660_stop(sd);
+
+       sd->sensor = NULL;
+       kfree(sd->sensor_priv);
+}
+
+static int ov7660_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
+
+       *val = sensor_settings[GAIN_IDX];
+       PDEBUG(D_V4L2, "Read gain %d", *val);
+       return 0;
+}
+
+static int ov7660_set_gain(struct gspca_dev *gspca_dev, __s32 val)
+{
+       int err;
+       u8 i2c_data;
+       struct sd *sd = (struct sd *) gspca_dev;
+       s32 *sensor_settings = sd->sensor_priv;
+
+       PDEBUG(D_V4L2, "Setting gain to %d", val);
+
+       sensor_settings[GAIN_IDX] = val;
+
+       err = m5602_write_sensor(sd, OV7660_GAIN, &i2c_data, 1);
+       return err;
+}
 
 static void ov7660_dump_registers(struct sd *sd)
 {
@@ -165,4 +225,3 @@ static void ov7660_dump_registers(struct
                m5602_write_sensor(sd, address, &old_value, 1);
        }
 }
-
diff -r ea2e457dd811 -r a92bc67f1c7d 
linux/drivers/media/video/gspca/m5602/m5602_ov7660.h
--- a/linux/drivers/media/video/gspca/m5602/m5602_ov7660.h      Thu Jan 22 
07:57:30 2009 +0100
+++ b/linux/drivers/media/video/gspca/m5602/m5602_ov7660.h      Thu Jan 22 
08:04:59 2009 +0100
@@ -179,7 +179,6 @@ static const unsigned char init_ov7660[]
 
        {SENSOR, OV7660_AECH, DEFAULT_EXPOSURE},
        {SENSOR, OV7660_COM1, 0x00},
-       {SENSOR, OV7660_GAIN, DEFAULT_GAIN},
 
        {BRIDGE, M5602_XB_GPIO_DIR, 0x01},
        {BRIDGE, M5602_XB_GPIO_DAT, 0x04},
@@ -262,7 +261,6 @@ static const unsigned char init_ov7660[]
 
        {SENSOR, OV7660_AECH, 0x20},
        {SENSOR, OV7660_COM1, 0x00},
-       {SENSOR, OV7660_GAIN, DEFAULT_GAIN},
        {SENSOR, OV7660_OFON, 0x0c},
        {SENSOR, OV7660_COM2, 0x11},
        {SENSOR, OV7660_COM7, 0x05},


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/a92bc67f1c7de0d47dabec4ea2a7ee47f173415e

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to