diff mbox

Problem with gspca and zc3xx

Message ID 4B4BA01D.80005@redhat.com (mailing list archive)
State RFC
Headers show

Commit Message

Hans de Goede Jan. 11, 2010, 10:03 p.m. UTC
None
diff mbox

Patch

diff -r 70b1d636a39a linux/drivers/media/video/gspca/zc3xx.c
--- a/linux/drivers/media/video/gspca/zc3xx.c	Sun Jan 10 23:34:57 2010 +0100
+++ b/linux/drivers/media/video/gspca/zc3xx.c	Mon Jan 11 22:44:45 2010 +0100
@@ -194,6 +194,34 @@ 
 		.priv = 0},
 };
 
+/* VGA with last 8 lines missing */
+static const struct v4l2_pix_format broken_vga_mode[] = {
+	{320, 232, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
+		.bytesperline = 320,
+		.sizeimage = 320 * 232 * 3 / 8 + 590,
+		.colorspace = V4L2_COLORSPACE_JPEG,
+		.priv = 1},
+	{640, 472, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
+		.bytesperline = 640,
+		.sizeimage = 640 * 472 * 3 / 8 + 590,
+		.colorspace = V4L2_COLORSPACE_JPEG,
+		.priv = 0},
+};
+
+/* VGA with last 8 lines missing in 320x240 mode */
+static const struct v4l2_pix_format pas202b_vga_mode[] = {
+	{320, 232, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
+		.bytesperline = 320,
+		.sizeimage = 320 * 232 * 3 / 8 + 590,
+		.colorspace = V4L2_COLORSPACE_JPEG,
+		.priv = 1},
+	{640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
+		.bytesperline = 640,
+		.sizeimage = 640 * 480 * 3 / 8 + 590,
+		.colorspace = V4L2_COLORSPACE_JPEG,
+		.priv = 0},
+};
+
 static const struct v4l2_pix_format sif_mode[] = {
 	{176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
 		.bytesperline = 176,
@@ -6651,7 +6679,8 @@ 
 	struct sd *sd = (struct sd *) gspca_dev;
 	struct cam *cam;
 	int sensor;
-	int vga = 1;		/* 1: vga, 0: sif */
+	/* 0: sif, 1: vga, 2: 640x472, 320x232, 3: 640x480, 320x232 */
+	int vga = 1;
 	static const __u8 gamma[SENSOR_MAX] = {
 		4,	/* SENSOR_ADCM2700 0 */
 		4,	/* SENSOR_CS2102 1 */
@@ -6689,6 +6718,7 @@ 
 			switch (sd->sensor) {
 			case SENSOR_MC501CB:
 				PDEBUG(D_PROBE, "Sensor MC501CB");
+				vga = 2; /* last 8 lines missing */
 				break;
 			case SENSOR_TAS5130C_VF0250:
 				PDEBUG(D_PROBE, "Sensor Tas5130 (VF0250)");
@@ -6729,6 +6759,7 @@ 
 			PDEBUG(D_PROBE, "Find Sensor PAS202B");
 			sd->sensor = SENSOR_PAS202B;
 			sd->sharpness = 1;
+			vga = 3; /* broken 320x240 (can only do 320x232) */
 			break;
 		case 0x0f:
 			PDEBUG(D_PROBE, "Find Sensor PAS106");
@@ -6765,6 +6796,7 @@ 
 		case 0x16:
 			PDEBUG(D_PROBE, "Find Sensor ADCM2700");
 			sd->sensor = SENSOR_ADCM2700;
+			vga = 2; /* last 8 lines missing */
 			break;
 		case 0x29:
 			PDEBUG(D_PROBE, "Find Sensor GC0305");
@@ -6782,6 +6814,7 @@ 
 		case 0x7620:
 			PDEBUG(D_PROBE, "Find Sensor OV7620");
 			sd->sensor = SENSOR_OV7620;
+			vga = 2; /* last 8 lines missing */
 			break;
 		case 0x7631:
 			PDEBUG(D_PROBE, "Find Sensor OV7630C");
@@ -6790,6 +6823,7 @@ 
 		case 0x7648:
 			PDEBUG(D_PROBE, "Find Sensor OV7648");
 			sd->sensor = SENSOR_OV7620;	/* same sensor (?) */
+			vga = 2; /* last 8 lines missing */
 			break;
 		default:
 			PDEBUG(D_ERR|D_PROBE, "Unknown sensor %04x", sensor);
@@ -6807,12 +6841,23 @@ 
 	cam = &gspca_dev->cam;
 /*fixme:test*/
 	gspca_dev->nbalt--;
-	if (vga) {
+	switch (vga) {
+	case 0:
+		cam->cam_mode = sif_mode;
+		cam->nmodes = ARRAY_SIZE(sif_mode);
+		break;
+	case 1:
 		cam->cam_mode = vga_mode;
 		cam->nmodes = ARRAY_SIZE(vga_mode);
-	} else {
-		cam->cam_mode = sif_mode;
-		cam->nmodes = ARRAY_SIZE(sif_mode);
+		break;
+	case 2:
+		cam->cam_mode = broken_vga_mode;
+		cam->nmodes = ARRAY_SIZE(broken_vga_mode);
+		break;
+	case 3:
+		cam->cam_mode = pas202b_vga_mode;
+		cam->nmodes = ARRAY_SIZE(pas202b_vga_mode);
+		break;
 	}
 	sd->brightness = sd_ctrls[SD_BRIGHTNESS].qctrl.default_value;
 	sd->contrast = sd_ctrls[SD_CONTRAST].qctrl.default_value;