The attached BK-patch upgrades the ov511 driver in 2.5.25 to version
1.61. This is cleanup and minor bug-fix release. As usual, it compiles
cleanly but I can't promise that it works (at least until I get 2.5
working here).
Please apply. Thanks!
--
Mark McClelland
[EMAIL PROTECTED]
# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.5 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.656 -> 1.657
# drivers/usb/media/ov511.h 1.13 -> 1.14
# Documentation/usb/ov511.txt 1.7 -> 1.8
# drivers/usb/media/ov511.c 1.29 -> 1.30
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/07/08 [EMAIL PROTECTED] 1.657
# Update ov511 driver to version 1.61:
#
# - Remove kernel I2C support and related TV tuner code. It will
# be reimplemented correctly in the 2.x driver series
# - Fix warnings when compiling without procfs support
# - Fix reg_r() debug message (was printing wrong values)
# - Fix printing of hex values
# - Fix bogus error handling in ov51x_v4l_open()
# - Improve definition of unit_video module param
# - Eliminate trailing whitespace, and other code cleanups
# - Remove documentation of obsolete module params
# --------------------------------------------
#
diff -Nru a/Documentation/usb/ov511.txt b/Documentation/usb/ov511.txt
--- a/Documentation/usb/ov511.txt Mon Jul 8 01:36:08 2002
+++ b/Documentation/usb/ov511.txt Mon Jul 8 01:36:08 2002
@@ -128,16 +128,6 @@
programs that expect RGB data (e.g. gqcam) to work with this driver. If
your colors look VERY wrong, you may want to change this.
- NAME: buf_timeout (Temporarily disabled. Memory is deallocated immediately)
- TYPE: integer
- DEFAULT: 5 (seconds)
- DESC: Number of seconds before unused frame buffers are deallocated.
- Previously, memory was allocated upon open() and deallocated upon
- close(). Deallocation now occurs only if the driver is closed and this
- timeout is reached. If you are capturing frames less frequently than
- the default timeout, increase this. This will not make any difference
- with programs that capture multiple frames during an open/close cycle.
-
NAME: cams
TYPE: integer (1-4 for OV511, 1-31 for OV511+)
DEFAULT: 1
@@ -161,13 +151,6 @@
DESC: This configures the camera's sensor to transmit a colored test-pattern
instead of an image. This does not work correctly yet.
- NAME: sensor_gbr (*** TEMPORARILY DISABLED ***)
- TYPE: integer (Boolean)
- DEFAULT: 0
- DESC: This makes the sensor output GBR422 instead of YUV420. This saves the
- driver the trouble of converting YUV to RGB, but it currently does not
- work very well (the colors are not quite right)
-
NAME: dumppix
TYPE: integer (0-2)
DEFAULT: 0
@@ -258,14 +241,6 @@
10 VIDEO_PALETTE_YUV420 (YUV 4:2:0 Planar)
13 VIDEO_PALETTE_YUV422P (YUV 4:2:2 Planar)
15 VIDEO_PALETTE_YUV420P (YUV 4:2:0 Planar, same as 10)
-
- NAME: tuner
- TYPE: integer
- DEFAULT: -1 (autodetect)
- DESC: This sets the exact type of the tuner module in a device. This is set
- automatically based on the custom ID of the OV511 device. In cases
- where this fails, you can override this auto-detection. Please see
- linux/drivers/media/video/tuner.h for a complete list.
NAME: backlight
TYPE: integer (Boolean)
diff -Nru a/drivers/usb/media/ov511.c b/drivers/usb/media/ov511.c
--- a/drivers/usb/media/ov511.c Mon Jul 8 01:36:08 2002
+++ b/drivers/usb/media/ov511.c Mon Jul 8 01:36:08 2002
@@ -9,7 +9,6 @@
* OV7620 fixes by Charl P. Botha <[EMAIL PROTECTED]>
* Changes by Claudio Matsuoka <[EMAIL PROTECTED]>
* Original SAA7111A code by Dave Perks <[EMAIL PROTECTED]>
- * Kernel I2C interface adapted from nt1003 driver
* URB error messages from pwc driver by Nemosoft
* generic_ioctl() code from videodev.c by Gerd Knorr and Alan Cox
* Memory management (rvmalloc) code from bttv driver, by Gerd Knorr and others
@@ -61,7 +60,7 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "v1.60a for Linux 2.5"
+#define DRIVER_VERSION "v1.61 for Linux 2.5"
#define EMAIL "[EMAIL PROTECTED]"
#define DRIVER_AUTHOR "Mark McClelland <[EMAIL PROTECTED]> & Bret Wallach \
& Orion Sky Lawlor <[EMAIL PROTECTED]> & Kevin Moore & Charl P. Botha \
@@ -72,7 +71,6 @@
#define ENABLE_Y_QUANTABLE 1
#define ENABLE_UV_QUANTABLE 1
-/* If you change this, you must also change the MODULE_PARM definition */
#define OV511_MAX_UNIT_VIDEO 16
/* Pixel count * bytes per YUV420 pixel (1.5) */
@@ -127,7 +125,6 @@
static int fastset;
static int force_palette;
-static int tuner = -1;
static int backlight;
static int unit_video[OV511_MAX_UNIT_VIDEO];
static int remove_zeros;
@@ -194,11 +191,9 @@
MODULE_PARM_DESC(fastset, "Allows picture settings to take effect immediately");
MODULE_PARM(force_palette, "i");
MODULE_PARM_DESC(force_palette, "Force the palette to a specific value");
-MODULE_PARM(tuner, "i");
-MODULE_PARM_DESC(tuner, "Set tuner type, if not autodetected");
MODULE_PARM(backlight, "i");
MODULE_PARM_DESC(backlight, "For objects that are lit from behind");
-MODULE_PARM(unit_video, "0-16i");
+MODULE_PARM(unit_video, "1-" __MODULE_STRING(OV511_MAX_UNIT_VIDEO) "i");
MODULE_PARM_DESC(unit_video,
"Force use of specific minor number(s). 0 is not allowed.");
MODULE_PARM(remove_zeros, "i");
@@ -337,12 +332,14 @@
**********************************************************************/
static void ov51x_clear_snapshot(struct usb_ov511 *);
-static int ov51x_check_snapshot(struct usb_ov511 *);
-static inline int sensor_get_picture(struct usb_ov511 *,
+static inline int sensor_get_picture(struct usb_ov511 *,
struct video_picture *);
+#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
static int sensor_get_exposure(struct usb_ov511 *, unsigned char *);
static int ov51x_control_ioctl(struct inode *, struct file *, unsigned int,
unsigned long);
+static int ov51x_check_snapshot(struct usb_ov511 *);
+#endif
/**********************************************************************
* Memory management
@@ -351,7 +348,7 @@
/* Here we want the physical address of the memory.
* This is used when initializing the contents of the area.
*/
-static inline unsigned long
+static inline unsigned long
kvirt_to_pa(unsigned long adr)
{
unsigned long kva, ret;
@@ -384,7 +381,7 @@
return mem;
}
-static void
+static void
rvfree(void *mem, unsigned long size)
{
unsigned long adr;
@@ -418,7 +415,7 @@
#define YES_NO(x) ((x) ? "yes" : "no")
/* /proc/video/ov511/<minor#>/info */
-static int
+static int
ov511_read_proc_info(char *page, char **start, off_t off, int count, int *eof,
void *data)
{
@@ -490,13 +487,13 @@
* When the camera's button is pressed, the output of this will change from a
* 0 to a 1 (ASCII). It will retain this value until it is read, after which
* it will reset to zero.
- *
+ *
* SECURITY NOTE: Since reading this file can change the state of the snapshot
* status, it is important for applications that open it to keep it locked
* against access by other processes, using flock() or a similar mechanism. No
* locking is provided by this driver.
*/
-static int
+static int
ov511_read_proc_button(char *page, char **start, off_t off, int count, int *eof,
void *data)
{
@@ -528,7 +525,7 @@
return len;
}
-static void
+static void
create_proc_ov511_cam(struct usb_ov511 *ov)
{
char dirname[10];
@@ -579,11 +576,11 @@
unlock_kernel();
}
-static void
+static void
destroy_proc_ov511_cam(struct usb_ov511 *ov)
{
char dirname[10];
-
+
if (!ov || !ov->proc_devdir)
return;
@@ -616,7 +613,7 @@
ov->proc_devdir = NULL;
}
-static void
+static void
proc_ov511_create(void)
{
/* No current standard here. Alan prefers /proc/video/ as it keeps
@@ -637,7 +634,7 @@
err("Unable to create /proc/video/ov511");
}
-static void
+static void
proc_ov511_destroy(void)
{
PDEBUG(3, "removing /proc/video/ov511");
@@ -656,7 +653,7 @@
**********************************************************************/
/* Write an OV51x register */
-static int
+static int
reg_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
{
int rc;
@@ -669,7 +666,7 @@
usb_sndctrlpipe(ov->dev, 0),
(ov->bclass == BCL_OV518)?1:2 /* REG_IO */,
USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- 0, (__u16)reg, &ov->cbuf[0], 1, HZ);
+ 0, (__u16)reg, &ov->cbuf[0], 1, HZ);
up(&ov->cbuf_lock);
if (rc < 0)
@@ -680,7 +677,7 @@
/* Read from an OV51x register */
/* returns: negative is error, pos or zero is data */
-static int
+static int
reg_r(struct usb_ov511 *ov, unsigned char reg)
{
int rc;
@@ -691,13 +688,13 @@
(ov->bclass == BCL_OV518)?1:3 /* REG_IO */,
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
0, (__u16)reg, &ov->cbuf[0], 1, HZ);
-
- PDEBUG(5, "0x%02X:0x%02X", reg, ov->cbuf[0]);
-
- if (rc < 0)
+
+ if (rc < 0) {
err("reg read: error %d: %s", rc, symbolic(urb_errlist, rc));
- else
- rc = ov->cbuf[0];
+ } else {
+ rc = ov->cbuf[0];
+ PDEBUG(5, "0x%02X:0x%02X", reg, ov->cbuf[0]);
+ }
up(&ov->cbuf_lock);
@@ -707,10 +704,10 @@
/*
* Writes bits at positions specified by mask to an OV51x reg. Bits that are in
* the same position as 1's in "mask" are cleared and set to "value". Bits
- * that are in the same position as 0's in "mask" are preserved, regardless
+ * that are in the same position as 0's in "mask" are preserved, regardless
* of their respective state in "value".
*/
-static int
+static int
reg_w_mask(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value,
@@ -735,7 +732,7 @@
* Writes multiple (n) byte value to a single register. Only valid with certain
* registers (0x30 and 0xc4 - 0xce).
*/
-static int
+static int
ov518_reg_w32(struct usb_ov511 *ov, unsigned char reg, u32 val, int n)
{
int rc;
@@ -760,7 +757,7 @@
return rc;
}
-static int
+static int
ov511_upload_quan_tables(struct usb_ov511 *ov)
{
unsigned char *pYTable = yQuanTable511;
@@ -770,10 +767,8 @@
PDEBUG(4, "Uploading quantization tables");
- for (i = 0; i < OV511_QUANTABLESIZE / 2; i++)
- {
- if (ENABLE_Y_QUANTABLE)
- {
+ for (i = 0; i < OV511_QUANTABLESIZE / 2; i++) {
+ if (ENABLE_Y_QUANTABLE) {
val0 = *pYTable++;
val1 = *pYTable++;
val0 &= 0x0f;
@@ -784,8 +779,7 @@
return rc;
}
- if (ENABLE_UV_QUANTABLE)
- {
+ if (ENABLE_UV_QUANTABLE) {
val0 = *pUVTable++;
val1 = *pUVTable++;
val0 &= 0x0f;
@@ -803,7 +797,7 @@
}
/* OV518 quantization tables are 8x4 (instead of 8x8) */
-static int
+static int
ov518_upload_quan_tables(struct usb_ov511 *ov)
{
unsigned char *pYTable = yQuanTable518;
@@ -813,10 +807,8 @@
PDEBUG(4, "Uploading quantization tables");
- for (i = 0; i < OV518_QUANTABLESIZE / 2; i++)
- {
- if (ENABLE_Y_QUANTABLE)
- {
+ for (i = 0; i < OV518_QUANTABLESIZE / 2; i++) {
+ if (ENABLE_Y_QUANTABLE) {
val0 = *pYTable++;
val1 = *pYTable++;
val0 &= 0x0f;
@@ -827,8 +819,7 @@
return rc;
}
- if (ENABLE_UV_QUANTABLE)
- {
+ if (ENABLE_UV_QUANTABLE) {
val0 = *pUVTable++;
val1 = *pUVTable++;
val0 &= 0x0f;
@@ -845,16 +836,16 @@
return 0;
}
-static int
+static int
ov51x_reset(struct usb_ov511 *ov, unsigned char reset_type)
{
int rc;
-
+
/* Setting bit 0 not allowed on 518/518Plus */
if (ov->bclass == BCL_OV518)
reset_type &= 0xfe;
- PDEBUG(4, "Reset: type=0x%X", reset_type);
+ PDEBUG(4, "Reset: type=0x%02X", reset_type);
rc = reg_w(ov, R51x_SYS_RESET, reset_type);
rc = reg_w(ov, R51x_SYS_RESET, 0);
@@ -876,7 +867,7 @@
* This is normally only called from i2c_w(). Note that this function
* always succeeds regardless of whether the sensor is present and working.
*/
-static int
+static int
ov518_i2c_write_internal(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value)
@@ -901,7 +892,7 @@
}
/* NOTE: Do not call this function directly! */
-static int
+static int
ov511_i2c_write_internal(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value)
@@ -917,7 +908,7 @@
if (rc < 0) return rc;
/* Write "value" to I2C data port of OV511 */
- rc = reg_w(ov, R51x_I2C_DATA, value);
+ rc = reg_w(ov, R51x_I2C_DATA, value);
if (rc < 0) return rc;
/* Initiate 3-byte write cycle */
@@ -931,7 +922,7 @@
if ((rc&2) == 0) /* Ack? */
break;
#if 0
- /* I2C abort */
+ /* I2C abort */
reg_w(ov, R511_I2C_CTL, 0x10);
#endif
if (--retries < 0) {
@@ -948,7 +939,7 @@
* This is normally only called from i2c_r(). Note that this function
* always succeeds regardless of whether the sensor is present and working.
*/
-static int
+static int
ov518_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
{
int rc, value;
@@ -974,7 +965,7 @@
/* NOTE: Do not call this function directly!
* returns: negative is error, pos or zero is data */
-static int
+static int
ov511_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
{
int rc, value, retries;
@@ -996,7 +987,7 @@
if ((rc&2) == 0) /* Ack? */
break;
- /* I2C abort */
+ /* I2C abort */
reg_w(ov, R511_I2C_CTL, 0x10);
if (--retries < 0) {
@@ -1018,7 +1009,7 @@
if ((rc&2) == 0) /* Ack? */
break;
- /* I2C abort */
+ /* I2C abort */
rc = reg_w(ov, R511_I2C_CTL, 0x10);
if (rc < 0) return rc;
@@ -1031,17 +1022,17 @@
value = reg_r(ov, R51x_I2C_DATA);
PDEBUG(5, "0x%02X:0x%02X", reg, value);
-
+
/* This is needed to make i2c_w() work */
rc = reg_w(ov, R511_I2C_CTL, 0x05);
if (rc < 0)
return rc;
-
+
return value;
}
/* returns: negative is error, pos or zero is data */
-static int
+static int
i2c_r(struct usb_ov511 *ov, unsigned char reg)
{
int rc;
@@ -1058,7 +1049,7 @@
return rc;
}
-static int
+static int
i2c_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
{
int rc;
@@ -1076,7 +1067,7 @@
}
/* Do not call this function directly! */
-static int
+static int
ov51x_i2c_write_mask_internal(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value,
@@ -1109,10 +1100,10 @@
/* Writes bits at positions specified by mask to an I2C reg. Bits that are in
* the same position as 1's in "mask" are cleared and set to "value". Bits
- * that are in the same position as 0's in "mask" are preserved, regardless
+ * that are in the same position as 0's in "mask" are preserved, regardless
* of their respective state in "value".
*/
-static int
+static int
i2c_w_mask(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value,
@@ -1132,7 +1123,7 @@
* when calling this. This should not be called from outside the i2c I/O
* functions.
*/
-static inline int
+static inline int
i2c_set_slave_internal(struct usb_ov511 *ov, unsigned char slave)
{
int rc;
@@ -1146,8 +1137,10 @@
return 0;
}
+#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
+
/* Write to a specific I2C slave ID and register, using the specified mask */
-static int
+static int
i2c_w_slave(struct usb_ov511 *ov,
unsigned char slave,
unsigned char reg,
@@ -1166,7 +1159,7 @@
out:
/* Restore primary IDs */
- if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
+ if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
err("Couldn't restore primary I2C slave");
up(&ov->i2c_lock);
@@ -1174,7 +1167,7 @@
}
/* Read from a specific I2C slave ID and register */
-static int
+static int
i2c_r_slave(struct usb_ov511 *ov,
unsigned char slave,
unsigned char reg)
@@ -1194,15 +1187,17 @@
out:
/* Restore primary IDs */
- if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
+ if (i2c_set_slave_internal(ov, ov->primary_i2c_slave) < 0)
err("Couldn't restore primary I2C slave");
up(&ov->i2c_lock);
return rc;
}
+#endif /* defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS) */
+
/* Sets I2C read and write slave IDs. Returns <0 for error */
-static int
+static int
ov51x_set_slave_ids(struct usb_ov511 *ov, unsigned char sid)
{
int rc;
@@ -1221,7 +1216,7 @@
return rc;
}
-static int
+static int
write_regvals(struct usb_ov511 *ov, struct ov511_regvals * pRegvals)
{
int rc;
@@ -1242,8 +1237,8 @@
return 0;
}
-#ifdef OV511_DEBUG
-static void
+#ifdef OV511_DEBUG
+static void
dump_i2c_range(struct usb_ov511 *ov, int reg1, int regn)
{
int i;
@@ -1251,18 +1246,18 @@
for (i = reg1; i <= regn; i++) {
rc = i2c_r(ov, i);
- info("Sensor[0x%X] = 0x%X", i, rc);
+ info("Sensor[0x%02X] = 0x%02X", i, rc);
}
}
-static void
+static void
dump_i2c_regs(struct usb_ov511 *ov)
{
info("I2C REGS");
dump_i2c_range(ov, 0x00, 0x7C);
}
-static void
+static void
dump_reg_range(struct usb_ov511 *ov, int reg1, int regn)
{
int i;
@@ -1270,12 +1265,12 @@
for (i = reg1; i <= regn; i++) {
rc = reg_r(ov, i);
- info("OV511[0x%X] = 0x%X", i, rc);
+ info("OV511[0x%02X] = 0x%02X", i, rc);
}
}
/* FIXME: Should there be an OV518 version of this? */
-static void
+static void
ov511_dump_regs(struct usb_ov511 *ov)
{
info("CAMERA INTERFACE REGS");
@@ -1302,29 +1297,15 @@
}
#endif
-/**********************************************************************
- *
- * Kernel I2C Interface (not supported with OV518/OV518+)
- *
- **********************************************************************/
-
-/* For as-yet unimplemented I2C interface */
-static void
-call_i2c_clients(struct usb_ov511 *ov, unsigned int cmd,
- void *arg)
-{
- /* Do nothing */
-}
-
/*****************************************************************************/
/* Temporarily stops OV511 from functioning. Must do this before changing
* registers while the camera is streaming */
-static inline int
+static inline int
ov51x_stop(struct usb_ov511 *ov)
{
PDEBUG(4, "stopping");
- ov->stopped = 1;
+ ov->stopped = 1;
if (ov->bclass == BCL_OV518)
return (reg_w_mask(ov, R51x_SYS_RESET, 0x3a, 0x3a));
else
@@ -1333,12 +1314,12 @@
/* Restarts OV511 after ov511_stop() is called. Has no effect if it is not
* actually stopped (for performance). */
-static inline int
+static inline int
ov51x_restart(struct usb_ov511 *ov)
{
if (ov->stopped) {
PDEBUG(4, "restarting");
- ov->stopped = 0;
+ ov->stopped = 0;
/* Reinitialize the stream */
if (ov->bclass == BCL_OV518)
@@ -1351,7 +1332,7 @@
}
/* Resets the hardware snapshot button */
-static void
+static void
ov51x_clear_snapshot(struct usb_ov511 *ov)
{
if (ov->bclass == BCL_OV511) {
@@ -1363,12 +1344,12 @@
} else {
err("clear snap: invalid bridge type");
}
-
}
+#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
/* Checks the status of the snapshot button. Returns 1 if it was pressed since
* it was last cleared, and zero in all other cases (including errors) */
-static int
+static int
ov51x_check_snapshot(struct usb_ov511 *ov)
{
int ret, status = 0;
@@ -1388,19 +1369,20 @@
return status;
}
+#endif
/* This does an initial reset of an OmniVision sensor and ensures that I2C
* is synchronized. Returns <0 for failure.
*/
-static int
+static int
init_ov_sensor(struct usb_ov511 *ov)
{
int i, success;
- /* Reset the sensor */
+ /* Reset the sensor */
if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
- /* Wait for it to initialize */
+ /* Wait for it to initialize */
schedule_timeout (1 + 150 * HZ / 1000);
for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) {
@@ -1410,9 +1392,9 @@
continue;
}
- /* Reset the sensor */
+ /* Reset the sensor */
if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
- /* Wait for it to initialize */
+ /* Wait for it to initialize */
schedule_timeout(1 + 150 * HZ / 1000);
/* Dummy read to sync I2C */
if (i2c_r(ov, 0x00) < 0) return -EIO;
@@ -1420,13 +1402,13 @@
if (!success)
return -EIO;
-
+
PDEBUG(1, "I2C synced in %d attempt(s)", i);
return 0;
}
-static int
+static int
ov511_set_packet_size(struct usb_ov511 *ov, int size)
{
int alt, mult;
@@ -1468,7 +1450,7 @@
if (reg_w(ov, R51x_FIFO_PSIZE, mult) < 0)
return -EIO;
-
+
if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {
err("Set packet size: set interface error");
return -EBUSY;
@@ -1488,7 +1470,7 @@
/* Note: Unlike the OV511/OV511+, the size argument does NOT include the
* optional packet number byte. The actual size *is* stored in ov->packet_size,
* though. */
-static int
+static int
ov518_set_packet_size(struct usb_ov511 *ov, int size)
{
int alt;
@@ -1550,7 +1532,6 @@
int rc = 0;
if (!ov->compress_inited) {
-
reg_w(ov, 0x70, phy);
reg_w(ov, 0x71, phuv);
reg_w(ov, 0x72, pvy);
@@ -1568,7 +1549,7 @@
}
ov->compress_inited = 1;
-out:
+out:
return rc;
}
@@ -1579,7 +1560,6 @@
int rc = 0;
if (!ov->compress_inited) {
-
if (ov518_upload_quan_tables(ov) < 0) {
err("Error uploading quantization tables");
rc = -EIO;
@@ -1588,7 +1568,7 @@
}
ov->compress_inited = 1;
-out:
+out:
return rc;
}
@@ -2130,7 +2110,7 @@
#endif /* CONFIG_PROC_FS && CONFIG_VIDEO_PROC_FS */
/* Turns on or off the LED. Only has an effect with OV511+/OV518(+) */
-static inline void
+static inline void
ov51x_led_control(struct usb_ov511 *ov, int enable)
{
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
@@ -2181,7 +2161,7 @@
i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
i2c_w(ov, 0x2b, sixty?0x00:0xac);
i2c_w_mask(ov, 0x76, 0x01, 0x01);
- break;
+ break;
case SEN_OV6620:
case SEN_OV6630:
i2c_w(ov, 0x2b, sixty?0xa8:0x28);
@@ -2269,7 +2249,7 @@
*/
static inline int
sensor_set_auto_exposure(struct usb_ov511 *ov, int enable)
-{
+{
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
switch (ov->sensor) {
@@ -2281,7 +2261,7 @@
case SEN_OV76BE:
case SEN_OV8600:
i2c_w_mask(ov, 0x13, enable?0x01:0x00, 0x01);
- break;
+ break;
case SEN_OV6630:
i2c_w_mask(ov, 0x28, enable?0x00:0x10, 0x10);
break;
@@ -2318,7 +2298,7 @@
i2c_w_mask(ov, 0x68, enable?0xe0:0xc0, 0xe0);
i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
i2c_w_mask(ov, 0x28, enable?0x02:0x00, 0x02);
- break;
+ break;
case SEN_OV6620:
i2c_w_mask(ov, 0x4e, enable?0xe0:0xc0, 0xe0);
i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
@@ -2378,7 +2358,7 @@
/* Returns number of bits per pixel (regardless of where they are located;
* planar or not), or zero for unsupported format.
*/
-static inline int
+static inline int
get_depth(int palette)
{
switch (palette) {
@@ -2390,7 +2370,7 @@
}
/* Bytes per frame. Used by read(). Return of 0 indicates error */
-static inline long int
+static inline long int
get_frame_length(struct ov511_frame *frame)
{
if (!frame)
@@ -2785,12 +2765,12 @@
return -EINVAL;
} else {
hi_res = 0;
- }
+ }
if (ov51x_stop(ov) < 0)
return -EIO;
- /******** Set the mode ********/
+ /******** Set the mode ********/
reg_w(ov, 0x2b, 0);
reg_w(ov, 0x2c, 0);
@@ -2906,10 +2886,10 @@
rc = -EINVAL;
break;
case SEN_SAA7111A:
-// rc = mode_init_saa_sensor_regs(ov, width, height, mode,
+// rc = mode_init_saa_sensor_regs(ov, width, height, mode,
// sub_flag);
- PDEBUG(1, "SAA status = 0X%x", i2c_r(ov, 0x1f));
+ PDEBUG(1, "SAA status = 0x%02X", i2c_r(ov, 0x1f));
break;
default:
err("Unknown sensor");
@@ -2952,7 +2932,7 @@
/* This sets the default image parameters. This is useful for apps that use
* read() and do not set these.
*/
-static int
+static int
ov51x_set_default_params(struct usb_ov511 *ov)
{
int i;
@@ -2988,7 +2968,7 @@
**********************************************************************/
/* Set analog input port of decoder */
-static int
+static int
decoder_set_input(struct usb_ov511 *ov, int input)
{
PDEBUG(4, "port %d", input);
@@ -3010,7 +2990,7 @@
}
/* Get ASCII name of video input */
-static int
+static int
decoder_get_input_name(struct usb_ov511 *ov, int input, char *name)
{
switch (ov->sensor) {
@@ -3022,7 +3002,6 @@
sprintf(name, "CVBS-%d", input);
else // if (input < 8)
sprintf(name, "S-Video-%d", input - 4);
-
break;
}
default:
@@ -3033,7 +3012,7 @@
}
/* Set norm (NTSC, PAL, SECAM, AUTO) */
-static int
+static int
decoder_set_norm(struct usb_ov511 *ov, int norm)
{
PDEBUG(4, "%d", norm);
@@ -3048,7 +3027,7 @@
reg_e = 0x00; /* NTSC M / PAL BGHI */
} else if (norm == VIDEO_MODE_PAL) {
reg_8 = 0x00; /* 50 Hz */
- reg_e = 0x00; /* NTSC M / PAL BGHI */
+ reg_e = 0x00; /* NTSC M / PAL BGHI */
} else if (norm == VIDEO_MODE_AUTO) {
reg_8 = 0x80; /* Auto field detect */
reg_e = 0x00; /* NTSC M / PAL BGHI */
@@ -3079,7 +3058,7 @@
/* Copies a 64-byte segment at pIn to an 8x8 block at pOut. The width of the
* image at pOut is specified by w.
*/
-static inline void
+static inline void
make_8x8(unsigned char *pIn, unsigned char *pOut, int w)
{
unsigned char *pOut1 = pOut;
@@ -3092,7 +3071,6 @@
}
pOut += w;
}
-
}
/*
@@ -3214,7 +3192,7 @@
* accordingly. Returns -ENXIO if decompressor is not available, otherwise
* returns 0 if no other error.
*/
-static int
+static int
request_decompressor(struct usb_ov511 *ov)
{
if (!ov)
@@ -3270,7 +3248,7 @@
/* Unlocks decompression module and nulls ov->decomp_ops. Safe to call even
* if ov->decomp_ops is NULL.
*/
-static void
+static void
release_decompressor(struct usb_ov511 *ov)
{
int released = 0; /* Did we actually do anything? */
@@ -3286,14 +3264,14 @@
}
ov->decomp_ops = NULL;
-
+
unlock_kernel();
if (released)
PDEBUG(3, "Decompressor released");
}
-static void
+static void
decompress(struct usb_ov511 *ov, struct ov511_frame *frame,
unsigned char *pIn0, unsigned char *pOut0)
{
@@ -3303,7 +3281,7 @@
PDEBUG(4, "Decompressing %d bytes", frame->bytes_recvd);
- if (frame->format == VIDEO_PALETTE_GREY
+ if (frame->format == VIDEO_PALETTE_GREY
&& ov->decomp_ops->decomp_400) {
int ret = ov->decomp_ops->decomp_400(
pIn0,
@@ -3313,7 +3291,7 @@
frame->rawheight,
frame->bytes_recvd);
PDEBUG(4, "DEBUG: decomp_400 returned %d", ret);
- } else if (frame->format != VIDEO_PALETTE_GREY
+ } else if (frame->format != VIDEO_PALETTE_GREY
&& ov->decomp_ops->decomp_420) {
int ret = ov->decomp_ops->decomp_420(
pIn0,
@@ -3328,6 +3306,12 @@
}
}
+/**********************************************************************
+ *
+ * Format conversion
+ *
+ **********************************************************************/
+
/* Fuses even and odd fields together, and doubles width.
* INPUT: an odd field followed by an even field at pIn0, in YUV planar format
* OUTPUT: a normal YUV planar image, with correct aspect ratio
@@ -3432,7 +3416,7 @@
if (frame->compressed)
decompress(ov, frame, frame->rawdata, frame->tempdata);
else
- yuv420raw_to_yuv420p(frame, frame->rawdata,
+ yuv420raw_to_yuv420p(frame, frame->rawdata,
frame->tempdata);
deinterlace(frame, RAWFMT_YUV420, frame->tempdata,
@@ -3452,11 +3436,11 @@
* 3. Convert from YUV planar to destination format, if necessary
* 4. Fix the RGB offset, if necessary
*/
-static void
+static void
ov51x_postprocess(struct usb_ov511 *ov, struct ov511_frame *frame)
{
if (dumppix) {
- memset(frame->data, 0,
+ memset(frame->data, 0,
MAX_DATA_SIZE(ov->maxwidth, ov->maxheight));
PDEBUG(4, "Dumping %d bytes", frame->bytes_recvd);
memcpy(frame->data, frame->rawdata, frame->bytes_recvd);
@@ -3482,7 +3466,7 @@
*
**********************************************************************/
-static inline void
+static inline void
ov511_move_data(struct usb_ov511 *ov, unsigned char *in, int n)
{
int num, offset;
@@ -3518,7 +3502,7 @@
/* Frame end */
if (in[8] & 0x80) {
- ts = (struct timeval *)(frame->data
+ ts = (struct timeval *)(frame->data
+ MAX_FRAME_SIZE(ov->maxwidth, ov->maxheight));
do_gettimeofday(ts);
@@ -3656,7 +3640,7 @@
}
}
-static inline void
+static inline void
ov518_move_data(struct usb_ov511 *ov, unsigned char *in, int n)
{
int max_raw = MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight);
@@ -3796,7 +3780,7 @@
} else {
if (frame->bytes_recvd + copied + 8 <= max_raw)
{
- memcpy(frame->rawdata
+ memcpy(frame->rawdata
+ frame->bytes_recvd + copied,
in + read, 8);
copied += 8;
@@ -3810,7 +3794,7 @@
}
}
-static void
+static void
ov51x_isoc_irq(struct urb *urb)
{
int i;
@@ -3896,7 +3880,7 @@
*
***************************************************************************/
-static int
+static int
ov51x_init_isoc(struct usb_ov511 *ov)
{
struct urb *urb;
@@ -3991,7 +3975,7 @@
return 0;
}
-static void
+static void
ov51x_unlink_isoc(struct usb_ov511 *ov)
{
int n;
@@ -4006,7 +3990,7 @@
}
}
-static void
+static void
ov51x_stop_isoc(struct usb_ov511 *ov)
{
if (!ov->streaming || !ov->dev)
@@ -4024,7 +4008,7 @@
ov51x_unlink_isoc(ov);
}
-static int
+static int
ov51x_new_frame(struct usb_ov511 *ov, int framenum)
{
struct ov511_frame *frame;
@@ -4046,7 +4030,7 @@
frame = &ov->frame[framenum];
- PDEBUG(4, "framenum = %d, width = %d, height = %d", framenum,
+ PDEBUG(4, "framenum = %d, width = %d, height = %d", framenum,
frame->width, frame->height);
frame->grabstate = FRAME_GRABBING;
@@ -4075,12 +4059,12 @@
*
***************************************************************************/
-/*
+/*
* - You must acquire buf_lock before entering this function.
* - Because this code will free any non-null pointer, you must be sure to null
* them if you explicitly free them somewhere else!
*/
-static void
+static void
ov51x_do_dealloc(struct usb_ov511 *ov)
{
int i;
@@ -4124,7 +4108,7 @@
PDEBUG(4, "leaving");
}
-static int
+static int
ov51x_alloc(struct usb_ov511 *ov)
{
int i;
@@ -4171,12 +4155,12 @@
for (i = 0; i < OV511_NUMFRAMES; i++) {
ov->frame[i].data = ov->fbuf + i * MAX_DATA_SIZE(w, h);
- ov->frame[i].rawdata = ov->rawfbuf
+ ov->frame[i].rawdata = ov->rawfbuf
+ i * MAX_RAW_DATA_SIZE(w, h);
- ov->frame[i].tempdata = ov->tempfbuf
+ ov->frame[i].tempdata = ov->tempfbuf
+ i * MAX_RAW_DATA_SIZE(w, h);
- ov->frame[i].compbuf =
+ ov->frame[i].compbuf =
(unsigned char *) __get_free_page(GFP_KERNEL);
if (!ov->frame[i].compbuf)
goto error;
@@ -4196,7 +4180,7 @@
return -ENOMEM;
}
-static void
+static void
ov51x_dealloc(struct usb_ov511 *ov, int now)
{
PDEBUG(4, "entered");
@@ -4212,7 +4196,7 @@
*
***************************************************************************/
-static int
+static int
ov51x_v4l1_open(struct inode *inode, struct file *file)
{
struct video_device *vdev = video_devdata(file);
@@ -4224,17 +4208,18 @@
down(&ov->lock);
err = -EBUSY;
- if (ov->user)
+ if (ov->user)
goto out;
- err = -ENOMEM;
- if (ov51x_alloc(ov))
+ err = ov51x_alloc(ov);
+ if (err < 0)
goto out;
ov->sub_flag = 0;
/* In case app doesn't set them... */
- if (ov51x_set_default_params(ov) < 0)
+ err = ov51x_set_default_params(ov);
+ if (err < 0)
goto out;
/* Make sure frames are reset */
@@ -4243,7 +4228,7 @@
ov->frame[i].bytes_read = 0;
}
- /* If compression is on, make sure now that a
+ /* If compression is on, make sure now that a
* decompressor can be loaded */
if (ov->compress && !ov->decomp_ops) {
err = request_decompressor(ov);
@@ -4268,14 +4253,14 @@
return err;
}
-static int
+static int
ov51x_v4l1_close(struct inode *inode, struct file *file)
{
struct video_device *vdev = file->private_data;
struct usb_ov511 *ov = vdev->priv;
PDEBUG(4, "ov511_close");
-
+
down(&ov->lock);
ov->user--;
@@ -4303,6 +4288,7 @@
kfree(ov);
ov = NULL;
}
+
file->private_data = NULL;
return 0;
@@ -4318,7 +4304,7 @@
PDEBUG(5, "IOCtl: 0x%X", cmd);
if (!ov->dev)
- return -EIO;
+ return -EIO;
switch (cmd) {
case VIDIOCGCAP:
@@ -4331,10 +4317,8 @@
sprintf(b->name, "%s USB Camera",
symbolic(brglist, ov->bridge));
b->type = VID_TYPE_CAPTURE | VID_TYPE_SUBCAPTURE;
- if (ov->has_tuner)
- b->type |= VID_TYPE_TUNER;
b->channels = ov->num_inputs;
- b->audios = ov->has_audio_proc ? 1:0;
+ b->audios = 0;
b->maxwidth = ov->maxwidth;
b->maxheight = ov->maxheight;
b->minwidth = ov->minwidth;
@@ -4354,11 +4338,10 @@
}
v->norm = ov->norm;
- v->type = (ov->has_tuner) ? VIDEO_TYPE_TV : VIDEO_TYPE_CAMERA;
- v->flags = (ov->has_tuner) ? VIDEO_VC_TUNER : 0;
- v->flags |= (ov->has_audio_proc) ? VIDEO_VC_AUDIO : 0;
+ v->type = VIDEO_TYPE_CAMERA;
+ v->flags = 0;
// v->flags |= (ov->has_decoder) ? VIDEO_VC_NORM : 0;
- v->tuners = (ov->has_tuner) ? 1:0;
+ v->tuners = 0;
decoder_get_input_name(ov, v->channel, v->name);
return 0;
@@ -4585,7 +4568,7 @@
return -EINVAL;
}
- if (vm->width > ov->maxwidth
+ if (vm->width > ov->maxwidth
|| vm->height > ov->maxheight) {
err("VIDIOCMCAPTURE: requested dimensions too big");
return -EINVAL;
@@ -4641,7 +4624,6 @@
struct ov511_frame *frame;
int rc;
-
if (fnum >= OV511_NUMFRAMES) {
err("VIDIOCSYNC: invalid frame (%d)", fnum);
return -EINVAL;
@@ -4676,7 +4658,7 @@
return ret;
goto redo;
}
- /* Fall through */
+ /* Fall through */
case FRAME_DONE:
if (ov->snap_enabled && !frame->snapshot) {
int ret;
@@ -4728,92 +4710,6 @@
return 0;
}
- case VIDIOCGTUNER:
- {
- struct video_tuner *v = arg;
-
- PDEBUG(4, "VIDIOCGTUNER");
-
- if (!ov->has_tuner || v->tuner) // Only tuner 0
- return -EINVAL;
-
- strcpy(v->name, "Television");
-
- // FIXME: Need a way to get the real values
- v->rangelow = 0;
- v->rangehigh = ~0;
-
- v->flags = VIDEO_TUNER_PAL | VIDEO_TUNER_NTSC
- | VIDEO_TUNER_SECAM;
- v->mode = 0; /* FIXME: Not sure what this is yet */
- v->signal = 0xFFFF; /* unknown */
-
- call_i2c_clients(ov, cmd, v);
-
- return 0;
- }
- case VIDIOCSTUNER:
- {
- struct video_tuner *v = arg;
- int err;
-
- PDEBUG(4, "VIDIOCSTUNER");
-
- /* Only no or one tuner for now */
- if (!ov->has_tuner || v->tuner)
- return -EINVAL;
-
- /* and it only has certain valid modes */
- if (v->mode != VIDEO_MODE_PAL &&
- v->mode != VIDEO_MODE_NTSC &&
- v->mode != VIDEO_MODE_SECAM)
- return -EOPNOTSUPP;
-
- /* Is this right/necessary? */
- err = decoder_set_norm(ov, v->mode);
- if (err)
- return err;
-
- call_i2c_clients(ov, cmd, v);
-
- return 0;
- }
- case VIDIOCGFREQ:
- {
- unsigned long v = *((unsigned long *) arg);
-
- PDEBUG(4, "VIDIOCGFREQ");
-
- if (!ov->has_tuner)
- return -EINVAL;
-
- v = ov->freq;
-#if 0
- /* FIXME: this is necessary for testing */
- v = 46*16;
-#endif
- return 0;
- }
- case VIDIOCSFREQ:
- {
- unsigned long v = *((unsigned long *) arg);
-
- PDEBUG(4, "VIDIOCSFREQ: %lx", v);
-
- if (!ov->has_tuner)
- return -EINVAL;
-
- ov->freq = v;
- call_i2c_clients(ov, cmd, &v);
-
- return 0;
- }
- case VIDIOCGAUDIO:
- case VIDIOCSAUDIO:
- {
- /* FIXME: Implement this... */
- return 0;
- }
default:
PDEBUG(3, "Unsupported IOCtl: 0x%X", cmd);
return -ENOIOCTLCMD;
@@ -4822,7 +4718,7 @@
return 0;
}
-static int
+static int
ov51x_v4l1_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
@@ -4839,7 +4735,7 @@
return rc;
}
-static inline int
+static inline int
ov51x_v4l1_read(struct file *file, char *buf, size_t cnt, loff_t *ppos)
{
struct video_device *vdev = file->private_data;
@@ -4904,7 +4800,7 @@
/* Wait while we're grabbing the image */
PDEBUG(4, "Waiting image grabbing");
- rc = wait_event_interruptible(frame->wq,
+ rc = wait_event_interruptible(frame->wq,
(frame->grabstate == FRAME_DONE)
|| (frame->grabstate == FRAME_ERROR));
@@ -4951,7 +4847,7 @@
get_frame_length(frame));
/* copy bytes to user space; we allow for partials reads */
-// if ((count + frame->bytes_read)
+// if ((count + frame->bytes_read)
// > get_frame_length((struct ov511_frame *)frame))
// count = frame->scanlength - frame->bytes_read;
@@ -5054,7 +4950,7 @@
};
#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
-static int
+static int
ov51x_control_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long ularg)
{
@@ -5278,7 +5174,7 @@
/* This initializes the OV7610, OV7620, or OV76BE sensor. The OV76BE uses
* the same register settings as the OV7610, since they are very similar.
*/
-static int
+static int
ov7xx0_configure(struct usb_ov511 *ov)
{
int i, success;
@@ -5429,7 +5325,7 @@
err("this to " EMAIL);
err("This is only a warning. You can attempt to use");
err("your camera anyway");
-// Only issue a warning for now
+// Only issue a warning for now
// return -1;
} else {
PDEBUG(1, "OV7xx0 initialized (method 2, %dx)", i+1);
@@ -5449,8 +5345,6 @@
/* I don't know what's different about the 76BE yet. */
if (i2c_r(ov, 0x15) & 1) {
info("Sensor is an OV7620AE");
- info("PLEASE REPORT THE EXISTENCE OF THIS SENSOR TO");
- info("THE DRIVER AUTHOR");
} else {
info("Sensor is an OV76BE");
}
@@ -5498,7 +5392,7 @@
}
/* This initializes the OV6620, OV6630, OV6630AE, or OV6630AF sensor. */
-static int
+static int
ov6xx0_configure(struct usb_ov511 *ov)
{
int rc;
@@ -5513,7 +5407,7 @@
{ OV511_I2C_BUS, 0x0c, 0x24 },
{ OV511_I2C_BUS, 0x0d, 0x24 },
{ OV511_I2C_BUS, 0x0f, 0x15 }, /* COMS */
- { OV511_I2C_BUS, 0x10, 0x75 }, /* AEC Exposure time */
+ { OV511_I2C_BUS, 0x10, 0x75 }, /* AEC Exposure time */
{ OV511_I2C_BUS, 0x12, 0x24 }, /* Enable AGC */
{ OV511_I2C_BUS, 0x14, 0x04 },
/* 0x16: 0x06 helps frame stability with moving objects */
@@ -5525,11 +5419,11 @@
{ OV511_I2C_BUS, 0x2a, 0x04 }, /* Disable framerate adjust */
// { OV511_I2C_BUS, 0x2b, 0xac }, /* Framerate; Set 2a[7] first */
{ OV511_I2C_BUS, 0x2d, 0x99 },
- { OV511_I2C_BUS, 0x33, 0xa0 }, /* Color Procesing Parameter */
+ { OV511_I2C_BUS, 0x33, 0xa0 }, /* Color Procesing Parameter */
{ OV511_I2C_BUS, 0x34, 0xd2 }, /* Max A/D range */
{ OV511_I2C_BUS, 0x38, 0x8b },
{ OV511_I2C_BUS, 0x39, 0x40 },
-
+
{ OV511_I2C_BUS, 0x3c, 0x39 }, /* Enable AEC mode changing */
{ OV511_I2C_BUS, 0x3c, 0x3c }, /* Change AEC mode */
{ OV511_I2C_BUS, 0x3c, 0x24 }, /* Disable AEC mode changing */
@@ -5609,7 +5503,7 @@
* control the color balance */
// /*OK?*/ { OV511_I2C_BUS, 0x4a, 0x80 }, // Check these
// /*OK?*/ { OV511_I2C_BUS, 0x4b, 0x80 },
-// /*U*/ { OV511_I2C_BUS, 0x4c, 0xd0 },
+// /*U*/ { OV511_I2C_BUS, 0x4c, 0xd0 },
/*d2?*/ { OV511_I2C_BUS, 0x4d, 0x10 }, /* This reduces noise a bit */
/*c1?*/ { OV511_I2C_BUS, 0x4e, 0x40 },
/*04?*/ { OV511_I2C_BUS, 0x4f, 0x07 },
@@ -5627,7 +5521,7 @@
};
PDEBUG(4, "starting sensor configuration");
-
+
if (init_ov_sensor(ov) < 0) {
err("Failed to read sensor ID. You might not have an OV6xx0,");
err("or it may be not responding. Report this to " EMAIL);
@@ -5642,7 +5536,7 @@
if (rc < 0) {
err("Error detecting sensor type");
return -1;
- }
+ }
if ((rc & 3) == 0)
ov->sensor = SEN_OV6630;
@@ -5676,7 +5570,7 @@
if (write_regvals(ov, aRegvalsNorm6x30))
return -1;
}
-
+
return 0;
}
@@ -5738,7 +5632,7 @@
}
/* This initializes the SAA7111A video decoder. */
-static int
+static int
saa7111a_configure(struct usb_ov511 *ov)
{
int rc;
@@ -5890,12 +5784,8 @@
err("Also include the output of the detection process.");
}
- if (ov->customid == 6) { /* USB Life TV (NTSC) */
- ov->tuner_type = 8; /* Temic 4036FY5 3X 1981 */
- } else if (ov->customid == 70) { /* USB Life TV (PAL/SECAM) */
- ov->tuner_type = 3; /* Philips FI1216MF */
+ if (ov->customid == 70) /* USB Life TV (PAL/SECAM) */
ov->pal = 1;
- }
if (write_regvals(ov, aRegvalsInit511)) goto error;
@@ -5917,7 +5807,7 @@
ov->packet_numbering = 1;
ov511_set_packet_size(ov, 0);
- ov->snap_enabled = snapshot;
+ ov->snap_enabled = snapshot;
/* Test for 7xx0 */
PDEBUG(3, "Testing for 0V7xx0");
@@ -5994,7 +5884,7 @@
}
/* This initializes the OV518/OV518+ and the sensor */
-static int
+static int
ov518_configure(struct usb_ov511 *ov)
{
/* For 518 and 518+ */
@@ -6190,7 +6080,6 @@
ov->lightfreq = lightfreq;
ov->num_inputs = 1; /* Video decoder init functs. change this */
ov->stop_during_set = !fastset;
- ov->tuner_type = tuner;
ov->backlight = backlight;
ov->mirror = mirror;
ov->auto_brt = autobright;
@@ -6221,7 +6110,7 @@
ov->bclass = BCL_OV511;
break;
default:
- err("Unknown product ID 0x%x", dev->descriptor.idProduct);
+ err("Unknown product ID 0x%04x", dev->descriptor.idProduct);
goto error_dealloc;
}
@@ -6388,7 +6277,7 @@
***************************************************************************/
/* Returns 0 for success */
-int
+int
ov511_register_decomp_module(int ver, struct ov51x_decomp_ops *ops, int ov518,
int mmx)
{
@@ -6445,7 +6334,7 @@
return -EBUSY;
}
-void
+void
ov511_deregister_decomp_module(int ov518, int mmx)
{
lock_kernel();
@@ -6461,13 +6350,13 @@
else
ov511_decomp_ops = NULL;
}
-
+
MOD_DEC_USE_COUNT;
unlock_kernel();
}
-static int __init
+static int __init
usb_ov511_init(void)
{
#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
@@ -6482,7 +6371,7 @@
return 0;
}
-static void __exit
+static void __exit
usb_ov511_exit(void)
{
usb_deregister(&ov511_driver);
diff -Nru a/drivers/usb/media/ov511.h b/drivers/usb/media/ov511.h
--- a/drivers/usb/media/ov511.h Mon Jul 8 01:36:08 2002
+++ b/drivers/usb/media/ov511.h Mon Jul 8 01:36:08 2002
@@ -551,17 +551,11 @@
int num_inputs; /* Number of inputs */
int norm; /* NTSC / PAL / SECAM */
int has_decoder; /* Device has a video decoder */
- int has_tuner; /* Device has a TV tuner */
- int has_audio_proc; /* Device has an audio processor */
- int freq; /* Current tuner frequency */
- int tuner_type; /* Specific tuner model */
int pal; /* Device is designed for PAL resolution */
- /* I2C interface to kernel */
+ /* I2C interface */
struct semaphore i2c_lock; /* Protect I2C controller regs */
unsigned char primary_i2c_slave; /* I2C write id of sensor */
- unsigned char tuner_i2c_slave; /* I2C write id of tuner */
- unsigned char audio_i2c_slave; /* I2C write id of audio processor */
/* Control transaction stuff */
unsigned char *cbuf; /* Buffer for payload */
===================================================================
This BitKeeper patch contains the following changesets:
1.657
## Wrapped with gzip_uu ##
begin 664 bkpatch9847
M'XL(`/A.*3T``^U:ZU,;.1+_;/\5.E*W9XC!TKR''*D0<+*N2P+'([>/;$V-
M/3*>PI[QS0/(+?N_7[>Z33PV;!*2+U=UWBP_K&ZU6JU6JUOBB3@O=;';FL7%
M9?N)^#$OJ]W6))Z&4LJ=Y&.69.5.7EP`Z23/@=2;955ODL^TU<,NO6HV[PTO
M>W4YW+9VW#;P'<?5:"*N=%'NMM2.?==2?9SKW=9)__7YF_V3=GMO3QQ,XNQ"
MG^I*[.VUAY<ODEI/=RZ+/)[@D+=WY%M+2J64Y4K;]91[:P6V[=PJ3PX3^#6Q
M_'`\],+V<!(72?EBF%[,\RS9R72U$]=-*9;TX3]7A8Y[:WO2L]J'0NUXKB^D
MU9-^3P9"JETKW+74MO1WI10XR1?K]A!/;;$MVR_%MZM]T!Z)\WD25UKD5ZY2
M(BE2L)ZH<F/$-,]01;4+;/!O6YSH67ZEQ:4N,CT5`^M`E/5\GA>5B+-$%'H*
MDA)Q]EY4=09B1GFB=\2@$M?I=`H"A!AJX$IG\ZF>Z0QY1WE1Z%$U_2C23%03
M+:R=FX46X!RI+LW`K](;<1T769I=E.)ZHC/H.)[email protected])7E=B7N2C<;G0
MZ*Y;H2^BHK,I$CVL+\1,EV5\H47G.BZA1YI51D21P\^K>%KK<O.NYQTY'XN)
MOF'Z'7F87]2ET$61%P+LGAAE8!9HR9OHRIE&^5QG'9(WF(%Z8+I$C],LK="R
M(+6&7Z.K--&YF.5)/=5B'A?QS/3H3]-9FN'25$7,,YVDE2[G\4AWC<%S,!A9
M68RF.L[J>;F\3$D^JM',\6*X?%CF4PT2EP<KV_\0=J!<JWW\:5>TM[_RTV[+
M6+:?W^.3M)@E;M.><;*=R2?O=&2HO%O'L1UUZSNAXSBN&]O!:*SU\"'_;TB<
MZ22-E^7B-@MD8(4JO)6V[]CW*G6X;)HEU:J;I:WC*`F;1EJ!&]SJP+)<QP]=
M+8=^.+(?5.XSDI?5@R&4]84V&ZW:S`YE:-U:MI/8.I:CH6N'B?_5)ANMZ@1A
M0BD3(?]D(O?'S&^V:?L"]NH+$@C;^_.F="Q'>4[@JEM/!0X%U&`UG*KP<^%4
MBFW+_6[Q]*LW'[G!D=@NKLT_V$S'?V;]1^S-0V4KH22@YPB_?6AY2@1FE1]T
MC/O7^+&.N;JTG_%'3^%):2MYZ]FAI<S"VO+K5U8%%JQM:'^WQ?W_$?@_<`3"
M>6:BV,J6>M#G'K6A+`%N";M)M0?FYQ,S+2T.3P;O^R<1_'\Z.'HG-JXP@1)C
M,-";-*MO8''=C?:A[V)W!3Z-$/H"@I<E%4HC>'MT>/ZF'QWOG[SM?#)15VRH
M[0T114P^/3L9O'O=.7H/\XC>[O\4G;\;G$7O!X?]HTVQD6YL/FL?VHX$Z0.P
M"(@M,:",8(FFJ"NL+7A85N9%=*&K:)Z.JKK0G;(JZE$EP$X1985;7>R/,WZ2
MCFG]=-(Y.'KW:O`Z.CXY.HA>G6Z*'WY8)1E%[[EMAIL PROTECTED]^,)GIT&959
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
M?`[email protected],'CL3FO45K"/8K<CKBXDYZQP?UCKPX)?`(K<A;!@Q,/>C`\9[
M<ALGE&0C0DHVKB&)C/25SBJJY8IZ7J7#J5Y$H>M_XT8-*5MGA$P%9]<9Y756
MB:>+Z#S\6.D2$I4X`6]Q)5VE,#:N+BW*PA@;)%AF0R+L]<11AL\295EK$2]>
M'TS2"[Z%_*Z%R^^Z='7-V!#ITO'*V&K]SN4>7JV\/#\U^8_$G[XK_NAB9;K?
M/Q#]FWEN?!ACO%D$%_0E05;PD"#;QI^Q9$$'^10T/2[RD2Y1[V/<71JLS`)Y
MLH3@[*Y'61PCV+FW=;[5NV\D9X0_$QP)^YE[_`&CD>2XU&(0$U2778T1F7RJ
MTQ@;5@M"<Z\(>)?-F!O2&NJX69I@,N/+3>.NYZ<OQ9MTK/'-J0.Y2>^T#_MH
MD^88A&BL0Y?ONABI(LSB>:2S&+P-R\+%]?LSY*9[!\;&E;`RZ?6AQS4^8PLC
M6F?C/+L$O\CP&2K!`WIP:!)>YP8.GD3#F(DN1T4ZK_)B)TV.B<M<0=N4WS+2
M4`Y=&S(N;L873RX>WW1YCL^7Y7[SFD9$)HM'#LHSO$:>@?*`1=\`RY\]A$Z^
M]"'T"_^JX4M?0B?-)V[GUH9"+S`OH<IYQ$NHV/:_]Q/W%SU^XFL<_A7&%S[&
M31[S&.>Z^%`!6XRWX>*6`!4T874<CSB*>'@+=O=W8>;EJ:QG>V$L/7<L9?N_
(C%!(6Y0F````
`
end