rpms/kernel/devel linux-2.6-gspca-stv06xx-git.patch, NONE, 1.1 config-generic, 1.202, 1.203 kernel.spec, 1.1182, 1.1183 linux-2.6-gspca-git.patch, 1.1, 1.2

Hans de Goede jwrdegoede at fedoraproject.org
Fri Dec 26 12:46:20 UTC 2008


Author: jwrdegoede

Update of /cvs/extras/rpms/kernel/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv28167

Modified Files:
	config-generic kernel.spec linux-2.6-gspca-git.patch 
Added Files:
	linux-2.6-gspca-stv06xx-git.patch 
Log Message:
* Fri Dec 26 2008 Hans de Goede <hdegoede at redhat.com>
- Rebase gspca git patch to latest gspca git
- Re-enable gspca git patch
- Add gscpa-stv06xx (qc-usb replacement) driver from its own git tree


linux-2.6-gspca-stv06xx-git.patch:

--- NEW FILE linux-2.6-gspca-stv06xx-git.patch ---
diff -urpN linux/drivers/media/video/gspca/Kconfig linux/drivers/media/video/gspca/Kconfig
--- linux/drivers/media/video/gspca/Kconfig	2008-12-09 21:37:33.000000000 +0100
+++ linux/drivers/media/video/gspca/Kconfig	2008-12-25 17:09:06.000000000 +0100
@@ -18,6 +18,7 @@ menuconfig USB_GSPCA
 if USB_GSPCA && VIDEO_V4L2
 
 source "drivers/media/video/gspca/m5602/Kconfig"
+source "drivers/media/video/gspca/stv06xx/Kconfig"
 
 config USB_GSPCA_CONEX
 	tristate "Conexant Camera Driver"
diff -urpN linux/drivers/media/video/gspca/Makefile linux/drivers/media/video/gspca/Makefile
--- linux/drivers/media/video/gspca/Makefile	2008-12-09 21:37:33.000000000 +0100
+++ linux/drivers/media/video/gspca/Makefile	2008-12-25 17:09:06.000000000 +0100
@@ -47,4 +45,4 @@ gspca_vc032x-objs		:= vc032x.o
 gspca_zc3xx-objs		:= zc3xx.o
 
 obj-$(CONFIG_USB_M5602)		+= m5602/
-
+obj-$(CONFIG_USB_STV06XX) 	+= stv06xx/
diff -urpN linux/drivers/media/video/gspca/gspca.h linux/drivers/media/video/gspca/gspca.h
--- linux/drivers/media/video/gspca/gspca.h	2008-12-10 19:53:43.000000000 +0100
+++ linux/drivers/media/video/gspca/gspca.h	2008-12-25 20:55:35.000000000 +0100
@@ -56,7 +56,7 @@ extern int gspca_debug;
 /* device information - set at probe time */
 struct cam {
 	int bulk_size;		/* buffer size when image transfer by bulk */
-	struct v4l2_pix_format *cam_mode;	/* size nmodes */
+	const struct v4l2_pix_format *cam_mode;	/* size nmodes */
 	char nmodes;
 	__u8 bulk_nurbs;	/* number of URBs in bulk mode
 				 * - cannot be > MAX_NURBS
diff -urpN linux/drivers/media/video/gspca/stv06xx/Kconfig linux/drivers/media/video/gspca/stv06xx/Kconfig
--- linux/drivers/media/video/gspca/stv06xx/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux/drivers/media/video/gspca/stv06xx/Kconfig	2008-12-25 17:09:06.000000000 +0100
@@ -0,0 +1,8 @@
+config USB_STV06XX
+	tristate "ST USB STV06XX Camera Driver"
+	depends on VIDEO_V4L2 && USB_GSPCA
+	help
+	  Say Y here if you want support for cameras based on the ST STV06XX chip.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called gspca_stv06xx.
diff -urpN linux/drivers/media/video/gspca/stv06xx/Makefile linux/drivers/media/video/gspca/stv06xx/Makefile
--- linux/drivers/media/video/gspca/stv06xx/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux/drivers/media/video/gspca/stv06xx/Makefile	2008-12-25 17:09:06.000000000 +0100
@@ -0,0 +1,8 @@
+obj-$(CONFIG_USB_STV06XX) += gspca_stv06xx.o
+
+gspca_stv06xx-objs := stv06xx.o \
+		      stv06xx_vv6410.o \
+		      stv06xx_hdcs.o \
+		      stv06xx_pb0100.o
+
+EXTRA_CFLAGS += -Idrivers/media/video/gspca
diff -urpN linux/drivers/media/video/gspca/stv06xx/stv06xx.c linux/drivers/media/video/gspca/stv06xx/stv06xx.c
--- linux/drivers/media/video/gspca/stv06xx/stv06xx.c	1970-01-01 01:00:00.000000000 +0100
+++ linux/drivers/media/video/gspca/stv06xx/stv06xx.c	2008-12-25 21:17:34.000000000 +0100
@@ -0,0 +1,522 @@
+/*
+ * Copyright (c) 2001 Jean-Fredric Clere, Nikolas Zimmermann, Georg Acher
+ *		      Mark Cave-Ayland, Carlo E Prelz, Dick Streefland
+ * Copyright (c) 2002, 2003 Tuukka Toivonen
+ * Copyright (c) 2008 Erik Andrén
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * P/N 861037:      Sensor HDCS1000        ASIC STV0600
+ * P/N 861050-0010: Sensor HDCS1000        ASIC STV0600
+ * P/N 861050-0020: Sensor Photobit PB100  ASIC STV0600-1 - QuickCam Express
+ * P/N 861055:      Sensor ST VV6410       ASIC STV0610   - LEGO cam
+ * P/N 861075-0040: Sensor HDCS1000        ASIC
+ * P/N 961179-0700: Sensor ST VV6410       ASIC STV0602   - Dexxa WebCam USB
+ * P/N 861040-0000: Sensor ST VV6410       ASIC STV0610   - QuickCam Web
+ */
+
+#include "stv06xx_sensor.h"
+
+MODULE_AUTHOR("Erik Andrén");
+MODULE_DESCRIPTION("STV06XX USB Camera Driver");
+MODULE_LICENSE("GPL");
+
+int dump_bridge;
+int dump_sensor;
+
+int stv06xx_write_bridge(struct sd *sd, u16 address, u16 i2c_data)
+{
+	int err;
+	struct usb_device *udev = sd->gspca_dev.dev;
+	__u8 *buf = sd->gspca_dev.usb_buf;
+	u8 len = (i2c_data > 0xff) ? 2 : 1;
+
+	buf[0] = i2c_data & 0xff;
+	buf[1] = (i2c_data >> 8) & 0xff;
+
+	err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+			      0x04, 0x40, address, 0, buf, len,
+			      STV06XX_URB_MSG_TIMEOUT);
+
+
+	PDEBUG(D_CONF, "Written 0x%x to address 0x%x, status: %d",
+	       i2c_data, address, err);
+
+	return (err < 0) ? err : 0;
+}
+
+int stv06xx_read_bridge(struct sd *sd, u16 address, u8 *i2c_data)
+{
+	int err;
+	struct usb_device *udev = sd->gspca_dev.dev;
+	__u8 *buf = sd->gspca_dev.usb_buf;
+
+	err = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+			      0x04, 0xc0, address, 0, buf, 1,
+			      STV06XX_URB_MSG_TIMEOUT);
+
+	*i2c_data = buf[0];
+
+	PDEBUG(D_CONF, "Read 0x%x from address 0x%x, status %d",
+	       *i2c_data, address, err);
+
+	return (err < 0) ? err : 0;
+}
+
+/* Wraps the normal write sensor bytes / words functions for writing a
+   single value */
+int stv06xx_write_sensor(struct sd *sd, u8 address, u16 value)
+{
+	if (sd->sensor->i2c_len == 2) {
+		u16 data[2] = { address, value };
+		return stv06xx_write_sensor_words(sd, data, 1);
+	} else {
+		u8 data[2] = { address, value };
+		return stv06xx_write_sensor_bytes(sd, data, 1);
+	}
+}
+
+static int stv06xx_write_sensor_finish(struct sd *sd)
+{
+	int err = 0;
+
+	if (IS_850(sd)) {
+		struct usb_device *udev = sd->gspca_dev.dev;
+		__u8 *buf = sd->gspca_dev.usb_buf;
+
+		/* Quickam Web needs an extra packet */
+		buf[0] = 0;
+		err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+				      0x04, 0x40, 0x1704, 0, buf, 1,
+				      STV06XX_URB_MSG_TIMEOUT);
+	}
+
+	return (err < 0) ? err : 0;
+}
+
+int stv06xx_write_sensor_bytes(struct sd *sd, const u8 *data, u8 len)
+{
+	int err, i, j;
+	struct usb_device *udev = sd->gspca_dev.dev;
+	__u8 *buf = sd->gspca_dev.usb_buf;
+
+	PDEBUG(D_USBO, "I2C: Command buffer contains %d entries", len);
+	for (i = 0; i < len;) {
+		/* Build the command buffer */
+		memset(buf, 0, I2C_BUFFER_LENGTH);
+		for (j = 0; j < I2C_MAX_BYTES && i < len; j++, i++) {
+			buf[j] = data[2*i];
+			buf[0x10 + j] = data[2*i+1];
+			PDEBUG(D_USBO, "I2C: Writing 0x%02x to reg 0x%02x",
+			data[2*i+1], data[2*i]);
+		}
+		buf[0x20] = sd->sensor->i2c_addr;
+		buf[0x21] = j - 1; /* Number of commands to send - 1 */
+		buf[0x22] = I2C_WRITE_CMD;
+		err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+				      0x04, 0x40, 0x0400, 0, buf,
+				      I2C_BUFFER_LENGTH,
+				      STV06XX_URB_MSG_TIMEOUT);
+				      if (err < 0)
+					return err;
+       }
+       return stv06xx_write_sensor_finish(sd);
+}
+
+int stv06xx_write_sensor_words(struct sd *sd, const u16 *data, u8 len)
+{
[...2502 lines suppressed...]
+
+/* Dark line offset cancellation enable */
+#define VV6410_DARKOFFSETSETUP		0x2e
+
+/* Video timing registers */
+/* Line Length (Pixel Clocks) */
+#define VV6410_LINELENGTHH		0x52
+#define VV6410_LINELENGTHL		0x53
+
+/* X-co-ordinate of top left corner of region of interest (x-offset) */
+#define VV6410_XOFFSETH			0x57
+#define VV6410_XOFFSETL			0x58
+
+/* Y-coordinate of top left corner of region of interest (y-offset) */
+#define VV6410_YOFFSETH			0x59
+#define VV6410_YOFFSETL			0x5a
+
+/* Field length (Lines) */
+#define VV6410_FIELDLENGTHH		0x61
+#define VV6410_FIELDLENGTHL		0x62
+
+/* System registers */
+/* Black offset cancellation default value */
+#define VV6410_BLACKOFFSETH		0x70
+#define VV6410_BLACKOFFSETL		0x71
+
+/* Black offset cancellation setup */
+#define VV6410_BLACKOFFSETSETUP		0x72
+
+/* Analog Control Register 0 */
+#define VV6410_CR0			0x75
+
+/* Analog Control Register 1 */
+#define VV6410_CR1			0x76
+
+/* ADC Setup Register */
+#define VV6410_AS0			0x77
+
+/* Analog Test Register */
+#define VV6410_AT0			0x78
+
+/* Audio Amplifier Setup Register */
+#define VV6410_AT1			0x79
+
+#define VV6410_HFLIP 			(1 << 3)
+#define VV6410_VFLIP 			(1 << 4)
+
+#define VV6410_LOW_POWER_MODE		(1 << 0)
+#define VV6410_SOFT_RESET		(1 << 2)
+#define VV6410_PAL_25_FPS		(0 << 3)
+
+#define VV6410_CLK_DIV_2		(1 << 1)
+
+#define VV6410_FINE_EXPOSURE		320
+#define VV6410_COARSE_EXPOSURE		192
+#define VV6410_DEFAULT_GAIN		11
+
+#define VV6410_SUBSAMPLE		0x01
+#define VV6410_CROP_TO_QVGA		0x02
+
+int vv6410_probe(struct sd *sd);
+int vv6410_start(struct sd *sd);
+int vv6410_init(struct sd *sd);
+int vv6410_stop(struct sd *sd);
+int vv6410_dump(struct sd *sd);
+
+/* V4L2 controls supported by the driver */
+int vv6410_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
+int vv6410_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
+int vv6410_get_vflip(struct gspca_dev *gspca_dev, __s32 *val);
+int vv6410_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
+int vv6410_get_analog_gain(struct gspca_dev *gspca_dev, __s32 *val);
+int vv6410_set_analog_gain(struct gspca_dev *gspca_dev, __s32 val);
+
+const struct stv06xx_sensor stv06xx_sensor_vv6410 = {
+	.name = "ST VV6410",
+	.i2c_flush = 5,
+	.i2c_addr = 0x20,
+	.i2c_len = 1,
+	.init = vv6410_init,
+	.probe = vv6410_probe,
+	.start = vv6410_start,
+	.stop = vv6410_stop,
+	.dump = vv6410_dump,
+
+	.nctrls = 3,
+	.ctrls = {
+	{
+		{
+			.id		= V4L2_CID_HFLIP,
+			.type		= V4L2_CTRL_TYPE_BOOLEAN,
+			.name		= "horizontal flip",
+			.minimum	= 0,
+			.maximum	= 1,
+			.step		= 1,
+			.default_value	= 0
+		},
+		.set = vv6410_set_hflip,
+		.get = vv6410_get_hflip
+	}, {
+		{
+			.id		= V4L2_CID_VFLIP,
+			.type		= V4L2_CTRL_TYPE_BOOLEAN,
+			.name		= "vertical flip",
+			.minimum	= 0,
+			.maximum	= 1,
+			.step		= 1,
+			.default_value 	= 0
+		},
+		.set = vv6410_set_vflip,
+		.get = vv6410_get_vflip
+	}, {
+		{
+			.id		= V4L2_CID_GAIN,
+			.type		= V4L2_CTRL_TYPE_INTEGER,
+			.name		= "analog gain",
+			.minimum	= 0,
+			.maximum	= 15,
+			.step		= 1,
+			.default_value  = 0
+		},
+		.set = vv6410_set_analog_gain,
+		.get = vv6410_get_analog_gain
+	}
+	},
+
+	.nmodes = 1,
+	.modes = {
+	{
+		356,
+		292,
+		V4L2_PIX_FMT_SGRBG8,
+		V4L2_FIELD_NONE,
+		.sizeimage =
+			356 * 292,
+		.bytesperline = 356,
+		.colorspace = V4L2_COLORSPACE_SRGB,
+		.priv = 0
+	}
+	}
+};
+
+/* If NULL, only single value to write, stored in len */
+struct stv_init {
+	const u8 *data;
+	u16 start;
+	u8 len;
+};
+
+static const u8 x1500[] = {	/* 0x1500 - 0x150f */
+	0x0b, 0xa7, 0xb7, 0x00, 0x00
+};
+
+static const u8 x1536[] = {	/* 0x1536 - 0x153b */
+	0x02, 0x00, 0x60, 0x01, 0x20, 0x01
+};
+
+static const u8 x15c1[] = {	/* 0x15c1 - 0x15c2 */
+	0xff, 0x03 /* Output word 0x03ff = 1023 (ISO size) */
+};
+
+static const struct stv_init stv_bridge_init[] = {
+	/* This reg is written twice. Some kind of reset? */
+	{NULL,  0x1620, 0x80},
+	{NULL,  0x1620, 0x00},
+	{NULL,  0x1423, 0x04},
+	{x1500, 0x1500, ARRAY_SIZE(x1500)},
+	{x1536, 0x1536, ARRAY_SIZE(x1536)},
+	{x15c1, 0x15c1, ARRAY_SIZE(x15c1)}
+};
+
+static const u8 vv6410_sensor_init[][2] = {
+	/* Setup registers */
+	{VV6410_SETUP0,		VV6410_SOFT_RESET},
+	{VV6410_SETUP0,		VV6410_LOW_POWER_MODE},
+	/* Use shuffled read-out mode */
+	{VV6410_SETUP1,		BIT(6)},
+	/* All modes to 1 */
+	{VV6410_FGMODES,	BIT(6) | BIT(4) | BIT(2) | BIT(0)},
+	{VV6410_PINMAPPING,	0x00},
+	/* Pre-clock generator divide off */
+	{VV6410_DATAFORMAT,	BIT(7) | BIT(0)},
+
+	/* Exposure registers */
+	{VV6410_FINEH,		VV6410_FINE_EXPOSURE >> 8},
+	{VV6410_FINEL,		VV6410_FINE_EXPOSURE & 0xff},
+	{VV6410_COARSEH,	VV6410_COARSE_EXPOSURE >> 8},
+	{VV6410_COARSEL,	VV6410_COARSE_EXPOSURE & 0xff},
+	{VV6410_ANALOGGAIN,	0xf0 | VV6410_DEFAULT_GAIN},
+	{VV6410_CLKDIV,		VV6410_CLK_DIV_2},
+
+	/* System registers */
+	/* Enable voltage doubler */
+	{VV6410_AS0,		BIT(6) | BIT(4) | BIT(3) | BIT(2) | BIT(1)},
+	{VV6410_AT0,		0x00},
+	/* Power up audio, differential */
+	{VV6410_AT1,		BIT(4)|BIT(0)},
+};
+
+#endif


Index: config-generic
===================================================================
RCS file: /cvs/extras/rpms/kernel/devel/config-generic,v
retrieving revision 1.202
retrieving revision 1.203
diff -u -r1.202 -r1.203
--- config-generic	25 Dec 2008 21:15:25 -0000	1.202
+++ config-generic	26 Dec 2008 12:45:49 -0000	1.203
@@ -2736,6 +2736,7 @@
 CONFIG_USB_DSBR=m
 CONFIG_USB_ET61X251=m
 CONFIG_USB_M5602=m
+CONFIG_USB_STV06XX=m
 CONFIG_USB_GSPCA=m
 CONFIG_USB_GSPCA_CONEX=m
 CONFIG_USB_GSPCA_ETOMS=m


Index: kernel.spec
===================================================================
RCS file: /cvs/extras/rpms/kernel/devel/kernel.spec,v
retrieving revision 1.1182
retrieving revision 1.1183
diff -u -r1.1182 -r1.1183
--- kernel.spec	25 Dec 2008 21:15:26 -0000	1.1182
+++ kernel.spec	26 Dec 2008 12:45:49 -0000	1.1183
@@ -634,6 +634,7 @@
 
 # webcam fixes
 Patch900: linux-2.6-gspca-git.patch
+Patch901: linux-2.6-gspca-stv06xx-git.patch
 
 Patch1515: linux-2.6.27-lirc.patch
 Patch1520: linux-2.6-hdpvr.patch
@@ -1155,7 +1156,8 @@
 ApplyPatch linux-2.6-at76.patch
 
 # Webcam patches
-#ApplyPatch linux-2.6-gspca-git.patch
+ApplyPatch linux-2.6-gspca-git.patch
+ApplyPatch linux-2.6-gspca-stv06xx-git.patch
 
 # http://www.lirc.org/
 ApplyPatch linux-2.6.27-lirc.patch
@@ -1773,6 +1775,11 @@
 %kernel_variant_files -k vmlinux %{with_kdump} kdump
 
 %changelog
+* Fri Dec 26 2008 Hans de Goede <hdegoede at redhat.com>
+- Rebase gspca git patch to latest gspca git
+- Re-enable gspca git patch
+- Add gscpa-stv06xx (qc-usb replacement) driver from its own git tree
+
 * Thu Dec 25 2008 Dave Jones <davej at redhat.com>
 - Enable BOOT_TRACER during testing.
 

linux-2.6-gspca-git.patch:

View full diff with command:
/usr/bin/cvs -f diff  -kk -u -N -r 1.1 -r 1.2 linux-2.6-gspca-git.patch
Index: linux-2.6-gspca-git.patch
===================================================================
RCS file: /cvs/extras/rpms/kernel/devel/linux-2.6-gspca-git.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- linux-2.6-gspca-git.patch	11 Dec 2008 19:15:30 -0000	1.1
+++ linux-2.6-gspca-git.patch	26 Dec 2008 12:45:49 -0000	1.2
@@ -1,5 +1,5 @@
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/Kconfig linux/drivers/media/video/gspca/Kconfig
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/Kconfig	2008-12-10 19:44:21.000000000 +0100
+diff -urN linux/drivers/media/video/gspca/Kconfig linux/drivers/media/video/gspca/Kconfig
+--- linux/drivers/media/video/gspca/Kconfig	2008-12-25 00:26:37.000000000 +0100
 +++ linux/drivers/media/video/gspca/Kconfig	2008-12-09 21:37:33.000000000 +0100
 @@ -12,7 +12,7 @@
  	  "Video For Linux" to use this driver.
@@ -60,8 +60,8 @@
  
  config USB_GSPCA_T613
  	tristate "T613 (JPEG Compliance) USB Camera Driver"
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/Makefile linux/drivers/media/video/gspca/Makefile
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/Makefile	2008-12-10 19:44:21.000000000 +0100
+diff -urN linux/drivers/media/video/gspca/Makefile linux/drivers/media/video/gspca/Makefile
+--- linux/drivers/media/video/gspca/Makefile	2008-12-25 00:26:37.000000000 +0100
 +++ linux/drivers/media/video/gspca/Makefile	2008-12-09 21:37:33.000000000 +0100
 @@ -4,6 +4,7 @@
  obj-$(CONFIG_USB_GSPCA_FINEPIX)	+= gspca_finepix.o
@@ -79,24 +79,8 @@
  gspca_pac207-objs		:= pac207.o
  gspca_pac7311-objs		:= pac7311.o
  gspca_sonixb-objs		:= sonixb.o
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/etoms.c linux/drivers/media/video/gspca/etoms.c
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/etoms.c	2008-12-10 19:44:21.000000000 +0100
-+++ linux/drivers/media/video/gspca/etoms.c	2008-12-09 21:37:33.000000000 +0100
-@@ -733,6 +733,12 @@
- 
- 		i2c_w(gspca_dev, PAS106_REG13, &i2cflags, 1, 3);
- 		i2c_w(gspca_dev, PAS106_REG0e, &gain, 1, 1);
-+#if 0
-+		i2c_w(gspca_dev, 0x09, &gain, 1, 1);
-+		i2c_w(gspca_dev, 0x0a, &gain, 1, 1);
-+		i2c_w(gspca_dev, 0x0b, &gain, 1, 1);
-+		i2c_w(gspca_dev, 0x0c, &gain, 1, 1);
-+#endif
- 	}
- }
- 
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/finepix.c linux/drivers/media/video/gspca/finepix.c
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/finepix.c	2008-12-10 19:44:21.000000000 +0100
+diff -urN linux/drivers/media/video/gspca/finepix.c linux/drivers/media/video/gspca/finepix.c
+--- linux/drivers/media/video/gspca/finepix.c	2008-12-25 00:26:37.000000000 +0100
 +++ linux/drivers/media/video/gspca/finepix.c	2008-12-09 21:37:33.000000000 +0100
 @@ -314,9 +314,6 @@
  	int ret;
@@ -108,9 +92,9 @@
  	/* Init the device */
  	memset(gspca_dev->usb_buf, 0, 12);
  	gspca_dev->usb_buf[0] = 0xc6;
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/gspca.c linux/drivers/media/video/gspca/gspca.c
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/gspca.c	2008-12-10 19:44:21.000000000 +0100
-+++ linux/drivers/media/video/gspca/gspca.c	2008-12-10 19:53:43.000000000 +0100
+diff -urN linux/drivers/media/video/gspca/gspca.c linux/drivers/media/video/gspca/gspca.c
+--- linux/drivers/media/video/gspca/gspca.c	2008-12-25 00:26:37.000000000 +0100
++++ linux/drivers/media/video/gspca/gspca.c	2008-12-25 15:33:23.000000000 +0100
 @@ -45,7 +48,7 @@
  MODULE_DESCRIPTION("GSPCA USB Camera Driver");
  MODULE_LICENSE("GPL");
@@ -141,7 +125,7 @@
  	st = usb_submit_urb(urb, GFP_ATOMIC);
  	if (st < 0)
  		PDEBUG(D_ERR|D_PACK, "usb_submit_urb() ret %d", st);
-@@ -200,11 +208,18 @@
+@@ -200,11 +204,18 @@
  {
  	struct gspca_dev *gspca_dev = (struct gspca_dev *) urb->context;
  	struct gspca_frame *frame;
@@ -273,7 +257,25 @@
  				return -EINVAL;
  		}
  	}
-@@ -846,11 +879,11 @@
+@@ -752,8 +785,6 @@
+ 	struct gspca_dev *gspca_dev = priv;
+ 	int mode;
+ 
+-	if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+-		return -EINVAL;
+ 	mode = gspca_dev->curr_mode;
+ 	memcpy(&fmt->fmt.pix, &gspca_dev->cam.cam_mode[mode],
+ 		sizeof fmt->fmt.pix);
+@@ -765,8 +796,6 @@
+ {
+ 	int w, h, mode, mode2;
+ 
+-	if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+-		return -EINVAL;
+ 	w = fmt->fmt.pix.width;
+ 	h = fmt->fmt.pix.height;
+ 
+@@ -846,11 +875,11 @@
  	return ret;
  }
  
@@ -288,7 +290,7 @@
  
  	kfree(gspca_dev->usb_buf);
  	kfree(gspca_dev);
-@@ -862,7 +895,7 @@
+@@ -862,7 +891,7 @@
  	int ret;
  
  	PDEBUG(D_STREAM, "%s open", current->comm);
@@ -297,7 +299,7 @@
  	if (mutex_lock_interruptible(&gspca_dev->queue_lock))
  		return -ERESTARTSYS;
  	if (!gspca_dev->present) {
-@@ -883,17 +916,14 @@
+@@ -883,17 +912,14 @@
  
  	gspca_dev->users++;
  
@@ -317,7 +319,7 @@
  					| V4L2_DEBUG_IOCTL_ARG);
  #endif
  	ret = 0;
-@@ -932,8 +962,6 @@
+@@ -932,8 +958,6 @@
  
  	PDEBUG(D_STREAM, "close done");
  
@@ -326,7 +328,7 @@
  	return 0;
  }
  
-@@ -1053,6 +1081,35 @@
+@@ -1053,6 +1077,35 @@
  	return -EINVAL;
  }
  
@@ -362,7 +364,36 @@
  static int vidioc_querymenu(struct file *file, void *priv,
  			    struct v4l2_querymenu *qmenu)
  {
-@@ -1236,7 +1293,6 @@
+@@ -1096,8 +1149,6 @@
+ 	struct gspca_dev *gspca_dev = priv;
+ 	int i, ret = 0;
+ 
+-	if (rb->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+-		return -EINVAL;
+ 	switch (rb->memory) {
+ 	case GSPCA_MEMORY_READ:			/* (internal call) */
+ 	case V4L2_MEMORY_MMAP:
+@@ -1162,8 +1213,7 @@
+ 	struct gspca_dev *gspca_dev = priv;
+ 	struct gspca_frame *frame;
+ 
+-	if (v4l2_buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE
+-	    || v4l2_buf->index < 0
++	if (v4l2_buf->index < 0
+ 	    || v4l2_buf->index >= gspca_dev->nframes)
+ 		return -EINVAL;
+ 
+@@ -1186,7 +1236,8 @@
+ 		ret = -ENODEV;
+ 		goto out;
+ 	}
+-	if (gspca_dev->nframes == 0) {
++	if (gspca_dev->nframes == 0
++	    || !(gspca_dev->frame[0].v4l2_buf.flags & V4L2_BUF_FLAG_QUEUED)) {
+ 		ret = -EINVAL;
+ 		goto out;
+ 	}
+@@ -1236,7 +1287,6 @@
  	gspca_dev->fr_i = gspca_dev->fr_o = gspca_dev->fr_q = 0;
  	gspca_dev->last_packet_type = DISCARD_PACKET;
  	gspca_dev->sequence = 0;
@@ -370,20 +401,7 @@
  	ret = 0;
  out:
  	mutex_unlock(&gspca_dev->queue_lock);
-@@ -1264,10 +1320,10 @@
- 	struct gspca_dev *gspca_dev = priv;
- 	int ret;
- 
--	if (mutex_lock_interruptible(&gspca_dev->usb_lock))
--		return -ERESTARTSYS;
- 	if (!gspca_dev->sd_desc->set_jcomp)
- 		return -EINVAL;
-+	if (mutex_lock_interruptible(&gspca_dev->usb_lock))
-+		return -ERESTARTSYS;
- 	ret = gspca_dev->sd_desc->set_jcomp(gspca_dev, jpegcomp);
- 	mutex_unlock(&gspca_dev->usb_lock);
- 	return ret;
-@@ -1281,6 +1337,17 @@
+@@ -1281,6 +1331,17 @@
  	memset(parm, 0, sizeof *parm);
  	parm->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  	parm->parm.capture.readbuffers = gspca_dev->nbufread;
@@ -401,7 +419,7 @@
[...1918 lines suppressed...]
++	case SENSOR_PO1200:
++		data = 0;
++		i2c_write(gspca_dev, 0x03, &data, 1);
++		data = 0x80 * sd->hflip
++			| 0x40 * sd->vflip
++			| 0x06;
++		i2c_write(gspca_dev, 0x1e, &data, 1);
++		return;
 +	default:
 +		return;
 +	}
@@ -4701,7 +5162,28 @@
  }
  
  static void setlightfreq(struct gspca_dev *gspca_dev)
-@@ -1551,6 +2157,17 @@
+@@ -1501,6 +2133,20 @@
+ 	usb_exchange(gspca_dev, ov7660_freq_tb[sd->lightfreq]);
+ }
+ 
++/* po1200 only */
++static void setsharpness(struct gspca_dev *gspca_dev)
++{
++	struct sd *sd = (struct sd *) gspca_dev;
++	__u8 data;
++
++	if (sd->sensor != SENSOR_PO1200)
++		return;
++	data = 0;
++	i2c_write(gspca_dev, 0x03, &data, 1);
++	data = 0xb5 + sd->sharpness * 3;
++	i2c_write(gspca_dev, 0x61, &data, 1);
++}
++
+ static int sd_start(struct gspca_dev *gspca_dev)
+ {
+ 	struct sd *sd = (struct sd *) gspca_dev;
+@@ -1551,6 +2197,17 @@
  			usb_exchange(gspca_dev, ov7670_initVGA_JPG);
  		}
  		break;
@@ -4719,7 +5201,7 @@
  	case SENSOR_MI1310_SOC:
  		if (mode) {
  			/* 320x240 */
-@@ -1583,6 +2200,11 @@
+@@ -1583,6 +2240,11 @@
  		}
  		usb_exchange(gspca_dev, po3130_rundata);
  		break;
@@ -4731,7 +5213,7 @@
  	default:
  		PDEBUG(D_PROBE, "Damned !! no sensor found Bye");
  		return -EMEDIUMTYPE;
-@@ -1615,11 +2237,15 @@
+@@ -1615,11 +2277,16 @@
  		reg_w(gspca_dev->dev, 0xa0, 0x23, 0xb800); * ISP CTRL_BAS
  		*/
  		/* set the led on 0x0892 0x0896 */
@@ -4743,36 +5225,38 @@
 +		if (sd->sensor != SENSOR_PO1200) {
 +			reg_w(gspca_dev->dev, 0x89, 0xffff, 0xfdff);
 +			msleep(100);
-+			setquality(gspca_dev);
 +			sethvflip(gspca_dev);
 +			setlightfreq(gspca_dev);
 +		} else {
++			setsharpness(gspca_dev);
++			sethvflip(gspca_dev);
 +			reg_w(gspca_dev->dev, 0x89, 0x0400, 0x1415);
 +		}
  	}
  	return 0;
  }
-@@ -1665,24 +2291,49 @@
+@@ -1665,24 +2332,48 @@
  				data, len);
  		return;
  	}
 +
 +	/* The vc0321 sends some additional data after sending the complete
-+	   frame, we ignore this. */
-+	if (sd->bridge == BRIDGE_VC0321 && ((frame->data_end - frame->data)
-+			+ len) > frame->v4l2_buf.length)
++	 * frame, we ignore this. */
++	if (sd->bridge == BRIDGE_VC0321
++	    && len > frame->v4l2_buf.length - (frame->data_end - frame->data))
 +		len = frame->v4l2_buf.length - (frame->data_end - frame->data);
-+
  	gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
  }
  
 -static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
 +static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
-+{
-+	struct sd *sd = (struct sd *) gspca_dev;
-+
+ {
+ 	struct sd *sd = (struct sd *) gspca_dev;
+ 
+-	sd->autogain = val;
 +	sd->hflip = val;
-+	if (gspca_dev->streaming)
+ 	if (gspca_dev->streaming)
+-		setautogain(gspca_dev);
 +		sethvflip(gspca_dev);
 +	return 0;
 +}
@@ -4782,32 +5266,55 @@
 +	struct sd *sd = (struct sd *) gspca_dev;
 +
 +	*val = sd->hflip;
-+	return 0;
-+}
-+
-+static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
- {
- 	struct sd *sd = (struct sd *) gspca_dev;
- 
--	sd->autogain = val;
-+	sd->vflip = val;
- 	if (gspca_dev->streaming)
--		setautogain(gspca_dev);
-+		sethvflip(gspca_dev);
  	return 0;
  }
  
 -static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
-+static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
++static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
  {
  	struct sd *sd = (struct sd *) gspca_dev;
  
 -	*val = sd->autogain;
++	sd->vflip = val;
++	if (gspca_dev->streaming)
++		sethvflip(gspca_dev);
++	return 0;
++}
++
++static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
++{
++	struct sd *sd = (struct sd *) gspca_dev;
++
 +	*val = sd->vflip;
  	return 0;
  }
  
-@@ -1748,6 +2399,7 @@
+@@ -1704,6 +2395,24 @@
+ 	return 0;
+ }
+ 
++static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val)
++{
++	struct sd *sd = (struct sd *) gspca_dev;
++
++	sd->sharpness = val;
++	if (gspca_dev->streaming)
++		setsharpness(gspca_dev);
++	return 0;
++}
++
++static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val)
++{
++	struct sd *sd = (struct sd *) gspca_dev;
++
++	*val = sd->sharpness;
++	return 0;
++}
++
+ static int sd_querymenu(struct gspca_dev *gspca_dev,
+ 			struct v4l2_querymenu *menu)
+ {
+@@ -1748,6 +2457,7 @@
  	{USB_DEVICE(0x0ac8, 0x0328), .driver_info = BRIDGE_VC0321},
  	{USB_DEVICE(0x0ac8, 0xc001), .driver_info = BRIDGE_VC0321},
  	{USB_DEVICE(0x0ac8, 0xc002), .driver_info = BRIDGE_VC0321},
@@ -4815,8 +5322,8 @@
  	{USB_DEVICE(0x17ef, 0x4802), .driver_info = BRIDGE_VC0323},
  	{}
  };
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/zc3xx-reg.h linux/drivers/media/video/gspca/zc3xx-reg.h
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/zc3xx-reg.h	2008-10-10 00:13:53.000000000 +0200
+diff -urN linux/drivers/media/video/gspca/zc3xx-reg.h linux/drivers/media/video/gspca/zc3xx-reg.h
+--- linux/drivers/media/video/gspca/zc3xx-reg.h	2008-12-25 00:26:37.000000000 +0100
 +++ linux/drivers/media/video/gspca/zc3xx-reg.h	2008-12-09 21:37:33.000000000 +0100
 @@ -244,14 +244,6 @@
  #define ZC3XX_R1CA_SHARPNESS04         0x01ca
@@ -4833,8 +5340,8 @@
  /* Dead pixels */
  #define ZC3XX_R250_DEADPIXELSMODE      0x0250
  
-diff -urN /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/zc3xx.c linux/drivers/media/video/gspca/zc3xx.c
---- /home/hans/projects/fedora-extras/kernel/devel/kernel-2.6.27/linux-2.6.27.noarch/drivers/media/video/gspca/zc3xx.c	2008-12-10 19:44:21.000000000 +0100
+diff -urN linux/drivers/media/video/gspca/zc3xx.c linux/drivers/media/video/gspca/zc3xx.c
+--- linux/drivers/media/video/gspca/zc3xx.c	2008-12-25 00:26:37.000000000 +0100
 +++ linux/drivers/media/video/gspca/zc3xx.c	2008-12-09 21:37:33.000000000 +0100
 @@ -51,16 +51,16 @@
  #define SENSOR_CS2102 0




More information about the fedora-extras-commits mailing list