V4L/DVB (10787): gspca - mars: Bad webcam register values tied to saturation.

Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/video/gspca/mars.c b/drivers/media/video/gspca/mars.c
index 7f605ce..ce065d3 100644
--- a/drivers/media/video/gspca/mars.c
+++ b/drivers/media/video/gspca/mars.c
@@ -69,10 +69,10 @@
 		.id      = V4L2_CID_SATURATION,
 		.type    = V4L2_CTRL_TYPE_INTEGER,
 		.name    = "Color",
-		.minimum = 0,
-		.maximum = 220,
+		.minimum = 1,
+		.maximum = 255,
 		.step    = 1,
-#define COLOR_DEF 190
+#define COLOR_DEF 200
 		.default_value = COLOR_DEF,
 	    },
 	    .set = sd_setcolors,
@@ -191,7 +191,7 @@
 	struct sd *sd = (struct sd *) gspca_dev;
 	int err_code;
 	u8 *data;
-	int i, val;
+	int i;
 
 	data = gspca_dev->usb_buf;
 
@@ -247,9 +247,11 @@
 	data[0] = 0x5e;		/* address */
 	data[1] = 0;		/* reg 94, Y Gain (auto) */
 /*jfm: from win trace*/
-	val = sd->colors * 0x40 + 0x400;
-	data[2] = val;		/* reg 0x5f/0x60 (LE) = saturation */
-	data[3] = val >> 8;
+				/* reg 0x5f/0x60 (LE) = saturation */
+				/* h (60): xxxx x100
+				 * l (5f): xxxx x000 */
+	data[2] = sd->colors << 3;
+	data[3] = ((sd->colors >> 2) & 0xf8) | 0x04;
 	data[4] = sd->brightness; /* reg 0x61 = brightness */
 	data[5] = 0x00;
 
@@ -365,10 +367,11 @@
 
 	sd->colors = val;
 	if (gspca_dev->streaming) {
-		val = val * 0x40 + 0x400;
+
+		/* see sd_start */
 		gspca_dev->usb_buf[0] = 0x5f;
-		gspca_dev->usb_buf[1] = val;
-		gspca_dev->usb_buf[2] = val >> 8;
+		gspca_dev->usb_buf[1] = sd->colors << 3;
+		gspca_dev->usb_buf[2] = ((sd->colors >> 2) & 0xf8) | 0x04;
 		reg_w(gspca_dev, 3);
 	}
 	return 0;