patch-2.4.19 linux-2.4.19/drivers/usb/ov511.c
Next file: linux-2.4.19/drivers/usb/ov511.h
Previous file: linux-2.4.19/drivers/usb/kaweth.c
Back to the patch index
Back to the overall index
- Lines: 5989
- Date:
Fri Aug 2 17:39:45 2002
- Orig file:
linux-2.4.18/drivers/usb/ov511.c
- Orig date:
Mon Feb 25 11:38:07 2002
diff -urN linux-2.4.18/drivers/usb/ov511.c linux-2.4.19/drivers/usb/ov511.c
@@ -1,7 +1,7 @@
/*
* OmniVision OV511 Camera-to-USB Bridge Driver
*
- * Copyright (c) 1999-2001 Mark W. McClelland
+ * Copyright (c) 1999-2002 Mark W. McClelland
* Original decompression code Copyright 1998-2000 OmniVision Technologies
* Many improvements by Bret Wallach <bwallac1@san.rr.com>
* Color fixes by by Orion Sky Lawlor <olawlor@acm.org> (2/26/2000)
@@ -57,7 +57,7 @@
/*
* Version Information
*/
-#define DRIVER_VERSION "v1.48a for Linux 2.4"
+#define DRIVER_VERSION "v1.50 for Linux 2.4"
#define EMAIL "mmcclell@bigfoot.com"
#define DRIVER_AUTHOR "Mark McClelland <mmcclell@bigfoot.com> & Bret Wallach \
& Orion Sky Lawlor <olawlor@acm.org> & Kevin Moore & Charl P. Botha \
@@ -308,7 +308,7 @@
static inline int sensor_get_picture(struct usb_ov511 *,
struct video_picture *);
static int sensor_get_exposure(struct usb_ov511 *, unsigned char *);
-static int ov511_control_ioctl(struct inode *, struct file *, unsigned int,
+static int ov51x_control_ioctl(struct inode *, struct file *, unsigned int,
unsigned long);
/**********************************************************************
@@ -331,6 +331,7 @@
{ 100, "Lifeview RoboCam" },
{ 102, "AverMedia InterCam Elite" },
{ 112, "MediaForte MV300" }, /* or OV7110 evaluation kit */
+ { 192, "Webeye 2000B" },
{ -1, NULL }
};
@@ -493,7 +494,7 @@
extern struct proc_dir_entry *video_proc_entry;
static struct file_operations ov511_control_fops = {
- ioctl: ov511_control_ioctl,
+ ioctl: ov51x_control_ioctl,
};
#define YES_NO(x) ((x) ? "yes" : "no")
@@ -505,29 +506,29 @@
{
char *out = page;
int i, j, len;
- struct usb_ov511 *ov511 = data;
+ struct usb_ov511 *ov = data;
struct video_picture p;
unsigned char exp;
- if (!ov511 || !ov511->dev)
+ if (!ov || !ov->dev)
return -ENODEV;
- sensor_get_picture(ov511, &p);
- sensor_get_exposure(ov511, &exp);
+ sensor_get_picture(ov, &p);
+ sensor_get_exposure(ov, &exp);
/* IMPORTANT: This output MUST be kept under PAGE_SIZE
* or we need to get more sophisticated. */
out += sprintf(out, "driver_version : %s\n", DRIVER_VERSION);
- out += sprintf(out, "custom_id : %d\n", ov511->customid);
- out += sprintf(out, "model : %s\n", ov511->desc ?
- clist[ov511->desc].description : "unknown");
- out += sprintf(out, "streaming : %s\n", YES_NO(ov511->streaming));
- out += sprintf(out, "grabbing : %s\n", YES_NO(ov511->grabbing));
- out += sprintf(out, "compress : %s\n", YES_NO(ov511->compress));
- out += sprintf(out, "subcapture : %s\n", YES_NO(ov511->sub_flag));
+ out += sprintf(out, "custom_id : %d\n", ov->customid);
+ out += sprintf(out, "model : %s\n", ov->desc ?
+ clist[ov->desc].description : "unknown");
+ out += sprintf(out, "streaming : %s\n", YES_NO(ov->streaming));
+ out += sprintf(out, "grabbing : %s\n", YES_NO(ov->grabbing));
+ out += sprintf(out, "compress : %s\n", YES_NO(ov->compress));
+ out += sprintf(out, "subcapture : %s\n", YES_NO(ov->sub_flag));
out += sprintf(out, "sub_size : %d %d %d %d\n",
- ov511->subx, ov511->suby, ov511->subw, ov511->subh);
+ ov->subx, ov->suby, ov->subw, ov->subh);
out += sprintf(out, "data_format : %s\n",
force_rgb ? "RGB" : "BGR");
out += sprintf(out, "brightness : %d\n", p.brightness >> 8);
@@ -539,12 +540,12 @@
for (i = 0; i < OV511_NUMFRAMES; i++) {
out += sprintf(out, "frame : %d\n", i);
out += sprintf(out, " depth : %d\n",
- ov511->frame[i].depth);
+ ov->frame[i].depth);
out += sprintf(out, " size : %d %d\n",
- ov511->frame[i].width, ov511->frame[i].height);
+ ov->frame[i].width, ov->frame[i].height);
out += sprintf(out, " format : ");
for (j = 0; plist[j].num >= 0; j++) {
- if (plist[j].num == ov511->frame[i].format) {
+ if (plist[j].num == ov->frame[i].format) {
out += sprintf(out, "%s\n", plist[j].name);
break;
}
@@ -552,29 +553,28 @@
if (plist[j].num < 0)
out += sprintf(out, "unknown\n");
out += sprintf(out, " data_buffer : 0x%p\n",
- ov511->frame[i].data);
+ ov->frame[i].data);
}
- out += sprintf(out, "snap_enabled : %s\n",
- YES_NO(ov511->snap_enabled));
+ out += sprintf(out, "snap_enabled : %s\n", YES_NO(ov->snap_enabled));
out += sprintf(out, "bridge : %s\n",
- ov511->bridge == BRG_OV511 ? "OV511" :
- ov511->bridge == BRG_OV511PLUS ? "OV511+" :
- ov511->bridge == BRG_OV518 ? "OV518" :
- ov511->bridge == BRG_OV518PLUS ? "OV518+" :
+ ov->bridge == BRG_OV511 ? "OV511" :
+ ov->bridge == BRG_OV511PLUS ? "OV511+" :
+ ov->bridge == BRG_OV518 ? "OV518" :
+ ov->bridge == BRG_OV518PLUS ? "OV518+" :
"unknown");
out += sprintf(out, "sensor : %s\n",
- ov511->sensor == SEN_OV6620 ? "OV6620" :
- ov511->sensor == SEN_OV6630 ? "OV6630" :
- ov511->sensor == SEN_OV7610 ? "OV7610" :
- ov511->sensor == SEN_OV7620 ? "OV7620" :
- ov511->sensor == SEN_OV7620AE ? "OV7620AE" :
- ov511->sensor == SEN_OV8600 ? "OV8600" :
- ov511->sensor == SEN_KS0127 ? "KS0127" :
- ov511->sensor == SEN_KS0127B ? "KS0127B" :
- ov511->sensor == SEN_SAA7111A ? "SAA7111A" :
+ ov->sensor == SEN_OV6620 ? "OV6620" :
+ ov->sensor == SEN_OV6630 ? "OV6630" :
+ ov->sensor == SEN_OV7610 ? "OV7610" :
+ ov->sensor == SEN_OV7620 ? "OV7620" :
+ ov->sensor == SEN_OV7620AE ? "OV7620AE" :
+ ov->sensor == SEN_OV8600 ? "OV8600" :
+ ov->sensor == SEN_KS0127 ? "KS0127" :
+ ov->sensor == SEN_KS0127B ? "KS0127B" :
+ ov->sensor == SEN_SAA7111A ? "SAA7111A" :
"unknown");
- out += sprintf(out, "packet_size : %d\n", ov511->packet_size);
- out += sprintf(out, "framebuffer : 0x%p\n", ov511->fbuf);
+ out += sprintf(out, "packet_size : %d\n", ov->packet_size);
+ out += sprintf(out, "framebuffer : 0x%p\n", ov->fbuf);
len = out - page;
len -= off;
@@ -607,16 +607,16 @@
{
char *out = page;
int len, status;
- struct usb_ov511 *ov511 = data;
+ struct usb_ov511 *ov = data;
- if (!ov511 || !ov511->dev)
+ if (!ov || !ov->dev)
return -ENODEV;
- status = ov51x_check_snapshot(ov511);
+ status = ov51x_check_snapshot(ov);
out += sprintf(out, "%d", status);
if (status)
- ov51x_clear_snapshot(ov511);
+ ov51x_clear_snapshot(ov);
len = out - page;
len -= off;
@@ -636,18 +636,19 @@
static void
create_proc_ov511_cam(struct usb_ov511 *ov511)
{
- char dirname[4];
+ char dirname[10];
if (!ov511_proc_entry || !ov511)
return;
/* Create per-device directory */
- sprintf(dirname, "%d", ov511->vdev.minor);
+ snprintf(dirname, 10, "%d", ov511->vdev.minor);
PDEBUG(4, "creating /proc/video/ov511/%s/", dirname);
ov511->proc_devdir = create_proc_entry(dirname, S_IFDIR,
ov511_proc_entry);
if (!ov511->proc_devdir)
return;
+ ov511->proc_devdir->owner = THIS_MODULE;
/* Create "info" entry (human readable device information) */
PDEBUG(4, "creating /proc/video/ov511/%s/info", dirname);
@@ -656,6 +657,7 @@
ov511_read_proc_info, ov511);
if (!ov511->proc_info)
return;
+ ov511->proc_info->owner = THIS_MODULE;
/* Don't create it if old snapshot mode on (would cause race cond.) */
if (!snapshot) {
@@ -667,6 +669,7 @@
if (!ov511->proc_button)
return;
}
+ ov511->proc_button->owner = THIS_MODULE;
/* Create "control" entry (ioctl() interface) */
PDEBUG(4, "creating /proc/video/ov511/%s/control", dirname);
@@ -677,6 +680,7 @@
unlock_kernel();
return;
}
+ ov511->proc_control->owner = THIS_MODULE;
ov511->proc_control->data = ov511;
ov511->proc_control->proc_fops = &ov511_control_fops;
unlock_kernel();
@@ -685,12 +689,12 @@
static void
destroy_proc_ov511_cam(struct usb_ov511 *ov511)
{
- char dirname[4];
+ char dirname[10];
if (!ov511 || !ov511->proc_devdir)
return;
- sprintf(dirname, "%d", ov511->vdev.minor);
+ snprintf(dirname, 10, "%d", ov511->vdev.minor);
/* Destroy "control" entry */
if (ov511->proc_control) {
@@ -758,18 +762,22 @@
*
**********************************************************************/
+/* Write an OV51x register */
static int
-ov511_reg_write(struct usb_device *dev, unsigned char reg, unsigned char value)
+reg_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
{
int rc;
PDEBUG(5, "0x%02X:0x%02X", reg, value);
- rc = usb_control_msg(dev,
- usb_sndctrlpipe(dev, 0),
+ down(&ov->cbuf_lock);
+ ov->cbuf[0] = value;
+ rc = usb_control_msg(ov->dev,
+ usb_sndctrlpipe(ov->dev, 0),
2 /* REG_IO */,
USB_TYPE_CLASS | USB_RECIP_DEVICE,
- 0, (__u16)reg, &value, 1, HZ);
+ 0, (__u16)reg, &ov->cbuf[0], 1, HZ);
+ up(&ov->cbuf_lock);
if (rc < 0)
err("reg write: error %d", rc);
@@ -777,45 +785,48 @@
return rc;
}
+/* Read from an OV51x register */
/* returns: negative is error, pos or zero is data */
static int
-ov511_reg_read(struct usb_device *dev, unsigned char reg)
+reg_r(struct usb_ov511 *ov, unsigned char reg)
{
int rc;
- unsigned char buffer[1];
- rc = usb_control_msg(dev,
- usb_rcvctrlpipe(dev, 0),
+ down(&ov->cbuf_lock);
+ rc = usb_control_msg(ov->dev,
+ usb_rcvctrlpipe(ov->dev, 0),
2 /* REG_IO */,
USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_DEVICE,
- 0, (__u16)reg, buffer, 1, HZ);
+ 0, (__u16)reg, &ov->cbuf[0], 1, HZ);
- PDEBUG(5, "0x%02X:0x%02X", reg, buffer[0]);
+ PDEBUG(5, "0x%02X:0x%02X", reg, ov->cbuf[0]);
- if (rc < 0) {
+ if (rc < 0)
err("reg read: error %d", rc);
- return rc;
- } else {
- return buffer[0];
- }
+ else
+ rc = ov->cbuf[0];
+
+ up(&ov->cbuf_lock);
+
+ return rc;
}
/*
- * Writes bits at positions specified by mask to a reg. Bits that are in
+ * 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
* of their respective state in "value".
*/
static int
-ov511_reg_write_mask(struct usb_device *dev,
- unsigned char reg,
- unsigned char value,
- unsigned char mask)
+reg_w_mask(struct usb_ov511 *ov,
+ unsigned char reg,
+ unsigned char value,
+ unsigned char mask)
{
int ret;
unsigned char oldval, newval;
- ret = ov511_reg_read(dev, reg);
+ ret = reg_r(ov, reg);
if (ret < 0)
return ret;
@@ -824,31 +835,30 @@
value &= mask; /* Enforce mask on value */
newval = oldval | value; /* Set the desired bits */
- return (ov511_reg_write(dev, reg, newval));
+ return (reg_w(ov, reg, newval));
}
-/* Writes multiple (n) values to a single register. Only valid with certain
- * registers (0x30 and 0xc4 - 0xce). Used for writing 16 and 24-bit values. */
+/*
+ * Writes multiple (n) byte value to a single register. Only valid with certain
+ * registers (0x30 and 0xc4 - 0xce).
+ */
static int
-ov518_reg_write_multi(struct usb_device *dev,
- unsigned char reg,
- unsigned char *values,
- int n)
+ov518_reg_w32(struct usb_ov511 *ov, unsigned char reg, u32 val, int n)
{
int rc;
- PDEBUG(5, "0x%02X:[multiple], n=%d", reg, n); // FIXME
+ PDEBUG(5, "0x%02X:%7d, n=%d", reg, val, n);
- if (values == NULL) {
- err("reg write multiple: NULL buffer");
- return -EINVAL;
- }
+ down(&ov->cbuf_lock);
+
+ *((u32 *)ov->cbuf) = __cpu_to_le32(val);
- rc = usb_control_msg(dev,
- usb_sndctrlpipe(dev, 0),
+ rc = usb_control_msg(ov->dev,
+ usb_sndctrlpipe(ov->dev, 0),
2 /* REG_IO */,
USB_TYPE_CLASS | USB_RECIP_DEVICE,
- 0, (__u16)reg, values, n, HZ);
+ 0, (__u16)reg, ov->cbuf, n, HZ);
+ up(&ov->cbuf_lock);
if (rc < 0)
err("reg write multiple: error %d", rc);
@@ -857,12 +867,12 @@
}
static int
-ov511_upload_quan_tables(struct usb_device *dev)
+ov511_upload_quan_tables(struct usb_ov511 *ov)
{
unsigned char *pYTable = yQuanTable511;
unsigned char *pUVTable = uvQuanTable511;
unsigned char val0, val1;
- int i, rc, reg = OV511_OMNICE_Y_LUT_BEGIN;
+ int i, rc, reg = R511_COMP_LUT_BEGIN;
PDEBUG(4, "Uploading quantization tables");
@@ -875,7 +885,7 @@
val0 &= 0x0f;
val1 &= 0x0f;
val0 |= val1 << 4;
- rc = ov511_reg_write(dev, reg, val0);
+ rc = reg_w(ov, reg, val0);
if (rc < 0)
return rc;
}
@@ -887,8 +897,7 @@
val0 &= 0x0f;
val1 &= 0x0f;
val0 |= val1 << 4;
- rc = ov511_reg_write(dev, reg + OV511_QUANTABLESIZE / 2,
- val0);
+ rc = reg_w(ov, reg + OV511_QUANTABLESIZE/2, val0);
if (rc < 0)
return rc;
}
@@ -901,12 +910,12 @@
/* OV518 quantization tables are 8x4 (instead of 8x8) */
static int
-ov518_upload_quan_tables(struct usb_device *dev)
+ov518_upload_quan_tables(struct usb_ov511 *ov)
{
unsigned char *pYTable = yQuanTable518;
unsigned char *pUVTable = uvQuanTable518;
unsigned char val0, val1;
- int i, rc, reg = OV511_OMNICE_Y_LUT_BEGIN;
+ int i, rc, reg = R511_COMP_LUT_BEGIN;
PDEBUG(4, "Uploading quantization tables");
@@ -919,7 +928,7 @@
val0 &= 0x0f;
val1 &= 0x0f;
val0 |= val1 << 4;
- rc = ov511_reg_write(dev, reg, val0);
+ rc = reg_w(ov, reg, val0);
if (rc < 0)
return rc;
}
@@ -931,8 +940,7 @@
val0 &= 0x0f;
val1 &= 0x0f;
val0 |= val1 << 4;
- rc = ov511_reg_write(dev, reg + OV518_QUANTABLESIZE / 2,
- val0);
+ rc = reg_w(ov, reg + OV518_QUANTABLESIZE/2, val0);
if (rc < 0)
return rc;
}
@@ -943,13 +951,39 @@
return 0;
}
+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);
+
+ rc = reg_w(ov, R51x_SYS_RESET, reset_type);
+ rc = reg_w(ov, R51x_SYS_RESET, 0);
+
+ if (rc < 0)
+ err("reset: command failed");
+
+ return rc;
+}
+
+/**********************************************************************
+ *
+ * I2C (sensor) I/O
+ *
+ **********************************************************************/
+
/* NOTE: Do not call this function directly!
* The OV518 I2C I/O procedure is different, hence, this function.
- * This is normally only called from ov51x_i2c_write(). Note that this function
+ * 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
-ov518_i2c_write_internal(struct usb_device *dev,
+ov518_i2c_write_internal(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value)
{
@@ -958,15 +992,15 @@
PDEBUG(5, "0x%02X:0x%02X", reg, value);
/* Select camera register */
- rc = ov511_reg_write(dev, OV511_REG_I2C_SUB_ADDRESS_3_BYTE, reg);
+ rc = reg_w(ov, R51x_I2C_SADDR_3, reg);
if (rc < 0) goto error;
/* Write "value" to I2C data port of OV511 */
- rc = ov511_reg_write(dev, OV511_REG_I2C_DATA_PORT, value);
+ rc = reg_w(ov, R51x_I2C_DATA, value);
if (rc < 0) goto error;
/* Initiate 3-byte write cycle */
- rc = ov511_reg_write(dev, OV518_REG_I2C_CONTROL, 0x01);
+ rc = reg_w(ov, R518_I2C_CTL, 0x01);
if (rc < 0) goto error;
return 0;
@@ -978,7 +1012,7 @@
/* NOTE: Do not call this function directly! */
static int
-ov511_i2c_write_internal(struct usb_device *dev,
+ov511_i2c_write_internal(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value)
{
@@ -989,19 +1023,18 @@
/* Three byte write cycle */
for (retries = OV511_I2C_RETRIES; ; ) {
/* Select camera register */
- rc = ov511_reg_write(dev, OV511_REG_I2C_SUB_ADDRESS_3_BYTE,
- reg);
+ rc = reg_w(ov, R51x_I2C_SADDR_3, reg);
if (rc < 0) goto error;
/* Write "value" to I2C data port of OV511 */
- rc = ov511_reg_write(dev, OV511_REG_I2C_DATA_PORT, value);
+ rc = reg_w(ov, R51x_I2C_DATA, value);
if (rc < 0) goto error;
/* Initiate 3-byte write cycle */
- rc = ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x01);
+ rc = reg_w(ov, R511_I2C_CTL, 0x01);
if (rc < 0) goto error;
- do rc = ov511_reg_read(dev, OV511_REG_I2C_CONTROL);
+ do rc = reg_r(ov, R511_I2C_CTL);
while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
if (rc < 0) goto error;
@@ -1009,7 +1042,7 @@
break;
#if 0
/* I2C abort */
- ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x10);
+ reg_w(ov, R511_I2C_CTL, 0x10);
#endif
if (--retries < 0) {
err("i2c write retries exhausted");
@@ -1027,27 +1060,27 @@
/* NOTE: Do not call this function directly!
* The OV518 I2C I/O procedure is different, hence, this function.
- * This is normally only called from ov51x_i2c_read(). Note that this function
+ * 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
-ov518_i2c_read_internal(struct usb_device *dev, unsigned char reg)
+ov518_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
{
int rc, value;
/* Select camera register */
- rc = ov511_reg_write(dev, OV511_REG_I2C_SUB_ADDRESS_2_BYTE, reg);
+ rc = reg_w(ov, R51x_I2C_SADDR_2, reg);
if (rc < 0) goto error;
/* Initiate 2-byte write cycle */
- rc = ov511_reg_write(dev, OV518_REG_I2C_CONTROL, 0x03);
+ rc = reg_w(ov, R518_I2C_CTL, 0x03);
if (rc < 0) goto error;
/* Initiate 2-byte read cycle */
- rc = ov511_reg_write(dev, OV518_REG_I2C_CONTROL, 0x05);
+ rc = reg_w(ov, R518_I2C_CTL, 0x05);
if (rc < 0) goto error;
- value = ov511_reg_read(dev, OV511_REG_I2C_DATA_PORT);
+ value = reg_r(ov, R51x_I2C_DATA);
PDEBUG(5, "0x%02X:0x%02X", reg, value);
@@ -1061,22 +1094,21 @@
/* NOTE: Do not call this function directly!
* returns: negative is error, pos or zero is data */
static int
-ov511_i2c_read_internal(struct usb_device *dev, unsigned char reg)
+ov511_i2c_read_internal(struct usb_ov511 *ov, unsigned char reg)
{
int rc, value, retries;
/* Two byte write cycle */
for (retries = OV511_I2C_RETRIES; ; ) {
/* Select camera register */
- rc = ov511_reg_write(dev, OV511_REG_I2C_SUB_ADDRESS_2_BYTE,
- reg);
+ rc = reg_w(ov, R51x_I2C_SADDR_2, reg);
if (rc < 0) goto error;
/* Initiate 2-byte write cycle */
- rc = ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x03);
+ rc = reg_w(ov, R511_I2C_CTL, 0x03);
if (rc < 0) goto error;
- do rc = ov511_reg_read(dev, OV511_REG_I2C_CONTROL);
+ do rc = reg_r(ov, R511_I2C_CTL);
while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
if (rc < 0) goto error;
@@ -1084,7 +1116,7 @@
break;
/* I2C abort */
- ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x10);
+ reg_w(ov, R511_I2C_CTL, 0x10);
if (--retries < 0) {
err("i2c write retries exhausted");
@@ -1096,10 +1128,10 @@
/* Two byte read cycle */
for (retries = OV511_I2C_RETRIES; ; ) {
/* Initiate 2-byte read cycle */
- rc = ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x05);
+ rc = reg_w(ov, R511_I2C_CTL, 0x05);
if (rc < 0) goto error;
- do rc = ov511_reg_read(dev, OV511_REG_I2C_CONTROL);
+ do rc = reg_r(ov, R511_I2C_CTL);
while (rc > 0 && ((rc&1) == 0)); /* Retry until idle */
if (rc < 0) goto error;
@@ -1107,7 +1139,7 @@
break;
/* I2C abort */
- rc = ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x10);
+ rc = reg_w(ov, R511_I2C_CTL, 0x10);
if (rc < 0) goto error;
if (--retries < 0) {
@@ -1117,12 +1149,12 @@
}
}
- value = ov511_reg_read(dev, OV511_REG_I2C_DATA_PORT);
+ value = reg_r(ov, R51x_I2C_DATA);
PDEBUG(5, "0x%02X:0x%02X", reg, value);
- /* This is needed to make ov51x_i2c_write() work */
- rc = ov511_reg_write(dev, OV511_REG_I2C_CONTROL, 0x05);
+ /* This is needed to make i2c_w() work */
+ rc = reg_w(ov, R511_I2C_CTL, 0x05);
if (rc < 0)
goto error;
@@ -1135,48 +1167,42 @@
/* returns: negative is error, pos or zero is data */
static int
-ov51x_i2c_read(struct usb_ov511 *ov511, unsigned char reg)
+i2c_r(struct usb_ov511 *ov, unsigned char reg)
{
int rc;
- struct usb_device *dev = ov511->dev;
- down(&ov511->i2c_lock);
+ down(&ov->i2c_lock);
- if (dev->descriptor.idProduct == PROD_OV518 ||
- dev->descriptor.idProduct == PROD_OV518PLUS)
- rc = ov518_i2c_read_internal(dev, reg);
+ if (ov->bclass == BCL_OV518)
+ rc = ov518_i2c_read_internal(ov, reg);
else
- rc = ov511_i2c_read_internal(dev, reg);
+ rc = ov511_i2c_read_internal(ov, reg);
- up(&ov511->i2c_lock);
+ up(&ov->i2c_lock);
return rc;
}
static int
-ov51x_i2c_write(struct usb_ov511 *ov511,
- unsigned char reg,
- unsigned char value)
+i2c_w(struct usb_ov511 *ov, unsigned char reg, unsigned char value)
{
int rc;
- struct usb_device *dev = ov511->dev;
- down(&ov511->i2c_lock);
+ down(&ov->i2c_lock);
- if (dev->descriptor.idProduct == PROD_OV518 ||
- dev->descriptor.idProduct == PROD_OV518PLUS)
- rc = ov518_i2c_write_internal(dev, reg, value);
+ if (ov->bclass == BCL_OV518)
+ rc = ov518_i2c_write_internal(ov, reg, value);
else
- rc = ov511_i2c_write_internal(dev, reg, value);
+ rc = ov511_i2c_write_internal(ov, reg, value);
- up(&ov511->i2c_lock);
+ up(&ov->i2c_lock);
return rc;
}
/* Do not call this function directly! */
static int
-ov51x_i2c_write_mask_internal(struct usb_device *dev,
+ov51x_i2c_write_mask_internal(struct usb_ov511 *ov,
unsigned char reg,
unsigned char value,
unsigned char mask)
@@ -1187,11 +1213,10 @@
if (mask == 0xff) {
newval = value;
} else {
- if (dev->descriptor.idProduct == PROD_OV518 ||
- dev->descriptor.idProduct == PROD_OV518PLUS)
- rc = ov518_i2c_read_internal(dev, reg);
+ if (ov->bclass == BCL_OV518)
+ rc = ov518_i2c_read_internal(ov, reg);
else
- rc = ov511_i2c_read_internal(dev, reg);
+ rc = ov511_i2c_read_internal(ov, reg);
if (rc < 0)
return rc;
@@ -1201,11 +1226,10 @@
newval = oldval | value; /* Set the desired bits */
}
- if (dev->descriptor.idProduct == PROD_OV518 ||
- dev->descriptor.idProduct == PROD_OV518PLUS)
- return (ov518_i2c_write_internal(dev, reg, newval));
+ if (ov->bclass == BCL_OV518)
+ return (ov518_i2c_write_internal(ov, reg, newval));
else
- return (ov511_i2c_write_internal(dev, reg, newval));
+ return (ov511_i2c_write_internal(ov, reg, newval));
}
/* Writes bits at positions specified by mask to an I2C reg. Bits that are in
@@ -1214,126 +1238,138 @@
* of their respective state in "value".
*/
static int
-ov51x_i2c_write_mask(struct usb_ov511 *ov511,
- unsigned char reg,
- unsigned char value,
- unsigned char mask)
+i2c_w_mask(struct usb_ov511 *ov,
+ unsigned char reg,
+ unsigned char value,
+ unsigned char mask)
{
int rc;
- struct usb_device *dev = ov511->dev;
- down(&ov511->i2c_lock);
- rc = ov51x_i2c_write_mask_internal(dev, reg, value, mask);
- up(&ov511->i2c_lock);
+ down(&ov->i2c_lock);
+ rc = ov51x_i2c_write_mask_internal(ov, reg, value, mask);
+ up(&ov->i2c_lock);
return rc;
}
/* Write to a specific I2C slave ID and register, using the specified mask */
static int
-ov51x_i2c_write_slave(struct usb_ov511 *ov511,
- unsigned char slave,
- unsigned char reg,
- unsigned char value,
- unsigned char mask)
+i2c_w_slave(struct usb_ov511 *ov,
+ unsigned char slave,
+ unsigned char reg,
+ unsigned char value,
+ unsigned char mask)
{
int rc = 0;
- struct usb_device *dev = ov511->dev;
- down(&ov511->i2c_lock);
+ down(&ov->i2c_lock);
/* Set new slave IDs */
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, slave) < 0) {
+ if (reg_w(ov, R51x_I2C_W_SID, slave) < 0) {
rc = -EIO;
goto out;
}
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, slave + 1) < 0) {
+ if (reg_w(ov, R51x_I2C_R_SID, slave + 1) < 0) {
rc = -EIO;
goto out;
}
- rc = ov51x_i2c_write_mask_internal(dev, reg, value, mask);
+ rc = ov51x_i2c_write_mask_internal(ov, reg, value, mask);
/* Don't bail out yet if error; IDs must be restored */
/* Restore primary IDs */
- slave = ov511->primary_i2c_slave;
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, slave) < 0) {
+ slave = ov->primary_i2c_slave;
+ if (reg_w(ov, R51x_I2C_W_SID, slave) < 0) {
rc = -EIO;
goto out;
}
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, slave + 1) < 0) {
+ if (reg_w(ov, R51x_I2C_R_SID, slave + 1) < 0) {
rc = -EIO;
goto out;
}
out:
- up(&ov511->i2c_lock);
+ up(&ov->i2c_lock);
return rc;
}
/* Read from a specific I2C slave ID and register */
static int
-ov51x_i2c_read_slave(struct usb_ov511 *ov511,
- unsigned char slave,
- unsigned char reg)
+i2c_r_slave(struct usb_ov511 *ov,
+ unsigned char slave,
+ unsigned char reg)
{
int rc;
- struct usb_device *dev = ov511->dev;
- down(&ov511->i2c_lock);
+ down(&ov->i2c_lock);
/* Set new slave IDs */
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, slave) < 0) {
+ if (reg_w(ov, R51x_I2C_W_SID, slave) < 0) {
rc = -EIO;
goto out;
}
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, slave + 1) < 0) {
+ if (reg_w(ov, R51x_I2C_R_SID, slave + 1) < 0) {
rc = -EIO;
goto out;
}
- if (dev->descriptor.idProduct == PROD_OV518 ||
- dev->descriptor.idProduct == PROD_OV518PLUS)
- rc = ov518_i2c_read_internal(dev, reg);
+ if (ov->bclass == BCL_OV518)
+ rc = ov518_i2c_read_internal(ov, reg);
else
- rc = ov511_i2c_read_internal(dev, reg);
+ rc = ov511_i2c_read_internal(ov, reg);
/* Don't bail out yet if error; IDs must be restored */
/* Restore primary IDs */
- slave = ov511->primary_i2c_slave;
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, slave) < 0) {
+ slave = ov->primary_i2c_slave;
+ if (reg_w(ov, R51x_I2C_W_SID, slave) < 0) {
rc = -EIO;
goto out;
}
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, slave + 1) < 0) {
+ if (reg_w(ov, R51x_I2C_R_SID, slave + 1) < 0) {
rc = -EIO;
goto out;
}
out:
- up(&ov511->i2c_lock);
+ up(&ov->i2c_lock);
return rc;
}
+/* Sets I2C read and write slave IDs. Returns <0 for error */
static int
-ov511_write_regvals(struct usb_ov511 *ov511,
- struct ov511_regvals * pRegvals)
+ov51x_set_slave_ids(struct usb_ov511 *ov, unsigned char sid)
+{
+ down(&ov->i2c_lock);
+
+ if (reg_w(ov, R51x_I2C_W_SID, sid) < 0)
+ return -EIO;
+
+ if (reg_w(ov, R51x_I2C_R_SID, sid + 1) < 0)
+ return -EIO;
+
+ if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
+ return -EIO;
+
+ up(&ov->i2c_lock);
+
+ return 0;
+}
+
+static int
+write_regvals(struct usb_ov511 *ov, struct ov511_regvals * pRegvals)
{
int rc;
- struct usb_device *dev = ov511->dev;
while (pRegvals->bus != OV511_DONE_BUS) {
if (pRegvals->bus == OV511_REG_BUS) {
- if ((rc = ov511_reg_write(dev, pRegvals->reg,
- pRegvals->val)) < 0)
+ if ((rc = reg_w(ov, pRegvals->reg, pRegvals->val)) < 0)
goto error;
} else if (pRegvals->bus == OV511_I2C_BUS) {
- if ((rc = ov51x_i2c_write(ov511, pRegvals->reg,
- pRegvals->val)) < 0)
+ if ((rc = i2c_w(ov, pRegvals->reg, pRegvals->val)) < 0)
goto error;
} else {
err("Bad regval array");
@@ -1351,57 +1387,60 @@
#ifdef OV511_DEBUG
static void
-ov511_dump_i2c_range(struct usb_ov511 *ov511, int reg1, int regn)
+dump_i2c_range(struct usb_ov511 *ov, int reg1, int regn)
{
int i;
int rc;
+
for (i = reg1; i <= regn; i++) {
- rc = ov51x_i2c_read(ov511, i);
+ rc = i2c_r(ov, i);
info("OV7610[0x%X] = 0x%X", i, rc);
}
}
static void
-ov51x_dump_i2c_regs(struct usb_ov511 *ov511)
+dump_i2c_regs(struct usb_ov511 *ov)
{
info("I2C REGS");
- ov511_dump_i2c_range(ov511, 0x00, 0x7C);
+ dump_i2c_range(ov, 0x00, 0x7C);
}
static void
-ov511_dump_reg_range(struct usb_device *dev, int reg1, int regn)
+dump_reg_range(struct usb_ov511 *ov, int reg1, int regn)
{
int i;
int rc;
+
for (i = reg1; i <= regn; i++) {
- rc = ov511_reg_read(dev, i);
- info("OV511[0x%X] = 0x%X", i, rc);
+ rc = reg_r(ov, i);
+ info("OV511[0x%X] = 0x%X", i, rc);
}
}
+/* FIXME: Should there be an OV518 version of this? */
static void
-ov511_dump_regs(struct usb_device *dev)
+ov511_dump_regs(struct usb_ov511 *ov)
{
info("CAMERA INTERFACE REGS");
- ov511_dump_reg_range(dev, 0x10, 0x1f);
+ dump_reg_range(ov, 0x10, 0x1f);
info("DRAM INTERFACE REGS");
- ov511_dump_reg_range(dev, 0x20, 0x23);
+ dump_reg_range(ov, 0x20, 0x23);
info("ISO FIFO REGS");
- ov511_dump_reg_range(dev, 0x30, 0x31);
+ dump_reg_range(ov, 0x30, 0x31);
info("PIO REGS");
- ov511_dump_reg_range(dev, 0x38, 0x39);
- ov511_dump_reg_range(dev, 0x3e, 0x3e);
+ dump_reg_range(ov, 0x38, 0x39);
+ dump_reg_range(ov, 0x3e, 0x3e);
info("I2C REGS");
- ov511_dump_reg_range(dev, 0x40, 0x49);
+ dump_reg_range(ov, 0x40, 0x49);
info("SYSTEM CONTROL REGS");
- ov511_dump_reg_range(dev, 0x50, 0x55);
- ov511_dump_reg_range(dev, 0x5e, 0x5f);
+ dump_reg_range(ov, 0x50, 0x55);
+ dump_reg_range(ov, 0x5e, 0x5f);
info("OmniCE REGS");
- ov511_dump_reg_range(dev, 0x70, 0x79);
+ dump_reg_range(ov, 0x70, 0x79);
/* NOTE: Quantization tables are not readable. You will get the value
* in reg. 0x79 for every table register */
- ov511_dump_reg_range(dev, 0x80, 0x9f);
- ov511_dump_reg_range(dev, 0xa0, 0xbf);
+ dump_reg_range(ov, 0x80, 0x9f);
+ dump_reg_range(ov, 0xa0, 0xbf);
}
#endif
@@ -1414,7 +1453,7 @@
/* For as-yet unimplemented I2C interface */
static void
-call_i2c_clients(struct usb_ov511 *ov511, unsigned int cmd,
+call_i2c_clients(struct usb_ov511 *ov, unsigned int cmd,
void *arg)
{
/* Do nothing */
@@ -1422,59 +1461,33 @@
/*****************************************************************************/
-static int
-ov511_reset(struct usb_ov511 *ov511, unsigned char reset_type)
-{
- int rc;
-
- /* Setting bit 0 not allowed on 518/518Plus */
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- reset_type &= 0xfe;
-
- PDEBUG(4, "Reset: type=0x%X", reset_type);
-
- rc = ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_RESET, reset_type);
- rc = ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_RESET, 0);
-
- if (rc < 0)
- err("reset: command failed");
-
- return rc;
-}
-
/* Temporarily stops OV511 from functioning. Must do this before changing
* registers while the camera is streaming */
static inline int
-ov511_stop(struct usb_ov511 *ov511)
+ov51x_stop(struct usb_ov511 *ov)
{
PDEBUG(4, "stopping");
- ov511->stopped = 1;
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- return (ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_RESET,
- 0x3a));
+ ov->stopped = 1;
+ if (ov->bclass == BCL_OV518)
+ return (reg_w(ov, R51x_SYS_RESET, 0x3a));
else
- return (ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_RESET,
- 0x3d));
+ return (reg_w(ov, R51x_SYS_RESET, 0x3d));
}
/* Restarts OV511 after ov511_stop() is called. Has no effect if it is not
* actually stopped (for performance). */
static inline int
-ov511_restart(struct usb_ov511 *ov511)
+ov51x_restart(struct usb_ov511 *ov)
{
- if (ov511->stopped) {
+ if (ov->stopped) {
PDEBUG(4, "restarting");
- ov511->stopped = 0;
+ ov->stopped = 0;
/* Reinitialize the stream */
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- ov511_reg_write(ov511->dev, 0x2f, 0x80);
+ if (ov->bclass == BCL_OV518)
+ reg_w(ov, 0x2f, 0x80);
- return (ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_RESET,
- 0x00));
+ return (reg_w(ov, R51x_SYS_RESET, 0x00));
}
return 0;
@@ -1482,14 +1495,13 @@
/* Resets the hardware snapshot button */
static void
-ov51x_clear_snapshot(struct usb_ov511 *ov511)
+ov51x_clear_snapshot(struct usb_ov511 *ov)
{
- if (ov511->bridge == BRG_OV511 || ov511->bridge == BRG_OV511PLUS) {
- ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_SNAPSHOT, 0x01);
- ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_SNAPSHOT, 0x03);
- ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_SNAPSHOT, 0x01);
- } else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
+ if (ov->bclass == BCL_OV511) {
+ reg_w(ov, R51x_SYS_SNAP, 0x01);
+ reg_w(ov, R51x_SYS_SNAP, 0x03);
+ reg_w(ov, R51x_SYS_SNAP, 0x01);
+ } else if (ov->bclass == BCL_OV518) {
warn("snapshot reset not supported yet on OV518(+)");
} else {
err("clear snap: invalid bridge type");
@@ -1500,19 +1512,18 @@
/* 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
-ov51x_check_snapshot(struct usb_ov511 *ov511)
+ov51x_check_snapshot(struct usb_ov511 *ov)
{
int ret, status = 0;
- if (ov511->bridge == BRG_OV511 || ov511->bridge == BRG_OV511PLUS) {
- ret = ov511_reg_read(ov511->dev, OV511_REG_SYSTEM_SNAPSHOT);
+ if (ov->bclass == BCL_OV511) {
+ ret = reg_r(ov, R51x_SYS_SNAP);
if (ret < 0) {
err("Error checking snspshot status (%d)", ret);
} else if (ret & 0x08) {
status = 1;
}
- } else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
+ } else if (ov->bclass == BCL_OV518) {
warn("snapshot check not supported yet on OV518(+)");
} else {
err("check snap: invalid bridge type");
@@ -1521,53 +1532,33 @@
return status;
}
-/* Sets I2C read and write slave IDs. Returns <0 for error */
-static int
-ov51x_set_slave_ids(struct usb_ov511 *ov511,
- unsigned char write_id,
- unsigned char read_id)
-{
- struct usb_device *dev = ov511->dev;
-
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, write_id) < 0)
- return -EIO;
-
- if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, read_id) < 0)
- return -EIO;
-
- if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0)
- return -EIO;
-
- return 0;
-}
-
/* This does an initial reset of an OmniVision sensor and ensures that I2C
* is synchronized. Returns <0 for failure.
*/
static int
-ov51x_init_ov_sensor(struct usb_ov511 *ov511)
+init_ov_sensor(struct usb_ov511 *ov)
{
int i, success;
/* Reset the sensor */
- if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -EIO;
+ if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
/* Wait for it to initialize */
schedule_timeout (1 + 150 * HZ / 1000);
for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) {
- if ((ov51x_i2c_read(ov511, OV7610_REG_ID_HIGH) == 0x7F) &&
- (ov51x_i2c_read(ov511, OV7610_REG_ID_LOW) == 0xA2)) {
+ if ((i2c_r(ov, OV7610_REG_ID_HIGH) == 0x7F) &&
+ (i2c_r(ov, OV7610_REG_ID_LOW) == 0xA2)) {
success = 1;
continue;
}
/* Reset the sensor */
- if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -EIO;
+ if (i2c_w(ov, 0x12, 0x80) < 0) return -EIO;
/* Wait for it to initialize */
schedule_timeout(1 + 150 * HZ / 1000);
/* Dummy read to sync I2C */
- if (ov51x_i2c_read(ov511, 0x00) < 0) return -EIO;
+ if (i2c_r(ov, 0x00) < 0) return -EIO;
}
if (!success)
@@ -1579,16 +1570,16 @@
}
static int
-ov511_set_packet_size(struct usb_ov511 *ov511, int size)
+ov51x_set_packet_size(struct usb_ov511 *ov, int size)
{
int alt, mult;
- if (ov511_stop(ov511) < 0)
+ if (ov51x_stop(ov) < 0)
return -EIO;
mult = size >> 5;
- if (ov511->bridge == BRG_OV511) {
+ if (ov->bridge == BRG_OV511) {
if (size == 0) alt = OV511_ALT_SIZE_0;
else if (size == 257) alt = OV511_ALT_SIZE_257;
else if (size == 513) alt = OV511_ALT_SIZE_513;
@@ -1598,7 +1589,7 @@
err("Set packet size: invalid size (%d)", size);
return -EINVAL;
}
- } else if (ov511->bridge == BRG_OV511PLUS) {
+ } else if (ov->bridge == BRG_OV511PLUS) {
if (size == 0) alt = OV511PLUS_ALT_SIZE_0;
else if (size == 33) alt = OV511PLUS_ALT_SIZE_33;
else if (size == 129) alt = OV511PLUS_ALT_SIZE_129;
@@ -1611,8 +1602,7 @@
err("Set packet size: invalid size (%d)", size);
return -EINVAL;
}
- } else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
+ } else if (ov->bclass == BCL_OV518) {
if (size == 0) alt = OV518_ALT_SIZE_0;
else if (size == 128) alt = OV518_ALT_SIZE_128;
else if (size == 256) alt = OV518_ALT_SIZE_256;
@@ -1633,32 +1623,30 @@
PDEBUG(3, "set packet size: %d, mult=%d, alt=%d", size, mult, alt);
// FIXME: Don't know how to do this on OV518 yet
- if (ov511->bridge != BRG_OV518 &&
- ov511->bridge != BRG_OV518PLUS) {
- if (ov511_reg_write(ov511->dev, OV511_REG_FIFO_PACKET_SIZE,
+ if (ov->bclass == BCL_OV511) {
+ if (reg_w(ov, R51x_FIFO_PSIZE,
mult) < 0) {
return -EIO;
}
}
- if (usb_set_interface(ov511->dev, ov511->iface, alt) < 0) {
+ if (usb_set_interface(ov->dev, ov->iface, alt) < 0) {
err("Set packet size: set interface error");
return -EBUSY;
}
/* Initialize the stream */
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- if (ov511_reg_write(ov511->dev, 0x2f, 0x80) < 0)
+ if (ov->bclass == BCL_OV518)
+ if (reg_w(ov, 0x2f, 0x80) < 0)
return -EIO;
// FIXME - Should we only reset the FIFO?
- if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0)
+ if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
return -EIO;
- ov511->packet_size = size;
+ ov->packet_size = size;
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return 0;
@@ -1666,51 +1654,49 @@
/* Upload compression params and quantization tables. Returns 0 for success. */
static int
-ov511_init_compression(struct usb_ov511 *ov511)
+ov511_init_compression(struct usb_ov511 *ov)
{
- struct usb_device *dev = ov511->dev;
int rc = 0;
- if (!ov511->compress_inited) {
+ if (!ov->compress_inited) {
- ov511_reg_write(dev, 0x70, phy);
- ov511_reg_write(dev, 0x71, phuv);
- ov511_reg_write(dev, 0x72, pvy);
- ov511_reg_write(dev, 0x73, pvuv);
- ov511_reg_write(dev, 0x74, qhy);
- ov511_reg_write(dev, 0x75, qhuv);
- ov511_reg_write(dev, 0x76, qvy);
- ov511_reg_write(dev, 0x77, qvuv);
+ reg_w(ov, 0x70, phy);
+ reg_w(ov, 0x71, phuv);
+ reg_w(ov, 0x72, pvy);
+ reg_w(ov, 0x73, pvuv);
+ reg_w(ov, 0x74, qhy);
+ reg_w(ov, 0x75, qhuv);
+ reg_w(ov, 0x76, qvy);
+ reg_w(ov, 0x77, qvuv);
- if (ov511_upload_quan_tables(dev) < 0) {
+ if (ov511_upload_quan_tables(ov) < 0) {
err("Error uploading quantization tables");
rc = -EIO;
goto out;
}
}
- ov511->compress_inited = 1;
+ ov->compress_inited = 1;
out:
return rc;
}
/* Upload compression params and quantization tables. Returns 0 for success. */
static int
-ov518_init_compression(struct usb_ov511 *ov511)
+ov518_init_compression(struct usb_ov511 *ov)
{
- struct usb_device *dev = ov511->dev;
int rc = 0;
- if (!ov511->compress_inited) {
+ if (!ov->compress_inited) {
- if (ov518_upload_quan_tables(dev) < 0) {
+ if (ov518_upload_quan_tables(ov) < 0) {
err("Error uploading quantization tables");
rc = -EIO;
goto out;
}
}
- ov511->compress_inited = 1;
+ ov->compress_inited = 1;
out:
return rc;
}
@@ -1719,22 +1705,22 @@
/* Sets sensor's contrast setting to "val" */
static int
-sensor_set_contrast(struct usb_ov511 *ov511, unsigned short val)
+sensor_set_contrast(struct usb_ov511 *ov, unsigned short val)
{
int rc;
PDEBUG(3, "%d", val);
- if (ov511->stop_during_set)
- if (ov511_stop(ov511) < 0)
+ if (ov->stop_during_set)
+ if (ov51x_stop(ov) < 0)
return -EIO;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV6620:
case SEN_OV6630:
{
- rc = ov51x_i2c_write(ov511, OV7610_REG_CNT, val >> 8);
+ rc = i2c_w(ov, OV7610_REG_CNT, val >> 8);
if (rc < 0)
goto out;
break;
@@ -1747,14 +1733,14 @@
};
/* Use Y gamma control instead. Bit 0 enables it. */
- rc = ov51x_i2c_write(ov511, 0x64, ctab[val>>12]);
+ rc = i2c_w(ov, 0x64, ctab[val>>12]);
if (rc < 0)
goto out;
break;
}
case SEN_SAA7111A:
{
- rc = ov51x_i2c_write(ov511, 0x0b, val >> 9);
+ rc = i2c_w(ov, 0x0b, val >> 9);
if (rc < 0)
goto out;
break;
@@ -1768,9 +1754,9 @@
}
rc = 0; /* Success */
- ov511->contrast = val;
+ ov->contrast = val;
out:
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return rc;
@@ -1778,15 +1764,15 @@
/* Gets sensor's contrast setting */
static int
-sensor_get_contrast(struct usb_ov511 *ov511, unsigned short *val)
+sensor_get_contrast(struct usb_ov511 *ov, unsigned short *val)
{
int rc;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_read(ov511, OV7610_REG_CNT);
+ rc = i2c_r(ov, OV7610_REG_CNT);
if (rc < 0)
return rc;
else
@@ -1794,14 +1780,14 @@
break;
case SEN_OV7620:
/* Use Y gamma reg instead. Bit 0 is the enable bit. */
- rc = ov51x_i2c_read(ov511, 0x64);
+ rc = i2c_r(ov, 0x64);
if (rc < 0)
return rc;
else
*val = (rc & 0xfe) << 8;
break;
case SEN_SAA7111A:
- *val = ov511->contrast;
+ *val = ov->contrast;
break;
default:
PDEBUG(3, "Unsupported with this sensor");
@@ -1809,7 +1795,7 @@
}
PDEBUG(3, "%d", *val);
- ov511->contrast = *val;
+ ov->contrast = *val;
return 0;
}
@@ -1818,35 +1804,35 @@
/* Sets sensor's brightness setting to "val" */
static int
-sensor_set_brightness(struct usb_ov511 *ov511, unsigned short val)
+sensor_set_brightness(struct usb_ov511 *ov, unsigned short val)
{
int rc;
PDEBUG(4, "%d", val);
- if (ov511->stop_during_set)
- if (ov511_stop(ov511) < 0)
+ if (ov->stop_during_set)
+ if (ov51x_stop(ov) < 0)
return -EIO;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV7620AE:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_write(ov511, OV7610_REG_BRT, val >> 8);
+ rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);
if (rc < 0)
goto out;
break;
case SEN_OV7620:
/* 7620 doesn't like manual changes when in auto mode */
- if (!ov511->auto_brt) {
- rc = ov51x_i2c_write(ov511, OV7610_REG_BRT, val >> 8);
+ if (!ov->auto_brt) {
+ rc = i2c_w(ov, OV7610_REG_BRT, val >> 8);
if (rc < 0)
goto out;
}
break;
case SEN_SAA7111A:
- rc = ov51x_i2c_write(ov511, 0x0a, val >> 8);
+ rc = i2c_w(ov, 0x0a, val >> 8);
if (rc < 0)
goto out;
break;
@@ -1857,9 +1843,9 @@
}
rc = 0; /* Success */
- ov511->brightness = val;
+ ov->brightness = val;
out:
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return rc;
@@ -1867,24 +1853,24 @@
/* Gets sensor's brightness setting */
static int
-sensor_get_brightness(struct usb_ov511 *ov511, unsigned short *val)
+sensor_get_brightness(struct usb_ov511 *ov, unsigned short *val)
{
int rc;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV7620AE:
case SEN_OV7620:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_read(ov511, OV7610_REG_BRT);
+ rc = i2c_r(ov, OV7610_REG_BRT);
if (rc < 0)
return rc;
else
*val = rc << 8;
break;
case SEN_SAA7111A:
- *val = ov511->brightness;
+ *val = ov->brightness;
break;
default:
PDEBUG(3, "Unsupported with this sensor");
@@ -1892,7 +1878,7 @@
}
PDEBUG(3, "%d", *val);
- ov511->brightness = *val;
+ ov->brightness = *val;
return 0;
}
@@ -1901,36 +1887,36 @@
/* Sets sensor's saturation (color intensity) setting to "val" */
static int
-sensor_set_saturation(struct usb_ov511 *ov511, unsigned short val)
+sensor_set_saturation(struct usb_ov511 *ov, unsigned short val)
{
int rc;
PDEBUG(3, "%d", val);
- if (ov511->stop_during_set)
- if (ov511_stop(ov511) < 0)
+ if (ov->stop_during_set)
+ if (ov51x_stop(ov) < 0)
return -EIO;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV7620AE:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_write(ov511, OV7610_REG_SAT, val >> 8);
+ rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);
if (rc < 0)
goto out;
break;
case SEN_OV7620:
// /* Use UV gamma control instead. Bits 0 & 7 are reserved. */
-// rc = ov511_i2c_write(ov511->dev, 0x62, (val >> 9) & 0x7e);
+// rc = ov_i2c_write(ov->dev, 0x62, (val >> 9) & 0x7e);
// if (rc < 0)
// goto out;
- rc = ov51x_i2c_write(ov511, OV7610_REG_SAT, val >> 8);
+ rc = i2c_w(ov, OV7610_REG_SAT, val >> 8);
if (rc < 0)
goto out;
break;
case SEN_SAA7111A:
- rc = ov51x_i2c_write(ov511, 0x0c, val >> 9);
+ rc = i2c_w(ov, 0x0c, val >> 9);
if (rc < 0)
goto out;
break;
@@ -1941,9 +1927,9 @@
}
rc = 0; /* Success */
- ov511->colour = val;
+ ov->colour = val;
out:
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return rc;
@@ -1951,16 +1937,16 @@
/* Gets sensor's saturation (color intensity) setting */
static int
-sensor_get_saturation(struct usb_ov511 *ov511, unsigned short *val)
+sensor_get_saturation(struct usb_ov511 *ov, unsigned short *val)
{
int rc;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV7620AE:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_read(ov511, OV7610_REG_SAT);
+ rc = i2c_r(ov, OV7610_REG_SAT);
if (rc < 0)
return rc;
else
@@ -1968,19 +1954,19 @@
break;
case SEN_OV7620:
// /* Use UV gamma reg instead. Bits 0 & 7 are reserved. */
-// rc = ov51x_i2c_read(ov511, 0x62);
+// rc = i2c_r(ov, 0x62);
// if (rc < 0)
// return rc;
// else
// *val = (rc & 0x7e) << 9;
- rc = ov51x_i2c_read(ov511, OV7610_REG_SAT);
+ rc = i2c_r(ov, OV7610_REG_SAT);
if (rc < 0)
return rc;
else
*val = rc << 8;
break;
case SEN_SAA7111A:
- *val = ov511->colour;
+ *val = ov->colour;
break;
default:
PDEBUG(3, "Unsupported with this sensor");
@@ -1988,7 +1974,7 @@
}
PDEBUG(3, "%d", *val);
- ov511->colour = *val;
+ ov->colour = *val;
return 0;
}
@@ -1997,44 +1983,42 @@
/* Sets sensor's hue (red/blue balance) setting to "val" */
static int
-sensor_set_hue(struct usb_ov511 *ov511, unsigned short val)
+sensor_set_hue(struct usb_ov511 *ov, unsigned short val)
{
int rc;
PDEBUG(3, "%d", val);
- if (ov511->stop_during_set)
- if (ov511_stop(ov511) < 0)
+ if (ov->stop_during_set)
+ if (ov51x_stop(ov) < 0)
return -EIO;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_write(ov511, OV7610_REG_RED, 0xFF - (val >> 8));
+ rc = i2c_w(ov, OV7610_REG_RED, 0xFF - (val >> 8));
if (rc < 0)
goto out;
- rc = ov51x_i2c_write(ov511, OV7610_REG_BLUE, val >> 8);
+ rc = i2c_w(ov, OV7610_REG_BLUE, val >> 8);
if (rc < 0)
goto out;
break;
case SEN_OV7620:
// Hue control is causing problems. I will enable it once it's fixed.
#if 0
- rc = ov51x_i2c_write(ov511, 0x7a,
- (unsigned char)(val >> 8) + 0xb);
+ rc = i2c_w(ov, 0x7a, (unsigned char)(val >> 8) + 0xb);
if (rc < 0)
goto out;
- rc = ov51x_i2c_write(ov511, 0x79,
- (unsigned char)(val >> 8) + 0xb);
+ rc = i2c_w(ov, 0x79, (unsigned char)(val >> 8) + 0xb);
if (rc < 0)
goto out;
#endif
break;
case SEN_SAA7111A:
- rc = ov51x_i2c_write(ov511, 0x0d, (val + 32768) >> 8);
+ rc = i2c_w(ov, 0x0d, (val + 32768) >> 8);
if (rc < 0)
goto out;
break;
@@ -2045,9 +2029,9 @@
}
rc = 0; /* Success */
- ov511->hue = val;
+ ov->hue = val;
out:
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return rc;
@@ -2055,29 +2039,29 @@
/* Gets sensor's hue (red/blue balance) setting */
static int
-sensor_get_hue(struct usb_ov511 *ov511, unsigned short *val)
+sensor_get_hue(struct usb_ov511 *ov, unsigned short *val)
{
int rc;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV6620:
case SEN_OV6630:
- rc = ov51x_i2c_read(ov511, OV7610_REG_BLUE);
+ rc = i2c_r(ov, OV7610_REG_BLUE);
if (rc < 0)
return rc;
else
*val = rc << 8;
break;
case SEN_OV7620:
- rc = ov51x_i2c_read(ov511, 0x7a);
+ rc = i2c_r(ov, 0x7a);
if (rc < 0)
return rc;
else
*val = rc << 8;
break;
case SEN_SAA7111A:
- *val = ov511->hue;
+ *val = ov->hue;
break;
default:
PDEBUG(3, "Unsupported with this sensor");
@@ -2085,7 +2069,7 @@
}
PDEBUG(3, "%d", *val);
- ov511->hue = *val;
+ ov->hue = *val;
return 0;
}
@@ -2093,30 +2077,30 @@
/* -------------------------------------------------------------------------- */
static inline int
-sensor_set_picture(struct usb_ov511 *ov511, struct video_picture *p)
+sensor_set_picture(struct usb_ov511 *ov, struct video_picture *p)
{
int rc;
PDEBUG(4, "sensor_set_picture");
- ov511->whiteness = p->whiteness;
+ ov->whiteness = p->whiteness;
/* Don't return error if a setting is unsupported, or rest of settings
* will not be performed */
- rc = sensor_set_contrast(ov511, p->contrast);
+ rc = sensor_set_contrast(ov, p->contrast);
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_set_brightness(ov511, p->brightness);
+ rc = sensor_set_brightness(ov, p->brightness);
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_set_saturation(ov511, p->colour);
+ rc = sensor_set_saturation(ov, p->colour);
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_set_hue(ov511, p->hue);
+ rc = sensor_set_hue(ov, p->hue);
if (FATAL_ERROR(rc))
return rc;
@@ -2124,7 +2108,7 @@
}
static inline int
-sensor_get_picture(struct usb_ov511 *ov511, struct video_picture *p)
+sensor_get_picture(struct usb_ov511 *ov, struct video_picture *p)
{
int rc;
@@ -2133,27 +2117,27 @@
/* Don't return error if a setting is unsupported, or rest of settings
* will not be performed */
- rc = sensor_get_contrast(ov511, &(p->contrast));
+ rc = sensor_get_contrast(ov, &(p->contrast));
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_get_brightness(ov511, &(p->brightness));
+ rc = sensor_get_brightness(ov, &(p->brightness));
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_get_saturation(ov511, &(p->colour));
+ rc = sensor_get_saturation(ov, &(p->colour));
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_get_hue(ov511, &(p->hue));
+ rc = sensor_get_hue(ov, &(p->hue));
if (FATAL_ERROR(rc))
return rc;
p->whiteness = 105 << 8;
/* Can we get these from frame[0]? -claudio? */
- p->depth = ov511->frame[0].depth;
- p->palette = ov511->frame[0].format;
+ p->depth = ov->frame[0].depth;
+ p->palette = ov->frame[0].format;
return 0;
}
@@ -2162,24 +2146,24 @@
/* Sets current exposure for sensor. This only has an effect if auto-exposure
* is off */
static inline int
-sensor_set_exposure(struct usb_ov511 *ov511, unsigned char val)
+sensor_set_exposure(struct usb_ov511 *ov, unsigned char val)
{
int rc;
PDEBUG(3, "%d", val);
- if (ov511->stop_during_set)
- if (ov511_stop(ov511) < 0)
+ if (ov->stop_during_set)
+ if (ov51x_stop(ov) < 0)
return -EIO;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV6620:
case SEN_OV6630:
case SEN_OV7610:
case SEN_OV7620:
case SEN_OV7620AE:
case SEN_OV8600:
- rc = ov51x_i2c_write(ov511, 0x10, val);
+ rc = i2c_w(ov, 0x10, val);
if (rc < 0)
goto out;
@@ -2195,9 +2179,9 @@
}
rc = 0; /* Success */
- ov511->exposure = val;
+ ov->exposure = val;
out:
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return rc;
@@ -2206,18 +2190,18 @@
/* Gets current exposure level from sensor, regardless of whether it is under
* manual control. */
static int
-sensor_get_exposure(struct usb_ov511 *ov511, unsigned char *val)
+sensor_get_exposure(struct usb_ov511 *ov, unsigned char *val)
{
int rc;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV6620:
case SEN_OV6630:
case SEN_OV7620:
case SEN_OV7620AE:
case SEN_OV8600:
- rc = ov51x_i2c_read(ov511, 0x10);
+ rc = i2c_r(ov, 0x10);
if (rc < 0)
return rc;
else
@@ -2235,24 +2219,22 @@
}
PDEBUG(3, "%d", *val);
- ov511->exposure = *val;
+ ov->exposure = *val;
return 0;
}
/* Turns on or off the LED. Only has an effect with OV511+/OV518(+) */
static inline void
-ov51x_led_control(struct usb_ov511 *ov511, int enable)
+ov51x_led_control(struct usb_ov511 *ov, int enable)
{
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
- if (ov511->bridge == BRG_OV511PLUS)
- ov511_reg_write(ov511->dev, OV511_REG_SYSTEM_LED_CTL,
- enable ? 1 : 0);
- else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- ov511_reg_write_mask(ov511->dev, OV518_REG_GPIO_OUT,
- enable ? 0x02 : 0x00, 0x02);
+ if (ov->bridge == BRG_OV511PLUS)
+ reg_w(ov, R511_SYS_LED_CTL, enable ? 1 : 0);
+ else if (ov->bclass == BCL_OV518)
+ reg_w_mask(ov, R518_GPIO_OUT, enable ? 0x02 : 0x00, 0x02);
+
return;
}
@@ -2266,7 +2248,7 @@
* Returns: 0 for success
*/
static int
-sensor_set_light_freq(struct usb_ov511 *ov511, int freq)
+sensor_set_light_freq(struct usb_ov511 *ov, int freq)
{
int sixty;
@@ -2281,24 +2263,24 @@
return -EINVAL;
}
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
- ov51x_i2c_write_mask(ov511, 0x2a, sixty?0x00:0x80, 0x80);
- ov51x_i2c_write(ov511, 0x2b, sixty?0x00:0xac);
- ov51x_i2c_write_mask(ov511, 0x13, 0x10, 0x10);
- ov51x_i2c_write_mask(ov511, 0x13, 0x00, 0x10);
+ i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
+ i2c_w(ov, 0x2b, sixty?0x00:0xac);
+ i2c_w_mask(ov, 0x13, 0x10, 0x10);
+ i2c_w_mask(ov, 0x13, 0x00, 0x10);
break;
case SEN_OV7620:
case SEN_OV7620AE:
case SEN_OV8600:
- ov51x_i2c_write_mask(ov511, 0x2a, sixty?0x00:0x80, 0x80);
- ov51x_i2c_write(ov511, 0x2b, sixty?0x00:0xac);
- ov51x_i2c_write_mask(ov511, 0x76, 0x01, 0x01);
+ i2c_w_mask(ov, 0x2a, sixty?0x00:0x80, 0x80);
+ i2c_w(ov, 0x2b, sixty?0x00:0xac);
+ i2c_w_mask(ov, 0x76, 0x01, 0x01);
break;
case SEN_OV6620:
case SEN_OV6630:
- ov51x_i2c_write(ov511, 0x2b, sixty?0xa8:0x28);
- ov51x_i2c_write(ov511, 0x2a, sixty?0x84:0xa4);
+ i2c_w(ov, 0x2b, sixty?0xa8:0x28);
+ i2c_w(ov, 0x2a, sixty?0x84:0xa4);
break;
case SEN_KS0127:
case SEN_KS0127B:
@@ -2310,7 +2292,7 @@
return -EINVAL;
}
- ov511->lightfreq = freq;
+ ov->lightfreq = freq;
return 0;
}
@@ -2325,23 +2307,23 @@
* Returns: 0 for success
*/
static inline int
-sensor_set_banding_filter(struct usb_ov511 *ov511, int enable)
+sensor_set_banding_filter(struct usb_ov511 *ov, int enable)
{
int rc;
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
- if (ov511->sensor == SEN_KS0127 || ov511->sensor == SEN_KS0127B
- || ov511->sensor == SEN_SAA7111A) {
+ if (ov->sensor == SEN_KS0127 || ov->sensor == SEN_KS0127B
+ || ov->sensor == SEN_SAA7111A) {
PDEBUG(5, "Unsupported with this sensor");
return -EPERM;
}
- rc = ov51x_i2c_write_mask(ov511, 0x2d, enable?0x04:0x00, 0x04);
+ rc = i2c_w_mask(ov, 0x2d, enable?0x04:0x00, 0x04);
if (rc < 0)
return rc;
- ov511->bandfilt = enable;
+ ov->bandfilt = enable;
return 0;
}
@@ -2353,23 +2335,23 @@
* Returns: 0 for success
*/
static inline int
-sensor_set_auto_brightness(struct usb_ov511 *ov511, int enable)
+sensor_set_auto_brightness(struct usb_ov511 *ov, int enable)
{
int rc;
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
- if (ov511->sensor == SEN_KS0127 || ov511->sensor == SEN_KS0127B
- || ov511->sensor == SEN_SAA7111A) {
+ if (ov->sensor == SEN_KS0127 || ov->sensor == SEN_KS0127B
+ || ov->sensor == SEN_SAA7111A) {
PDEBUG(5, "Unsupported with this sensor");
return -EPERM;
}
- rc = ov51x_i2c_write_mask(ov511, 0x2d, enable?0x10:0x00, 0x10);
+ rc = i2c_w_mask(ov, 0x2d, enable?0x10:0x00, 0x10);
if (rc < 0)
return rc;
- ov511->auto_brt = enable;
+ ov->auto_brt = enable;
return 0;
}
@@ -2381,22 +2363,22 @@
* Returns: 0 for success
*/
static inline int
-sensor_set_auto_exposure(struct usb_ov511 *ov511, int enable)
+sensor_set_auto_exposure(struct usb_ov511 *ov, int enable)
{
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
- ov51x_i2c_write_mask(ov511, 0x29, enable?0x00:0x80, 0x80);
+ i2c_w_mask(ov, 0x29, enable?0x00:0x80, 0x80);
break;
case SEN_OV6620:
case SEN_OV7620:
case SEN_OV7620AE:
case SEN_OV8600:
- ov51x_i2c_write_mask(ov511, 0x13, enable?0x01:0x00, 0x01);
+ i2c_w_mask(ov, 0x13, enable?0x01:0x00, 0x01);
break;
case SEN_OV6630:
- ov51x_i2c_write_mask(ov511, 0x28, enable?0x00:0x10, 0x10);
+ i2c_w_mask(ov, 0x28, enable?0x00:0x10, 0x10);
break;
case SEN_KS0127:
case SEN_KS0127B:
@@ -2408,7 +2390,7 @@
return -EINVAL;
}
- ov511->auto_exp = enable;
+ ov->auto_exp = enable;
return 0;
}
@@ -2421,27 +2403,27 @@
* Returns: 0 for success
*/
static int
-sensor_set_backlight(struct usb_ov511 *ov511, int enable)
+sensor_set_backlight(struct usb_ov511 *ov, int enable)
{
PDEBUG(4, " (%s)", enable ? "turn on" : "turn off");
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7620:
case SEN_OV8600:
- ov51x_i2c_write_mask(ov511, 0x68, enable?0xe0:0xc0, 0xe0);
- ov51x_i2c_write_mask(ov511, 0x29, enable?0x08:0x00, 0x08);
- ov51x_i2c_write_mask(ov511, 0x28, enable?0x02:0x00, 0x02);
+ 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;
case SEN_OV6620:
- ov51x_i2c_write_mask(ov511, 0x4e, enable?0xe0:0xc0, 0xe0);
- ov51x_i2c_write_mask(ov511, 0x29, enable?0x08:0x00, 0x08);
- ov51x_i2c_write_mask(ov511, 0x0e, enable?0x80:0x00, 0x80);
+ i2c_w_mask(ov, 0x4e, enable?0xe0:0xc0, 0xe0);
+ i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
+ i2c_w_mask(ov, 0x0e, enable?0x80:0x00, 0x80);
break;
case SEN_OV6630:
- ov51x_i2c_write_mask(ov511, 0x4e, enable?0x80:0x60, 0xe0);
- ov51x_i2c_write_mask(ov511, 0x29, enable?0x08:0x00, 0x08);
- ov51x_i2c_write_mask(ov511, 0x28, enable?0x02:0x00, 0x02);
+ i2c_w_mask(ov, 0x4e, enable?0x80:0x60, 0xe0);
+ i2c_w_mask(ov, 0x29, enable?0x08:0x00, 0x08);
+ i2c_w_mask(ov, 0x28, enable?0x02:0x00, 0x02);
break;
case SEN_OV7610:
case SEN_OV7620AE:
@@ -2455,7 +2437,7 @@
return -EINVAL;
}
- ov511->backlight = enable;
+ ov->backlight = enable;
return 0;
}
@@ -2464,7 +2446,7 @@
* planar or not), or zero for unsupported format.
*/
static inline int
-ov511_get_depth(int palette)
+get_depth(int palette)
{
switch (palette) {
case VIDEO_PALETTE_GREY: return 8;
@@ -2487,55 +2469,55 @@
return 0;
else
return ((frame->width * frame->height
- * ov511_get_depth(frame->format)) >> 3);
+ * get_depth(frame->format)) >> 3);
}
static int
-mode_init_ov_sensor_regs(struct usb_ov511 *ov511, int width, int height,
+mode_init_ov_sensor_regs(struct usb_ov511 *ov, int width, int height,
int mode, int sub_flag, int qvga)
{
int clock;
/******** Mode (VGA/QVGA) and sensor specific regs ********/
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
- ov51x_i2c_write(ov511, 0x14, qvga?0x24:0x04);
+ i2c_w(ov, 0x14, qvga?0x24:0x04);
// FIXME: Does this improve the image quality or frame rate?
#if 0
- ov51x_i2c_write_mask(ov511, 0x28, qvga?0x00:0x20, 0x20);
- ov51x_i2c_write(ov511, 0x24, 0x10);
- ov51x_i2c_write(ov511, 0x25, qvga?0x40:0x8a);
- ov51x_i2c_write(ov511, 0x2f, qvga?0x30:0xb0);
- ov51x_i2c_write(ov511, 0x35, qvga?0x1c:0x9c);
+ i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
+ i2c_w(ov, 0x24, 0x10);
+ i2c_w(ov, 0x25, qvga?0x40:0x8a);
+ i2c_w(ov, 0x2f, qvga?0x30:0xb0);
+ i2c_w(ov, 0x35, qvga?0x1c:0x9c);
#endif
break;
case SEN_OV7620:
-// ov51x_i2c_write(ov511, 0x2b, 0x00);
- ov51x_i2c_write(ov511, 0x14, qvga?0xa4:0x84);
- ov51x_i2c_write_mask(ov511, 0x28, qvga?0x00:0x20, 0x20);
- ov51x_i2c_write(ov511, 0x24, qvga?0x20:0x3a);
- ov51x_i2c_write(ov511, 0x25, qvga?0x30:0x60);
- ov51x_i2c_write_mask(ov511, 0x2d, qvga?0x40:0x00, 0x40);
- ov51x_i2c_write_mask(ov511, 0x67, qvga?0xf0:0x90, 0xf0);
- ov51x_i2c_write_mask(ov511, 0x74, qvga?0x20:0x00, 0x20);
+// i2c_w(ov, 0x2b, 0x00);
+ i2c_w(ov, 0x14, qvga?0xa4:0x84);
+ i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
+ i2c_w(ov, 0x24, qvga?0x20:0x3a);
+ i2c_w(ov, 0x25, qvga?0x30:0x60);
+ i2c_w_mask(ov, 0x2d, qvga?0x40:0x00, 0x40);
+ i2c_w_mask(ov, 0x67, qvga?0xf0:0x90, 0xf0);
+ i2c_w_mask(ov, 0x74, qvga?0x20:0x00, 0x20);
break;
case SEN_OV7620AE:
-// ov51x_i2c_write(ov511, 0x2b, 0x00);
- ov51x_i2c_write(ov511, 0x14, qvga?0xa4:0x84);
+// i2c_w(ov, 0x2b, 0x00);
+ i2c_w(ov, 0x14, qvga?0xa4:0x84);
// FIXME: Enable this once 7620AE uses 7620 initial settings
#if 0
- ov51x_i2c_write_mask(ov511, 0x28, qvga?0x00:0x20, 0x20);
- ov51x_i2c_write(ov511, 0x24, qvga?0x20:0x3a);
- ov51x_i2c_write(ov511, 0x25, qvga?0x30:0x60);
- ov51x_i2c_write_mask(ov511, 0x2d, qvga?0x40:0x00, 0x40);
- ov51x_i2c_write_mask(ov511, 0x67, qvga?0xb0:0x90, 0xf0);
- ov51x_i2c_write_mask(ov511, 0x74, qvga?0x20:0x00, 0x20);
+ i2c_w_mask(ov, 0x28, qvga?0x00:0x20, 0x20);
+ i2c_w(ov, 0x24, qvga?0x20:0x3a);
+ i2c_w(ov, 0x25, qvga?0x30:0x60);
+ i2c_w_mask(ov, 0x2d, qvga?0x40:0x00, 0x40);
+ i2c_w_mask(ov, 0x67, qvga?0xb0:0x90, 0xf0);
+ i2c_w_mask(ov, 0x74, qvga?0x20:0x00, 0x20);
#endif
break;
case SEN_OV6620:
case SEN_OV6630:
- ov51x_i2c_write(ov511, 0x14, qvga?0x24:0x04);
+ i2c_w(ov, 0x14, qvga?0x24:0x04);
/* No special settings yet */
break;
default:
@@ -2546,19 +2528,17 @@
/******** Palette-specific regs ********/
if (mode == VIDEO_PALETTE_GREY) {
- if (ov511->sensor == SEN_OV7610
- || ov511->sensor == SEN_OV7620AE) {
+ if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV7620AE) {
/* these aren't valid on the OV6620/OV7620/6630? */
- ov51x_i2c_write_mask(ov511, 0x0e, 0x40, 0x40);
+ i2c_w_mask(ov, 0x0e, 0x40, 0x40);
}
- ov51x_i2c_write_mask(ov511, 0x13, 0x20, 0x20);
+ i2c_w_mask(ov, 0x13, 0x20, 0x20);
} else {
- if (ov511->sensor == SEN_OV7610
- || ov511->sensor == SEN_OV7620AE) {
+ if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV7620AE) {
/* not valid on the OV6620/OV7620/6630? */
- ov51x_i2c_write_mask(ov511, 0x0e, 0x00, 0x40);
+ i2c_w_mask(ov, 0x0e, 0x00, 0x40);
}
- ov51x_i2c_write_mask(ov511, 0x13, 0x00, 0x20);
+ i2c_w_mask(ov, 0x13, 0x00, 0x20);
}
/******** Clock programming ********/
@@ -2567,13 +2547,13 @@
/* The OV6620 needs special handling. This prevents the
* severe banding that normally occurs */
- if (ov511->sensor == SEN_OV6620 || ov511->sensor == SEN_OV6630)
+ if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630)
{
/* Clock down */
- ov51x_i2c_write(ov511, 0x2a, 0x04);
+ i2c_w(ov, 0x2a, 0x04);
- if (ov511->compress) {
+ if (ov->compress) {
// clock = 0; /* This ensures the highest frame rate */
clock = 3;
} else if (clockdiv == -1) { /* If user didn't override it */
@@ -2584,21 +2564,21 @@
PDEBUG(4, "Setting clock divisor to %d", clock);
- ov51x_i2c_write(ov511, 0x11, clock);
+ i2c_w(ov, 0x11, clock);
- ov51x_i2c_write(ov511, 0x2a, 0x84);
+ i2c_w(ov, 0x2a, 0x84);
/* This next setting is critical. It seems to improve
* the gain or the contrast. The "reserved" bits seem
* to have some effect in this case. */
- ov51x_i2c_write(ov511, 0x2d, 0x85);
+ i2c_w(ov, 0x2d, 0x85);
}
else
{
- if (ov511->compress) {
+ if (ov->compress) {
clock = 1; /* This ensures the highest frame rate */
} else if (clockdiv == -1) { /* If user didn't override it */
/* Calculate and set the clock divisor */
- clock = ((sub_flag ? ov511->subw * ov511->subh
+ clock = ((sub_flag ? ov->subw * ov->subh
: width * height)
* (mode == VIDEO_PALETTE_GREY ? 2 : 3) / 2)
/ 66000;
@@ -2608,45 +2588,44 @@
PDEBUG(4, "Setting clock divisor to %d", clock);
- ov51x_i2c_write(ov511, 0x11, clock);
+ i2c_w(ov, 0x11, clock);
}
/******** Special Features ********/
if (framedrop >= 0)
- ov51x_i2c_write(ov511, 0x16, framedrop);
+ i2c_w(ov, 0x16, framedrop);
/* We only have code to convert GBR -> RGB24 */
if ((mode == VIDEO_PALETTE_RGB24) && sensor_gbr)
- ov51x_i2c_write_mask(ov511, 0x12, 0x08, 0x08);
+ i2c_w_mask(ov, 0x12, 0x08, 0x08);
else
- ov51x_i2c_write_mask(ov511, 0x12, 0x00, 0x08);
+ i2c_w_mask(ov, 0x12, 0x00, 0x08);
/* Test Pattern */
- ov51x_i2c_write_mask(ov511, 0x12, (testpat?0x02:0x00), 0x02);
+ i2c_w_mask(ov, 0x12, (testpat?0x02:0x00), 0x02);
/* Auto white balance */
// if (awb)
- ov51x_i2c_write_mask(ov511, 0x12, 0x04, 0x04);
+ i2c_w_mask(ov, 0x12, 0x04, 0x04);
// else
-// ov51x_i2c_write_mask(ov511, 0x12, 0x00, 0x04);
+// i2c_w_mask(ov, 0x12, 0x00, 0x04);
- // This will go away as soon as ov511_mode_init_sensor_regs()
+ // This will go away as soon as ov51x_mode_init_sensor_regs()
// is fully tested.
/* 7620/6620/6630? don't have register 0x35, so play it safe */
- if (ov511->sensor == SEN_OV7610 ||
- ov511->sensor == SEN_OV7620AE) {
+ if (ov->sensor == SEN_OV7610 || ov->sensor == SEN_OV7620AE) {
if (width == 640 && height == 480)
- ov51x_i2c_write(ov511, 0x35, 0x9e);
+ i2c_w(ov, 0x35, 0x9e);
else
- ov51x_i2c_write(ov511, 0x35, 0x1e);
+ i2c_w(ov, 0x35, 0x1e);
}
return 0;
}
static int
-set_ov_sensor_window(struct usb_ov511 *ov511, int width, int height, int mode,
+set_ov_sensor_window(struct usb_ov511 *ov, int width, int height, int mode,
int sub_flag)
{
int ret;
@@ -2655,7 +2634,7 @@
/* The different sensor ICs handle setting up of window differently.
* IF YOU SET IT WRONG, YOU WILL GET ALL ZERO ISOC DATA FROM OV51x!!! */
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV7620AE:
hwsbase = 0x38;
@@ -2679,9 +2658,9 @@
return -EINVAL;
}
- if (ov511->sensor == SEN_OV6620 || ov511->sensor == SEN_OV6630) {
+ if (ov->sensor == SEN_OV6620 || ov->sensor == SEN_OV6630) {
if (width > 176 && height > 144) { /* CIF */
- ret = mode_init_ov_sensor_regs(ov511, width, height,
+ ret = mode_init_ov_sensor_regs(ov, width, height,
mode, sub_flag, 0);
if (ret < 0)
return ret;
@@ -2693,7 +2672,7 @@
err("Illegal dimensions");
return -EINVAL;
} else { /* QCIF */
- ret = mode_init_ov_sensor_regs(ov511, width, height,
+ ret = mode_init_ov_sensor_regs(ov, width, height,
mode, sub_flag, 1);
if (ret < 0)
return ret;
@@ -2702,7 +2681,7 @@
}
} else {
if (width > 320 && height > 240) { /* VGA */
- ret = mode_init_ov_sensor_regs(ov511, width, height,
+ ret = mode_init_ov_sensor_regs(ov, width, height,
mode, sub_flag, 0);
if (ret < 0)
return ret;
@@ -2714,7 +2693,7 @@
err("Illegal dimensions");
return -EINVAL;
} else { /* QVGA */
- ret = mode_init_ov_sensor_regs(ov511, width, height,
+ ret = mode_init_ov_sensor_regs(ov, width, height,
mode, sub_flag, 1);
if (ret < 0)
return ret;
@@ -2730,24 +2709,20 @@
/* FIXME! - This needs to be changed to support 160x120 and 6620!!! */
if (sub_flag) {
- ov51x_i2c_write(ov511, 0x17, hwsbase+(ov511->subx>>hwscale));
- ov51x_i2c_write(ov511, 0x18,
- hwebase+((ov511->subx+ov511->subw)>>hwscale));
- ov51x_i2c_write(ov511, 0x19, vwsbase+(ov511->suby>>vwscale));
- ov51x_i2c_write(ov511, 0x1a,
- vwebase+((ov511->suby+ov511->subh)>>vwscale));
+ i2c_w(ov, 0x17, hwsbase+(ov->subx>>hwscale));
+ i2c_w(ov, 0x18, hwebase+((ov->subx+ov->subw)>>hwscale));
+ i2c_w(ov, 0x19, vwsbase+(ov->suby>>vwscale));
+ i2c_w(ov, 0x1a, vwebase+((ov->suby+ov->subh)>>vwscale));
} else {
- ov51x_i2c_write(ov511, 0x17, hwsbase + hoffset);
- ov51x_i2c_write(ov511, 0x18,
- hwebase + hoffset + (hwsize>>hwscale));
- ov51x_i2c_write(ov511, 0x19, vwsbase + voffset);
- ov51x_i2c_write(ov511, 0x1a,
- vwebase + voffset + (vwsize>>vwscale));
+ i2c_w(ov, 0x17, hwsbase + hoffset);
+ i2c_w(ov, 0x18, hwebase + hoffset + (hwsize>>hwscale));
+ i2c_w(ov, 0x19, vwsbase + voffset);
+ i2c_w(ov, 0x1a, vwebase + voffset + (vwsize>>vwscale));
}
#ifdef OV511_DEBUG
if (dump_sensor)
- ov51x_dump_i2c_regs(ov511);
+ dump_i2c_regs(ov);
#endif
return 0;
@@ -2758,18 +2733,14 @@
* Do not put any sensor-specific code in here (including I2C I/O functions)
*/
static int
-ov511_mode_init_regs(struct usb_ov511 *ov511,
+ov511_mode_init_regs(struct usb_ov511 *ov,
int width, int height, int mode, int sub_flag)
{
int lncnt, pxcnt, rc = 0;
- struct usb_device *dev = ov511->dev;
-
- if (!ov511 || !dev)
- return -EFAULT;
if (sub_flag) {
- width = ov511->subw;
- height = ov511->subh;
+ width = ov->subw;
+ height = ov->subh;
}
PDEBUG(3, "width:%d, height:%d, mode:%d, sub:%d",
@@ -2777,7 +2748,7 @@
// FIXME: This should be moved to a 7111a-specific function once
// subcapture is dealt with properly
- if (ov511->sensor == SEN_SAA7111A) {
+ if (ov->sensor == SEN_SAA7111A) {
if (width == 320 && height == 240) {
/* No need to do anything special */
} else if (width == 640 && height == 480) {
@@ -2796,26 +2767,22 @@
return -EINVAL;
}
- if (width < ov511->minwidth || height < ov511->minheight) {
+ if (width < ov->minwidth || height < ov->minheight) {
err("Requested dimensions are too small");
return -EINVAL;
}
- if (ov511_stop(ov511) < 0)
+ if (ov51x_stop(ov) < 0)
return -EIO;
if (mode == VIDEO_PALETTE_GREY) {
- ov511_reg_write(dev, 0x16, 0x00);
-
- /* For snapshot */
- ov511_reg_write(dev, 0x1e, 0x00);
- ov511_reg_write(dev, 0x1f, 0x01);
+ reg_w(ov, R511_CAM_UV_EN, 0x00);
+ reg_w(ov, R511_SNAP_UV_EN, 0x00);
+ reg_w(ov, R511_SNAP_OPTS, 0x01);
} else {
- ov511_reg_write(dev, 0x16, 0x01);
-
- /* For snapshot */
- ov511_reg_write(dev, 0x1e, 0x01);
- ov511_reg_write(dev, 0x1f, 0x03);
+ reg_w(ov, R511_CAM_UV_EN, 0x01);
+ reg_w(ov, R511_SNAP_UV_EN, 0x01);
+ reg_w(ov, R511_SNAP_OPTS, 0x03);
}
/* Here I'm assuming that snapshot size == image size.
@@ -2824,25 +2791,28 @@
pxcnt = (width >> 3) - 1;
lncnt = (height >> 3) - 1;
- ov511_reg_write(dev, 0x12, pxcnt);
- ov511_reg_write(dev, 0x13, lncnt);
- ov511_reg_write(dev, 0x14, 0x00);
- ov511_reg_write(dev, 0x15, 0x00);
- ov511_reg_write(dev, 0x18, 0x03); /* YUV420, low pass filer on */
+ reg_w(ov, R511_CAM_PXCNT, pxcnt);
+ reg_w(ov, R511_CAM_LNCNT, lncnt);
+ reg_w(ov, R511_CAM_PXDIV, 0x00);
+ reg_w(ov, R511_CAM_LNDIV, 0x00);
+
+ /* YUV420, low pass filer on */
+ reg_w(ov, R511_CAM_OPTS, 0x03);
/* Snapshot additions */
- ov511_reg_write(dev, 0x1a, pxcnt);
- ov511_reg_write(dev, 0x1b, lncnt);
- ov511_reg_write(dev, 0x1c, 0x00);
- ov511_reg_write(dev, 0x1d, 0x00);
-
- if (ov511->compress) {
- ov511_reg_write(dev, 0x78, 0x07); // Turn on Y & UV compression
- ov511_reg_write(dev, 0x79, 0x03); // Enable LUTs
- ov511_reset(ov511, OV511_RESET_OMNICE);
+ reg_w(ov, R511_SNAP_PXCNT, pxcnt);
+ reg_w(ov, R511_SNAP_LNCNT, lncnt);
+ reg_w(ov, R511_SNAP_PXDIV, 0x00);
+ reg_w(ov, R511_SNAP_LNDIV, 0x00);
+
+ if (ov->compress) {
+ /* Enable Y and UV quantization and compression */
+ reg_w(ov, R511_COMP_EN, 0x07);
+ reg_w(ov, R511_COMP_LUT_EN, 0x03);
+ ov51x_reset(ov, OV511_RESET_OMNICE);
}
//out:
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
return rc;
@@ -2866,17 +2836,15 @@
* Do not put any sensor-specific code in here (including I2C I/O functions)
*/
static int
-ov518_mode_init_regs(struct usb_ov511 *ov511,
+ov518_mode_init_regs(struct usb_ov511 *ov,
int width, int height, int mode, int sub_flag)
{
int i;
- struct usb_device *dev = ov511->dev;
- unsigned char b[3]; /* Multiple-value reg buffer */
PDEBUG(3, "width:%d, height:%d, mode:%d, sub:%d",
width, height, mode, sub_flag);
- if (ov511_stop(ov511) < 0)
+ if (ov51x_stop(ov) < 0)
return -EIO;
for (i = 0; mlist518[i].width; i++) {
@@ -2894,113 +2862,94 @@
// pxcnt = sub_flag ? (ov511->subw >> 3) - 1 : mlist[i].pxcnt;
// lncnt = sub_flag ? (ov511->subh >> 3) - 1 : mlist[i].lncnt;
//
-// ov511_reg_write(dev, 0x12, pxcnt);
-// ov511_reg_write(dev, 0x13, lncnt);
+// reg_w(ov511, 0x12, pxcnt);
+// reg_w(ov511, 0x13, lncnt);
/******** Set the mode ********/
/* Mode independent regs */
- ov511_reg_write(dev, 0x2b, 0x00);
- ov511_reg_write(dev, 0x2d, 0x00);
- ov511_reg_write(dev, 0x3b, 0x00);
- ov511_reg_write(dev, 0x3d, 0x00);
+ reg_w(ov, 0x2b, 0x00);
+ reg_w(ov, 0x2d, 0x00);
+ reg_w(ov, 0x3b, 0x00);
+ reg_w(ov, 0x3d, 0x00);
/* Mode dependent regs. Regs 38 - 3e are always the same as
* regs 28 - 2e */
- ov511_reg_write_mask(dev, 0x28, mlist518[i].reg28
+ reg_w_mask(ov, 0x28, mlist518[i].reg28
| (mode == VIDEO_PALETTE_GREY) ? 0x80:0x00, 0x8f);
- ov511_reg_write(dev, 0x29, mlist518[i].reg29);
- ov511_reg_write(dev, 0x2a, mlist518[i].reg2a);
- ov511_reg_write(dev, 0x2c, mlist518[i].reg2c);
- ov511_reg_write(dev, 0x2e, mlist518[i].reg2e);
- ov511_reg_write_mask(dev, 0x38, mlist518[i].reg28
+ reg_w(ov, 0x29, mlist518[i].reg29);
+ reg_w(ov, 0x2a, mlist518[i].reg2a);
+ reg_w(ov, 0x2c, mlist518[i].reg2c);
+ reg_w(ov, 0x2e, mlist518[i].reg2e);
+ reg_w_mask(ov, 0x38, mlist518[i].reg28
| (mode == VIDEO_PALETTE_GREY) ? 0x80:0x00, 0x8f);
- ov511_reg_write(dev, 0x39, mlist518[i].reg29);
- ov511_reg_write(dev, 0x3a, mlist518[i].reg2a);
- ov511_reg_write(dev, 0x3c, mlist518[i].reg2c);
- ov511_reg_write(dev, 0x3e, mlist518[i].reg2e);
- ov511_reg_write(dev, 0x24, mlist518[i].reg24);
- ov511_reg_write(dev, 0x25, mlist518[i].reg25);
+ reg_w(ov, 0x39, mlist518[i].reg29);
+ reg_w(ov, 0x3a, mlist518[i].reg2a);
+ reg_w(ov, 0x3c, mlist518[i].reg2c);
+ reg_w(ov, 0x3e, mlist518[i].reg2e);
+ reg_w(ov, 0x24, mlist518[i].reg24);
+ reg_w(ov, 0x25, mlist518[i].reg25);
/* Windows driver does this here; who knows why */
- ov511_reg_write(dev, 0x2f, 0x80);
+ reg_w(ov, 0x2f, 0x80);
/******** Set the framerate (to 15 FPS) ********/
/* Mode independent, but framerate dependent, regs */
/* These are for 15 FPS only */
- ov511_reg_write(dev, 0x51, 0x08);
- ov511_reg_write(dev, 0x22, 0x18);
- ov511_reg_write(dev, 0x23, 0xff);
- ov511_reg_write(dev, 0x71, 0x19); /* Compression-related? */
+ reg_w(ov, 0x51, 0x08);
+ reg_w(ov, 0x22, 0x18);
+ reg_w(ov, 0x23, 0xff);
+ reg_w(ov, 0x71, 0x19); /* Compression-related? */
// FIXME: Sensor-specific
/* Bit 5 is what matters here. Of course, it is "reserved" */
- ov51x_i2c_write(ov511, 0x54, 0x23);
+ i2c_w(ov, 0x54, 0x23);
- ov511_reg_write(dev, 0x2f, 0x80);
+ reg_w(ov, 0x2f, 0x80);
/* Mode dependent regs */
if ((width == 352 && height == 288) ||
(width == 320 && height == 240)) {
- b[0]=0x80; b[1]=0x02;
- ov518_reg_write_multi(dev, 0x30, b, 2);
- b[0]=0x90; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xc4, b, 2);
- b[0]=0xf4; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xc6, b, 2);
- b[0]=0xf4; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xc7, b, 2);
- b[0]=0x8e; b[1]=0x00;
- ov518_reg_write_multi(dev, 0xc8, b, 2);
- b[0]=0x1a; b[1]=0x00; b[2]=0x02;
- ov518_reg_write_multi(dev, 0xca, b, 3);
- b[0]=0x14; b[1]=0x02;
- ov518_reg_write_multi(dev, 0xcb, b, 2);
- b[0]=0xd0; b[1]=0x07;
- ov518_reg_write_multi(dev, 0xcc, b, 2);
- b[0]=0x20; b[1]=0x00;
- ov518_reg_write_multi(dev, 0xcd, b, 2);
- b[0]=0x60; b[1]=0x02;
- ov518_reg_write_multi(dev, 0xce, b, 2);
-
+ /* 640 (280h) byte iso packets */
+ ov518_reg_w32(ov, 0x30, 640, 2); /* 280h */
+ ov518_reg_w32(ov, 0xc4, 400, 2); /* 190h */
+ ov518_reg_w32(ov, 0xc6, 500, 2); /* 1f4h */
+ ov518_reg_w32(ov, 0xc7, 500, 2); /* 1f4h */
+ ov518_reg_w32(ov, 0xc8, 142, 2); /* 8eh */
+ ov518_reg_w32(ov, 0xca, 131098, 3); /* 2001ah */
+ ov518_reg_w32(ov, 0xcb, 532, 2); /* 214h */
+ ov518_reg_w32(ov, 0xcc, 2000, 2); /* 7d0h */
+ ov518_reg_w32(ov, 0xcd, 32, 2); /* 20h */
+ ov518_reg_w32(ov, 0xce, 608, 2); /* 260h */
} else if ((width == 176 && height == 144) ||
(width == 160 && height == 120)) {
- b[0]=0x80; b[1]=0x01;
- ov518_reg_write_multi(dev, 0x30, b, 2);
- b[0]=0xc8; b[1]=0x00;
- ov518_reg_write_multi(dev, 0xc4, b, 2);
- b[0]=0x40; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xc6, b, 2);
- b[0]=0x40; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xc7, b, 2);
- b[0]=0x60; b[1]=0x00;
- ov518_reg_write_multi(dev, 0xc8, b, 2);
- b[0]=0x0f; b[1]=0x33; b[2]=0x01;
- ov518_reg_write_multi(dev, 0xca, b, 3);
- b[0]=0x40; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xcb, b, 2);
- b[0]=0xec; b[1]=0x04;
- ov518_reg_write_multi(dev, 0xcc, b, 2);
- b[0]=0x13; b[1]=0x00;
- ov518_reg_write_multi(dev, 0xcd, b, 2);
- b[0]=0x6d; b[1]=0x01;
- ov518_reg_write_multi(dev, 0xce, b, 2);
+ /* 384 (180h) byte iso packets */
+ ov518_reg_w32(ov, 0x30, 384, 2); /* 180h */
+ ov518_reg_w32(ov, 0xc4, 200, 2); /* c8h */
+ ov518_reg_w32(ov, 0xc6, 320, 2); /* 140h */
+ ov518_reg_w32(ov, 0xc7, 320, 2); /* 140h */
+ ov518_reg_w32(ov, 0xc8, 96, 2); /* 60h */
+ ov518_reg_w32(ov, 0xca, 78607, 3); /* 1330fh */
+ ov518_reg_w32(ov, 0xcb, 320, 2); /* 140h */
+ ov518_reg_w32(ov, 0xcc, 1260, 2); /* 4ech */
+ ov518_reg_w32(ov, 0xcd, 19, 2); /* 13h */
+ ov518_reg_w32(ov, 0xce, 365, 2); /* 16dh */
} else {
/* Can't happen, since we already handled this case */
err("ov518_mode_init_regs(): **** logic error ****");
}
- ov511_reg_write(dev, 0x2f, 0x80);
+ reg_w(ov, 0x2f, 0x80);
break;
}
- if (ov511_restart(ov511) < 0)
+ if (ov51x_restart(ov) < 0)
return -EIO;
/* Reset it just for good measure */
- if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0)
+ if (ov51x_reset(ov, OV511_RESET_NOREGS) < 0)
return -EIO;
if (mlist518[i].width == 0) {
@@ -3013,29 +2962,31 @@
/* This is a wrapper around the OV511, OV518, and sensor specific functions */
static int
-mode_init_regs(struct usb_ov511 *ov511,
+mode_init_regs(struct usb_ov511 *ov,
int width, int height, int mode, int sub_flag)
{
int rc = 0;
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
- rc = ov518_mode_init_regs(ov511, width, height, mode, sub_flag);
+ if (!ov || !ov->dev)
+ return -EFAULT;
+
+ if (ov->bclass == BCL_OV518) {
+ rc = ov518_mode_init_regs(ov, width, height, mode, sub_flag);
} else {
- rc = ov511_mode_init_regs(ov511, width, height, mode, sub_flag);
+ rc = ov511_mode_init_regs(ov, width, height, mode, sub_flag);
}
if (FATAL_ERROR(rc))
return rc;
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_OV7610:
case SEN_OV7620:
case SEN_OV7620AE:
case SEN_OV8600:
case SEN_OV6620:
case SEN_OV6630:
- rc = set_ov_sensor_window(ov511, width, height, mode, sub_flag);
+ rc = set_ov_sensor_window(ov, width, height, mode, sub_flag);
break;
case SEN_KS0127:
case SEN_KS0127B:
@@ -3043,10 +2994,10 @@
rc = -EINVAL;
break;
case SEN_SAA7111A:
-// rc = mode_init_saa_sensor_regs(ov511, width, height, mode,
+// rc = mode_init_saa_sensor_regs(ov, width, height, mode,
// sub_flag);
- PDEBUG(1, "SAA status = 0X%x", ov51x_i2c_read(ov511, 0x1f));
+ PDEBUG(1, "SAA status = 0X%x", i2c_r(ov, 0x1f));
break;
default:
err("Unknown sensor");
@@ -3057,25 +3008,25 @@
return rc;
/* Sensor-independent settings */
- rc = sensor_set_auto_brightness(ov511, ov511->auto_brt);
+ rc = sensor_set_auto_brightness(ov, ov->auto_brt);
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_set_auto_exposure(ov511, ov511->auto_exp);
+ rc = sensor_set_auto_exposure(ov, ov->auto_exp);
if (FATAL_ERROR(rc))
return rc;
- rc = sensor_set_banding_filter(ov511, bandingfilter);
+ rc = sensor_set_banding_filter(ov, bandingfilter);
if (FATAL_ERROR(rc))
return rc;
- if (ov511->lightfreq) {
- rc = sensor_set_light_freq(ov511, lightfreq);
+ if (ov->lightfreq) {
+ rc = sensor_set_light_freq(ov, lightfreq);
if (FATAL_ERROR(rc))
return rc;
}
- rc = sensor_set_backlight(ov511, ov511->backlight);
+ rc = sensor_set_backlight(ov, ov->backlight);
if (FATAL_ERROR(rc))
return rc;
@@ -3086,28 +3037,28 @@
* useful for apps that use read() and do not set these.
*/
static int
-ov51x_set_default_params(struct usb_ov511 *ov511)
+ov51x_set_default_params(struct usb_ov511 *ov)
{
int i;
- PDEBUG(3, "%dx%d, RGB24", ov511->maxwidth, ov511->maxheight);
+ PDEBUG(3, "%dx%d, RGB24", ov->maxwidth, ov->maxheight);
/* Set default sizes in case IOCTL (VIDIOCMCAPTURE) is not used
* (using read() instead). */
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].width = ov511->maxwidth;
- ov511->frame[i].height = ov511->maxheight;
- ov511->frame[i].bytes_read = 0;
+ ov->frame[i].width = ov->maxwidth;
+ ov->frame[i].height = ov->maxheight;
+ ov->frame[i].bytes_read = 0;
if (force_palette)
- ov511->frame[i].format = force_palette;
+ ov->frame[i].format = force_palette;
else
- ov511->frame[i].format = VIDEO_PALETTE_RGB24;
- ov511->frame[i].depth = ov511_get_depth(ov511->frame[i].format);
+ ov->frame[i].format = VIDEO_PALETTE_RGB24;
+ ov->frame[i].depth = get_depth(ov->frame[i].format);
}
/* Initialize to max width/height, RGB24 */
- if (mode_init_regs(ov511, ov511->maxwidth, ov511->maxheight,
- ov511->frame[0].format, 0) < 0)
+ if (mode_init_regs(ov, ov->maxwidth, ov->maxheight,
+ ov->frame[0].format, 0) < 0)
return -EINVAL;
return 0;
@@ -3121,18 +3072,17 @@
/* Set analog input port of decoder */
static int
-decoder_set_input(struct usb_ov511 *ov511, int input)
+decoder_set_input(struct usb_ov511 *ov, int input)
{
PDEBUG(4, "port %d", input);
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_SAA7111A:
{
/* Select mode */
- ov51x_i2c_write_mask(ov511, 0x02, input, 0x07);
+ i2c_w_mask(ov, 0x02, input, 0x07);
/* Bypass chrominance trap for modes 4..7 */
- ov51x_i2c_write_mask(ov511, 0x09,
- (input > 3) ? 0x80:0x00, 0x80);
+ i2c_w_mask(ov, 0x09, (input > 3) ? 0x80:0x00, 0x80);
break;
}
default:
@@ -3144,9 +3094,9 @@
/* Get ASCII name of video input */
static int
-decoder_get_input_name(struct usb_ov511 *ov511, int input, char *name)
+decoder_get_input_name(struct usb_ov511 *ov, int input, char *name)
{
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_SAA7111A:
{
if (input < 0 || input > 7)
@@ -3167,11 +3117,11 @@
/* Set norm (NTSC, PAL, SECAM, AUTO) */
static int
-decoder_set_norm(struct usb_ov511 *ov511, int norm)
+decoder_set_norm(struct usb_ov511 *ov, int norm)
{
PDEBUG(4, "%d", norm);
- switch (ov511->sensor) {
+ switch (ov->sensor) {
case SEN_SAA7111A:
{
int reg_8, reg_e;
@@ -3192,8 +3142,8 @@
return -EINVAL;
}
- ov51x_i2c_write_mask(ov511, 0x08, reg_8, 0xc0);
- ov51x_i2c_write_mask(ov511, 0x0e, reg_e, 0x70);
+ i2c_w_mask(ov, 0x08, reg_8, 0xc0);
+ i2c_w_mask(ov, 0x0e, reg_e, 0x70);
break;
}
default:
@@ -3240,8 +3190,8 @@
#define LIMIT(x) ((x)>0xffffff?0xff: ((x)<=0xffff?0:((x)>>16)))
static inline void
-ov511_move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
- int rowPixels, unsigned char * rgb, int bits)
+move_420_block(int yTL, int yTR, int yBL, int yBR, int u, int v,
+ int rowPixels, unsigned char * rgb, int bits)
{
const int rvScale = 91881;
const int guScale = -22553;
@@ -3311,10 +3261,10 @@
**********************************************************************/
/* Copies a 64-byte segment at pIn to an 8x8 block at pOut. The width of the
- * array at pOut is specified by w.
+ * image at pOut is specified by w.
*/
static inline void
-ov511_make_8x8(unsigned char *pIn, unsigned char *pOut, int w)
+make_8x8(unsigned char *pIn, unsigned char *pOut, int w)
{
unsigned char *pOut1 = pOut;
int x, y;
@@ -3352,7 +3302,7 @@
for (y = 0; y < frame->rawheight - 1; y += 8) {
pOut = pOutLine;
for (x = 0; x < frame->rawwidth - 1; x += 8) {
- ov511_make_8x8(pIn, pOut, frame->rawwidth);
+ make_8x8(pIn, pOut, frame->rawwidth);
pIn += 64;
pOut += 8;
}
@@ -3411,8 +3361,8 @@
for (y = 0; y < frame->rawheight - 1; y += 16) {
pOut = pOutLine;
for (x = 0; x < frame->rawwidth - 1; x += 16) {
- ov511_make_8x8(pIn, pOut, w);
- ov511_make_8x8(pIn + 64, pOut + a/4, w);
+ make_8x8(pIn, pOut, w);
+ make_8x8(pIn + 64, pOut + a/4, w);
pIn += 384;
pOut += 8;
}
@@ -3426,7 +3376,7 @@
for (y = 0; y < frame->rawheight - 1; y += 8) {
pOut = pOutLine;
for (x = 0; x < frame->rawwidth - 1; x += 8) {
- ov511_make_8x8(pIn, pOut, frame->rawwidth);
+ make_8x8(pIn, pOut, frame->rawwidth);
pIn += 64;
pOut += 8;
if ((++k) > 3) {
@@ -3483,17 +3433,17 @@
*
**********************************************************************/
-/* Chooses a decompression module, locks it, and sets ov511->decomp_ops
+/* Chooses a decompression module, locks it, and sets ov->decomp_ops
* accordingly. Returns -ENXIO if decompressor is not available, otherwise
* returns 0 if no other error.
*/
static int
-ov51x_request_decompressor(struct usb_ov511 *ov511)
+request_decompressor(struct usb_ov511 *ov)
{
- if (!ov511)
+ if (!ov)
return -ENODEV;
- if (ov511->decomp_ops) {
+ if (ov->decomp_ops) {
err("ERROR: Decompressor already requested!");
return -EINVAL;
}
@@ -3501,24 +3451,23 @@
lock_kernel();
/* Try to get MMX, and fall back on no-MMX if necessary */
- if (ov511->bridge == BRG_OV511 || ov511->bridge == BRG_OV511PLUS) {
+ if (ov->bclass == BCL_OV511) {
if (ov511_mmx_decomp_ops) {
PDEBUG(3, "Using OV511 MMX decompressor");
- ov511->decomp_ops = ov511_mmx_decomp_ops;
+ ov->decomp_ops = ov511_mmx_decomp_ops;
} else if (ov511_decomp_ops) {
PDEBUG(3, "Using OV511 decompressor");
- ov511->decomp_ops = ov511_decomp_ops;
+ ov->decomp_ops = ov511_decomp_ops;
} else {
err("No decompressor available");
}
- } else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
+ } else if (ov->bclass == BCL_OV518) {
if (ov518_mmx_decomp_ops) {
PDEBUG(3, "Using OV518 MMX decompressor");
- ov511->decomp_ops = ov518_mmx_decomp_ops;
+ ov->decomp_ops = ov518_mmx_decomp_ops;
} else if (ov518_decomp_ops) {
PDEBUG(3, "Using OV518 decompressor");
- ov511->decomp_ops = ov518_decomp_ops;
+ ov->decomp_ops = ov518_decomp_ops;
} else {
err("No decompressor available");
}
@@ -3526,13 +3475,13 @@
err("Unknown bridge");
}
- if (ov511->decomp_ops) {
- if (!ov511->decomp_ops->decomp_lock) {
- ov511->decomp_ops = NULL;
+ if (ov->decomp_ops) {
+ if (!ov->decomp_ops->decomp_lock) {
+ ov->decomp_ops = NULL;
unlock_kernel();
return -ENOSYS;
}
- ov511->decomp_ops->decomp_lock();
+ ov->decomp_ops->decomp_lock();
unlock_kernel();
return 0;
} else {
@@ -3541,25 +3490,25 @@
}
}
-/* Unlocks decompression module and nulls ov511->decomp_ops. Safe to call even
- * if ov511->decomp_ops is NULL.
+/* Unlocks decompression module and nulls ov->decomp_ops. Safe to call even
+ * if ov->decomp_ops is NULL.
*/
static void
-ov51x_release_decompressor(struct usb_ov511 *ov511)
+release_decompressor(struct usb_ov511 *ov)
{
int released = 0; /* Did we actually do anything? */
- if (!ov511)
+ if (!ov)
return;
lock_kernel();
- if (ov511->decomp_ops && ov511->decomp_ops->decomp_unlock) {
- ov511->decomp_ops->decomp_unlock();
+ if (ov->decomp_ops && ov->decomp_ops->decomp_unlock) {
+ ov->decomp_ops->decomp_unlock();
released = 1;
}
- ov511->decomp_ops = NULL;
+ ov->decomp_ops = NULL;
unlock_kernel();
@@ -3568,26 +3517,26 @@
}
static void
-ov51x_decompress(struct usb_ov511 *ov511, struct ov511_frame *frame,
- unsigned char *pIn0, unsigned char *pOut0)
+decompress(struct usb_ov511 *ov, struct ov511_frame *frame,
+ unsigned char *pIn0, unsigned char *pOut0)
{
- if (!ov511->decomp_ops)
- if (ov51x_request_decompressor(ov511))
+ if (!ov->decomp_ops)
+ if (request_decompressor(ov))
return;
PDEBUG(4, "Decompressing %d bytes", frame->bytes_recvd);
if (frame->format == VIDEO_PALETTE_GREY
- && ov511->decomp_ops->decomp_400) {
- int ret = ov511->decomp_ops->decomp_400(
+ && ov->decomp_ops->decomp_400) {
+ int ret = ov->decomp_ops->decomp_400(
pIn0,
pOut0,
frame->rawwidth,
frame->rawheight,
frame->bytes_recvd);
PDEBUG(4, "DEBUG: decomp_400 returned %d", ret);
- } else if (ov511->decomp_ops->decomp_420) {
- int ret = ov511->decomp_ops->decomp_420(
+ } else if (ov->decomp_ops->decomp_420) {
+ int ret = ov->decomp_ops->decomp_420(
pIn0,
pOut0,
frame->rawwidth,
@@ -3627,8 +3576,8 @@
u = (*pU++) - 128;
v = (*pV++) - 128;
- ov511_move_420_block(y00, y01, y10, y11, u, v,
- frame->width, pOut, bits);
+ move_420_block(y00, y01, y10, y11, u, v,
+ frame->width, pOut, bits);
pY += 2;
pOut += 2 * bytes;
@@ -3783,11 +3732,11 @@
* 4. Fix the RGB offset, if necessary
*/
static void
-ov511_postprocess(struct usb_ov511 *ov511, struct ov511_frame *frame)
+ov51x_postprocess(struct usb_ov511 *ov, struct ov511_frame *frame)
{
if (dumppix) {
memset(frame->data, 0,
- MAX_DATA_SIZE(ov511->maxwidth, ov511->maxheight));
+ MAX_DATA_SIZE(ov->maxwidth, ov->maxheight));
PDEBUG(4, "Dumping %d bytes", frame->bytes_recvd);
memmove(frame->data, frame->rawdata, frame->bytes_recvd);
return;
@@ -3796,9 +3745,9 @@
/* YUV400 must be handled separately */
if (frame->format == VIDEO_PALETTE_GREY) {
/* Deinterlace frame, if necessary */
- if (ov511->sensor == SEN_SAA7111A && frame->rawheight == 480) {
+ if (ov->sensor == SEN_SAA7111A && frame->rawheight == 480) {
if (frame->compressed)
- ov51x_decompress(ov511, frame, frame->rawdata,
+ decompress(ov, frame, frame->rawdata,
frame->tempdata);
else
yuv400raw_to_yuv400p(frame, frame->rawdata,
@@ -3808,7 +3757,7 @@
frame->data);
} else {
if (frame->compressed)
- ov51x_decompress(ov511, frame, frame->rawdata,
+ decompress(ov, frame, frame->rawdata,
frame->data);
else
yuv400raw_to_yuv400p(frame, frame->rawdata,
@@ -3820,12 +3769,12 @@
/* Process frame->data to frame->rawdata */
if (frame->compressed)
- ov51x_decompress(ov511, frame, frame->rawdata, frame->tempdata);
+ decompress(ov, frame, frame->rawdata, frame->tempdata);
else
yuv420raw_to_yuv420p(frame, frame->rawdata, frame->tempdata);
/* Deinterlace frame, if necessary */
- if (ov511->sensor == SEN_SAA7111A && frame->rawheight == 480) {
+ if (ov->sensor == SEN_SAA7111A && frame->rawheight == 480) {
memmove(frame->rawdata, frame->tempdata,
MAX_RAW_DATA_SIZE(frame->width, frame->height));
deinterlace(frame, RAWFMT_YUV420, frame->rawdata,
@@ -3879,7 +3828,7 @@
**********************************************************************/
static int
-ov511_move_data(struct usb_ov511 *ov511, urb_t *urb)
+ov511_move_data(struct usb_ov511 *ov, struct urb *urb)
{
unsigned char *cdata;
int data_size, num, offset, i, totlen = 0;
@@ -3889,7 +3838,7 @@
PDEBUG(5, "Moving %d packets", urb->number_of_packets);
- data_size = ov511->packet_size - 1;
+ data_size = ov->packet_size - 1;
for (i = 0; i < urb->number_of_packets; i++) {
int n = urb->iso_frame_desc[i].actual_length;
@@ -3900,15 +3849,15 @@
cdata = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
- aPackNum[i] = n ? cdata[ov511->packet_size - 1] : -1;
+ aPackNum[i] = n ? cdata[ov->packet_size - 1] : -1;
- if (!n || ov511->curframe == -1)
+ if (!n || ov->curframe == -1)
continue;
if (st)
PDEBUG(2, "data error: [%d] len=%d, status=%d", i, n, st);
- frame = &ov511->frame[ov511->curframe];
+ frame = &ov->frame[ov->curframe];
/* SOF/EOF packets have 1st to 8th bytes zeroed and the 9th
* byte non-zero. The EOF packet has image width/height in the
@@ -3926,7 +3875,7 @@
if (printph) {
info("packet header (%3d): %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x",
- cdata[ov511->packet_size - 1],
+ cdata[ov->packet_size - 1],
cdata[0], cdata[1], cdata[2], cdata[3], cdata[4], cdata[5],
cdata[6], cdata[7], cdata[8], cdata[9], cdata[10], cdata[11]);
}
@@ -3940,7 +3889,7 @@
/* Frame end */
if (cdata[8] & 0x80) {
ts = (struct timeval *)(frame->data
- + MAX_FRAME_SIZE(ov511->maxwidth, ov511->maxheight));
+ + MAX_FRAME_SIZE(ov->maxwidth, ov->maxheight));
do_gettimeofday(ts);
/* Get the actual frame size from the EOF header */
@@ -3948,21 +3897,21 @@
frame->rawheight = ((int)(cdata[10]) + 1) * 8;
PDEBUG(4, "Frame end, curframe = %d, packnum=%d, hw=%d, vw=%d, recvd=%d",
- ov511->curframe,
- (int)(cdata[ov511->packet_size - 1]),
+ ov->curframe,
+ (int)(cdata[ov->packet_size - 1]),
frame->rawwidth,
frame->rawheight,
frame->bytes_recvd);
/* Validate the header data */
- RESTRICT_TO_RANGE(frame->rawwidth, ov511->minwidth, ov511->maxwidth);
- RESTRICT_TO_RANGE(frame->rawheight, ov511->minheight, ov511->maxheight);
+ RESTRICT_TO_RANGE(frame->rawwidth, ov->minwidth, ov->maxwidth);
+ RESTRICT_TO_RANGE(frame->rawheight, ov->minheight, ov->maxheight);
/* Don't allow byte count to exceed buffer size */
RESTRICT_TO_RANGE(frame->bytes_recvd,
8,
- MAX_RAW_DATA_SIZE(ov511->maxwidth,
- ov511->maxheight));
+ MAX_RAW_DATA_SIZE(ov->maxwidth,
+ ov->maxheight));
if (frame->scanstate == STATE_LINES) {
int iFrameNext;
@@ -3976,20 +3925,20 @@
/* If next frame is ready or grabbing,
* point to it */
- iFrameNext = (ov511->curframe + 1) % OV511_NUMFRAMES;
- if (ov511->frame[iFrameNext].grabstate == FRAME_READY
- || ov511->frame[iFrameNext].grabstate == FRAME_GRABBING) {
- ov511->curframe = iFrameNext;
- ov511->frame[iFrameNext].scanstate = STATE_SCANNING;
+ iFrameNext = (ov->curframe + 1) % OV511_NUMFRAMES;
+ if (ov->frame[iFrameNext].grabstate == FRAME_READY
+ || ov->frame[iFrameNext].grabstate == FRAME_GRABBING) {
+ ov->curframe = iFrameNext;
+ ov->frame[iFrameNext].scanstate = STATE_SCANNING;
} else {
if (frame->grabstate == FRAME_DONE) {
PDEBUG(4, "Frame done! congratulations");
} else {
PDEBUG(4, "Frame not ready? state = %d",
- ov511->frame[iFrameNext].grabstate);
+ ov->frame[iFrameNext].grabstate);
}
- ov511->curframe = -1;
+ ov->curframe = -1;
}
} else {
PDEBUG(5, "Frame done, but not scanning");
@@ -3999,7 +3948,7 @@
*/
} else {
/* Frame start */
- PDEBUG(4, "Frame start, framenum = %d", ov511->curframe);
+ PDEBUG(4, "Frame start, framenum = %d", ov->curframe);
/* Check to see if it's a snapshot frame */
/* FIXME?? Should the snapshot reset go here? Performance? */
@@ -4048,24 +3997,24 @@
/* Dump all data exactly as received */
if (dumppix == 2) {
frame->bytes_recvd += n - 1;
- if (frame->bytes_recvd <= MAX_RAW_DATA_SIZE(ov511->maxwidth, ov511->maxheight))
+ if (frame->bytes_recvd <= MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight))
memmove(frame->rawdata + frame->bytes_recvd - (n - 1),
&cdata[0], n - 1);
else
PDEBUG(3, "Raw data buffer overrun!! (%d)",
frame->bytes_recvd
- - MAX_RAW_DATA_SIZE(ov511->maxwidth,
- ov511->maxheight));
+ - MAX_RAW_DATA_SIZE(ov->maxwidth,
+ ov->maxheight));
} else if (!frame->compressed && !remove_zeros) {
frame->bytes_recvd += num;
- if (frame->bytes_recvd <= MAX_RAW_DATA_SIZE(ov511->maxwidth, ov511->maxheight))
+ if (frame->bytes_recvd <= MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight))
memmove(frame->rawdata + frame->bytes_recvd - num,
&cdata[offset], num);
else
PDEBUG(3, "Raw data buffer overrun!! (%d)",
frame->bytes_recvd
- - MAX_RAW_DATA_SIZE(ov511->maxwidth,
- ov511->maxheight));
+ - MAX_RAW_DATA_SIZE(ov->maxwidth,
+ ov->maxheight));
} else { /* Remove all-zero FIFO lines (aligned 32-byte blocks) */
int b, in = 0, allzero, copied=0;
if (offset) {
@@ -4088,7 +4037,7 @@
/* Don't copy it */
} else {
if (frame->bytes_recvd + copied + 32
- <= MAX_RAW_DATA_SIZE(ov511->maxwidth, ov511->maxheight)) {
+ <= MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight)) {
memmove(frame->rawdata + frame->bytes_recvd + copied,
&cdata[in], 32);
copied += 32;
@@ -4112,7 +4061,7 @@
}
static int
-ov518_move_data(struct usb_ov511 *ov511, urb_t *urb)
+ov518_move_data(struct usb_ov511 *ov, struct urb *urb)
{
unsigned char *cdata;
int i, data_size, totlen = 0;
@@ -4122,7 +4071,7 @@
PDEBUG(5, "Moving %d packets", urb->number_of_packets);
/* OV518(+) has no packet numbering */
- data_size = ov511->packet_size;
+ data_size = ov->packet_size;
for (i = 0; i < urb->number_of_packets; i++) {
int n = urb->iso_frame_desc[i].actual_length;
@@ -4138,7 +4087,7 @@
continue;
}
- if (ov511->curframe == -1) {
+ if (ov->curframe == -1) {
PDEBUG(4, "No frame currently active");
continue;
}
@@ -4146,21 +4095,7 @@
if (st)
PDEBUG(2, "data error: [%d] len=%d, status=%d", i, n, st);
- frame = &ov511->frame[ov511->curframe];
-
-#if 0
- {
- int d;
- /* Print all data */
- for (d = 0; d <= data_size - 16; d += 16) {
- info("%4x: %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x", d,
- cdata[d], cdata[d+1], cdata[d+2], cdata[d+3],
- cdata[d+4], cdata[d+5], cdata[d+6], cdata[d+7],
- cdata[d+8], cdata[d+9], cdata[d+10], cdata[d+11],
- cdata[d+12], cdata[d+13], cdata[d+14], cdata[d+15]);
- }
- }
-#endif
+ frame = &ov->frame[ov->curframe];
if (printph) {
info("packet header: %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x",
@@ -4178,7 +4113,7 @@
goto eof;
} else { //scanstate == STATE_SCANNING
/* Frame start */
- PDEBUG(4, "Frame start, framenum = %d", ov511->curframe);
+ PDEBUG(4, "Frame start, framenum = %d", ov->curframe);
goto sof;
}
} else {
@@ -4187,11 +4122,11 @@
eof:
ts = (struct timeval *)(frame->data
- + MAX_FRAME_SIZE(ov511->maxwidth, ov511->maxheight));
+ + MAX_FRAME_SIZE(ov->maxwidth, ov->maxheight));
do_gettimeofday(ts);
PDEBUG(4, "Frame end, curframe = %d, hw=%d, vw=%d, recvd=%d",
- ov511->curframe,
+ ov->curframe,
(int)(cdata[9]), (int)(cdata[10]), frame->bytes_recvd);
// FIXME: Since we don't know the header formats yet,
@@ -4200,13 +4135,13 @@
frame->rawheight = frame->height;
/* Validate the header data */
- RESTRICT_TO_RANGE(frame->rawwidth, ov511->minwidth, ov511->maxwidth);
- RESTRICT_TO_RANGE(frame->rawheight, ov511->minheight, ov511->maxheight);
+ RESTRICT_TO_RANGE(frame->rawwidth, ov->minwidth, ov->maxwidth);
+ RESTRICT_TO_RANGE(frame->rawheight, ov->minheight, ov->maxheight);
/* Don't allow byte count to exceed buffer size */
RESTRICT_TO_RANGE(frame->bytes_recvd,
8,
- MAX_RAW_DATA_SIZE(ov511->maxwidth, ov511->maxheight));
+ MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight));
if (frame->scanstate == STATE_LINES) {
int iFrameNext;
@@ -4220,21 +4155,21 @@
/* If next frame is ready or grabbing,
* point to it */
- iFrameNext = (ov511->curframe + 1) % OV511_NUMFRAMES;
- if (ov511->frame[iFrameNext].grabstate == FRAME_READY
- || ov511->frame[iFrameNext].grabstate == FRAME_GRABBING) {
- ov511->curframe = iFrameNext;
- ov511->frame[iFrameNext].scanstate = STATE_SCANNING;
- frame = &ov511->frame[iFrameNext];
+ iFrameNext = (ov->curframe + 1) % OV511_NUMFRAMES;
+ if (ov->frame[iFrameNext].grabstate == FRAME_READY
+ || ov->frame[iFrameNext].grabstate == FRAME_GRABBING) {
+ ov->curframe = iFrameNext;
+ ov->frame[iFrameNext].scanstate = STATE_SCANNING;
+ frame = &ov->frame[iFrameNext];
} else {
if (frame->grabstate == FRAME_DONE) {
PDEBUG(4, "Frame done! congratulations");
} else {
PDEBUG(4, "Frame not ready? state = %d",
- ov511->frame[iFrameNext].grabstate);
+ ov->frame[iFrameNext].grabstate);
}
- ov511->curframe = -1;
+ ov->curframe = -1;
PDEBUG(4, "SOF dropped (no active frame)");
continue; /* Nowhere to store this frame */
}
@@ -4267,31 +4202,26 @@
/* Dump all data exactly as received */
if (dumppix == 2) {
frame->bytes_recvd += n;
- if (frame->bytes_recvd <= MAX_RAW_DATA_SIZE(ov511->maxwidth, ov511->maxheight))
+ if (frame->bytes_recvd <= MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight))
memmove(frame->rawdata + frame->bytes_recvd - n,
&cdata[0], n);
else
PDEBUG(3, "Raw data buffer overrun!! (%d)",
frame->bytes_recvd
- - MAX_RAW_DATA_SIZE(ov511->maxwidth,
- ov511->maxheight));
+ - MAX_RAW_DATA_SIZE(ov->maxwidth,
+ ov->maxheight));
} else {
/* All incoming data are divided into 8-byte segments. If the
* segment contains all zero bytes, it must be skipped. These
* zero-segments allow the OV518 to mainain a constant data rate
* regardless of the effectiveness of the compression. Segments
* are aligned relative to the beginning of each isochronous
- * packet. The first segment is a header.
+ * packet. The first segment is a header (the decompressor
+ * skips it later).
*/
int b, in = 0, allzero, copied=0;
-// Decompressor expects the header
-#if 0
- if (frame->bytes_recvd == 0)
- in += 8; /* Skip header */
-#endif
-
while (in < n) {
allzero = 1;
for (b = 0; b < 8; b++) {
@@ -4305,7 +4235,7 @@
/* Don't copy it */
} else {
if (frame->bytes_recvd + copied + 8
- <= MAX_RAW_DATA_SIZE(ov511->maxwidth, ov511->maxheight)) {
+ <= MAX_RAW_DATA_SIZE(ov->maxwidth, ov->maxheight)) {
memmove(frame->rawdata + frame->bytes_recvd + copied,
&cdata[in], 8);
copied += 8;
@@ -4323,43 +4253,41 @@
}
static void
-ov511_isoc_irq(struct urb *urb)
+ov51x_isoc_irq(struct urb *urb)
{
int len;
- struct usb_ov511 *ov511;
+ struct usb_ov511 *ov;
if (!urb->context) {
PDEBUG(4, "no context");
return;
}
- ov511 = (struct usb_ov511 *) urb->context;
+ ov = (struct usb_ov511 *) urb->context;
- if (!ov511->dev || !ov511->user) {
+ if (!ov || !ov->dev || !ov->user) {
PDEBUG(4, "no device, or not open");
return;
}
- if (!ov511->streaming) {
+ if (!ov->streaming) {
PDEBUG(4, "hmmm... not streaming, but got interrupt");
return;
}
/* Copy the data received into our frame buffer */
- if (ov511->curframe >= 0) {
- if (ov511->bridge == BRG_OV511 ||
- ov511->bridge == BRG_OV511PLUS)
- len = ov511_move_data(ov511, urb);
- else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- len = ov518_move_data(ov511, urb);
+ if (ov->curframe >= 0) {
+ if (ov->bclass == BCL_OV511)
+ len = ov511_move_data(ov, urb);
+ else if (ov->bclass == BCL_OV518)
+ len = ov518_move_data(ov, urb);
else
- err("Unknown bridge device (%d)", ov511->bridge);
- } else if (waitqueue_active(&ov511->wq)) {
- wake_up_interruptible(&ov511->wq);
+ err("Unknown bridge device (%d)", ov->bridge);
+ } else if (waitqueue_active(&ov->wq)) {
+ wake_up_interruptible(&ov->wq);
}
- urb->dev = ov511->dev;
+ urb->dev = ov->dev;
return;
}
@@ -4371,16 +4299,16 @@
***************************************************************************/
static int
-ov511_init_isoc(struct usb_ov511 *ov511)
+ov51x_init_isoc(struct usb_ov511 *ov)
{
- urb_t *urb;
+ struct urb *urb;
int fx, err, n, size;
PDEBUG(3, "*** Initializing capture ***");
- ov511->curframe = -1;
+ ov->curframe = -1;
- if (ov511->bridge == BRG_OV511) {
+ if (ov->bridge == BRG_OV511) {
if (cams == 1) size = 993;
else if (cams == 2) size = 513;
else if (cams == 3 || cams == 4) size = 257;
@@ -4388,7 +4316,7 @@
err("\"cams\" parameter too high!");
return -1;
}
- } else if (ov511->bridge == BRG_OV511PLUS) {
+ } else if (ov->bridge == BRG_OV511PLUS) {
if (cams == 1) size = 961;
else if (cams == 2) size = 513;
else if (cams == 3 || cams == 4) size = 257;
@@ -4398,8 +4326,7 @@
err("\"cams\" parameter too high!");
return -1;
}
- } else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
+ } else if (ov->bclass == BCL_OV518) {
if (cams == 1) size = 896;
else if (cams == 2) size = 512;
else if (cams == 3 || cams == 4) size = 256;
@@ -4415,14 +4342,13 @@
if (packetsize == -1) {
// FIXME: OV518 is hardcoded to 15 FPS (alternate 5) for now
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- ov511_set_packet_size(ov511, 640);
+ if (ov->bclass == BCL_OV518)
+ ov51x_set_packet_size(ov, 640);
else
- ov511_set_packet_size(ov511, size);
+ ov51x_set_packet_size(ov, size);
} else {
info("Forcing packet size to %d", packetsize);
- ov511_set_packet_size(ov511, packetsize);
+ ov51x_set_packet_size(ov, packetsize);
}
for (n = 0; n < OV511_NUMSBUF; n++) {
@@ -4432,32 +4358,30 @@
err("init isoc: usb_alloc_urb ret. NULL");
return -ENOMEM;
}
- ov511->sbuf[n].urb = urb;
- urb->dev = ov511->dev;
- urb->context = ov511;
- urb->pipe = usb_rcvisocpipe(ov511->dev, OV511_ENDPOINT_ADDRESS);
+ ov->sbuf[n].urb = urb;
+ urb->dev = ov->dev;
+ urb->context = ov;
+ urb->pipe = usb_rcvisocpipe(ov->dev, OV511_ENDPOINT_ADDRESS);
urb->transfer_flags = USB_ISO_ASAP;
- urb->transfer_buffer = ov511->sbuf[n].data;
- urb->complete = ov511_isoc_irq;
+ urb->transfer_buffer = ov->sbuf[n].data;
+ urb->complete = ov51x_isoc_irq;
urb->number_of_packets = FRAMES_PER_DESC;
- urb->transfer_buffer_length =
- ov511->packet_size * FRAMES_PER_DESC;
+ urb->transfer_buffer_length = ov->packet_size * FRAMES_PER_DESC;
for (fx = 0; fx < FRAMES_PER_DESC; fx++) {
- urb->iso_frame_desc[fx].offset =
- ov511->packet_size * fx;
- urb->iso_frame_desc[fx].length = ov511->packet_size;
+ urb->iso_frame_desc[fx].offset = ov->packet_size * fx;
+ urb->iso_frame_desc[fx].length = ov->packet_size;
}
}
- ov511->streaming = 1;
+ ov->streaming = 1;
- ov511->sbuf[OV511_NUMSBUF - 1].urb->next = ov511->sbuf[0].urb;
+ ov->sbuf[OV511_NUMSBUF - 1].urb->next = ov->sbuf[0].urb;
for (n = 0; n < OV511_NUMSBUF - 1; n++)
- ov511->sbuf[n].urb->next = ov511->sbuf[n+1].urb;
+ ov->sbuf[n].urb->next = ov->sbuf[n+1].urb;
for (n = 0; n < OV511_NUMSBUF; n++) {
- ov511->sbuf[n].urb->dev = ov511->dev;
- err = usb_submit_urb(ov511->sbuf[n].urb);
+ ov->sbuf[n].urb->dev = ov->dev;
+ err = usb_submit_urb(ov->sbuf[n].urb);
if (err)
err("init isoc: usb_submit_urb(%d) ret %d", n, err);
}
@@ -4466,51 +4390,51 @@
}
static void
-ov511_stop_isoc(struct usb_ov511 *ov511)
+ov51x_stop_isoc(struct usb_ov511 *ov)
{
int n;
- if (!ov511->streaming || !ov511->dev)
+ if (!ov->streaming || !ov->dev)
return;
PDEBUG(3, "*** Stopping capture ***");
- ov511_set_packet_size(ov511, 0);
+ ov51x_set_packet_size(ov, 0);
- ov511->streaming = 0;
+ ov->streaming = 0;
/* Unschedule all of the iso td's */
for (n = OV511_NUMSBUF - 1; n >= 0; n--) {
- if (ov511->sbuf[n].urb) {
- ov511->sbuf[n].urb->next = NULL;
- usb_unlink_urb(ov511->sbuf[n].urb);
- usb_free_urb(ov511->sbuf[n].urb);
- ov511->sbuf[n].urb = NULL;
+ if (ov->sbuf[n].urb) {
+ ov->sbuf[n].urb->next = NULL;
+ usb_unlink_urb(ov->sbuf[n].urb);
+ usb_free_urb(ov->sbuf[n].urb);
+ ov->sbuf[n].urb = NULL;
}
}
}
static int
-ov511_new_frame(struct usb_ov511 *ov511, int framenum)
+ov51x_new_frame(struct usb_ov511 *ov, int framenum)
{
struct ov511_frame *frame;
int newnum;
- PDEBUG(4, "ov511->curframe = %d, framenum = %d", ov511->curframe,
- framenum);
- if (!ov511->dev)
+ PDEBUG(4, "ov->curframe = %d, framenum = %d", ov->curframe, framenum);
+
+ if (!ov->dev)
return -1;
/* If we're not grabbing a frame right now and the other frame is */
/* ready to be grabbed into, then use it instead */
- if (ov511->curframe == -1) {
+ if (ov->curframe == -1) {
newnum = (framenum - 1 + OV511_NUMFRAMES) % OV511_NUMFRAMES;
- if (ov511->frame[newnum].grabstate == FRAME_READY)
+ if (ov->frame[newnum].grabstate == FRAME_READY)
framenum = newnum;
} else
return 0;
- frame = &ov511->frame[framenum];
+ frame = &ov->frame[framenum];
PDEBUG(4, "framenum = %d, width = %d, height = %d", framenum,
frame->width, frame->height);
@@ -4519,16 +4443,16 @@
frame->scanstate = STATE_SCANNING;
frame->snapshot = 0;
- ov511->curframe = framenum;
+ ov->curframe = framenum;
/* Make sure it's not too big */
- if (frame->width > ov511->maxwidth)
- frame->width = ov511->maxwidth;
+ if (frame->width > ov->maxwidth)
+ frame->width = ov->maxwidth;
frame->width &= ~7L; /* Multiple of 8 */
- if (frame->height > ov511->maxheight)
- frame->height = ov511->maxheight;
+ if (frame->height > ov->maxheight)
+ frame->height = ov->maxheight;
frame->height &= ~3L; /* Multiple of 4 */
@@ -4540,84 +4464,86 @@
* Buffer management
*
***************************************************************************/
+
static int
-ov511_alloc(struct usb_ov511 *ov511)
+ov51x_alloc(struct usb_ov511 *ov)
{
int i;
- int w = ov511->maxwidth;
- int h = ov511->maxheight;
+ const int w = ov->maxwidth;
+ const int h = ov->maxheight;
+ const int data_bufsize = OV511_NUMFRAMES * MAX_DATA_SIZE(w, h);
+ const int raw_bufsize = OV511_NUMFRAMES * MAX_RAW_DATA_SIZE(w, h);
PDEBUG(4, "entered");
- down(&ov511->buf_lock);
+ down(&ov->buf_lock);
- if (ov511->buf_state == BUF_PEND_DEALLOC) {
- ov511->buf_state = BUF_ALLOCATED;
- del_timer(&ov511->buf_timer);
+ if (ov->buf_state == BUF_PEND_DEALLOC) {
+ ov->buf_state = BUF_ALLOCATED;
+ del_timer(&ov->buf_timer);
}
- if (ov511->buf_state == BUF_ALLOCATED)
+ if (ov->buf_state == BUF_ALLOCATED)
goto out;
- ov511->fbuf = rvmalloc(OV511_NUMFRAMES * MAX_DATA_SIZE(w, h));
- if (!ov511->fbuf)
+ ov->fbuf = rvmalloc(data_bufsize);
+ if (!ov->fbuf)
goto error;
- ov511->rawfbuf = vmalloc(OV511_NUMFRAMES * MAX_RAW_DATA_SIZE(w, h));
- if (!ov511->rawfbuf) {
- rvfree(ov511->fbuf, OV511_NUMFRAMES * MAX_DATA_SIZE(w, h));
- ov511->fbuf = NULL;
+ ov->rawfbuf = vmalloc(raw_bufsize);
+ if (!ov->rawfbuf) {
+ rvfree(ov->fbuf, data_bufsize);
+ ov->fbuf = NULL;
goto error;
}
- memset(ov511->rawfbuf, 0, OV511_NUMFRAMES * MAX_RAW_DATA_SIZE(w, h));
+ memset(ov->rawfbuf, 0, raw_bufsize);
- ov511->tempfbuf = vmalloc(OV511_NUMFRAMES * MAX_RAW_DATA_SIZE(w, h));
- if (!ov511->tempfbuf) {
- vfree(ov511->rawfbuf);
- ov511->rawfbuf = NULL;
- rvfree(ov511->fbuf, OV511_NUMFRAMES * MAX_DATA_SIZE(w, h));
- ov511->fbuf = NULL;
+ ov->tempfbuf = vmalloc(raw_bufsize);
+ if (!ov->tempfbuf) {
+ vfree(ov->rawfbuf);
+ ov->rawfbuf = NULL;
+ rvfree(ov->fbuf, data_bufsize);
+ ov->fbuf = NULL;
goto error;
}
- memset(ov511->tempfbuf, 0, OV511_NUMFRAMES * MAX_RAW_DATA_SIZE(w, h));
+ memset(ov->tempfbuf, 0, raw_bufsize);
for (i = 0; i < OV511_NUMSBUF; i++) {
- ov511->sbuf[i].data = kmalloc(FRAMES_PER_DESC *
+ ov->sbuf[i].data = kmalloc(FRAMES_PER_DESC *
MAX_FRAME_SIZE_PER_DESC, GFP_KERNEL);
- if (!ov511->sbuf[i].data) {
+ if (!ov->sbuf[i].data) {
while (--i) {
- kfree(ov511->sbuf[i].data);
- ov511->sbuf[i].data = NULL;
+ kfree(ov->sbuf[i].data);
+ ov->sbuf[i].data = NULL;
}
- vfree(ov511->tempfbuf);
- ov511->tempfbuf = NULL;
- vfree(ov511->rawfbuf);
- ov511->rawfbuf = NULL;
- rvfree(ov511->fbuf,
- OV511_NUMFRAMES * MAX_DATA_SIZE(w, h));
- ov511->fbuf = NULL;
+ vfree(ov->tempfbuf);
+ ov->tempfbuf = NULL;
+ vfree(ov->rawfbuf);
+ ov->rawfbuf = NULL;
+ rvfree(ov->fbuf, data_bufsize);
+ ov->fbuf = NULL;
goto error;
}
- PDEBUG(4, "sbuf[%d] @ %p", i, ov511->sbuf[i].data);
+ PDEBUG(4, "sbuf[%d] @ %p", i, ov->sbuf[i].data);
}
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].data = ov511->fbuf + i * MAX_DATA_SIZE(w, h);
- ov511->frame[i].rawdata = ov511->rawfbuf
+ ov->frame[i].data = ov->fbuf + i * MAX_DATA_SIZE(w, h);
+ ov->frame[i].rawdata = ov->rawfbuf
+ i * MAX_RAW_DATA_SIZE(w, h);
- ov511->frame[i].tempdata = ov511->tempfbuf
+ ov->frame[i].tempdata = ov->tempfbuf
+ i * MAX_RAW_DATA_SIZE(w, h);
- PDEBUG(4, "frame[%d] @ %p", i, ov511->frame[i].data);
+ PDEBUG(4, "frame[%d] @ %p", i, ov->frame[i].data);
}
- ov511->buf_state = BUF_ALLOCATED;
+ ov->buf_state = BUF_ALLOCATED;
out:
- up(&ov511->buf_lock);
+ up(&ov->buf_lock);
PDEBUG(4, "leaving");
return 0;
error:
- ov511->buf_state = BUF_NOT_ALLOCATED;
- up(&ov511->buf_lock);
+ ov->buf_state = BUF_NOT_ALLOCATED;
+ up(&ov->buf_lock);
PDEBUG(4, "errored");
return -ENOMEM;
}
@@ -4628,206 +4554,212 @@
* them if you explicitly free them somewhere else!
*/
static void
-ov511_do_dealloc(struct usb_ov511 *ov511)
+ov51x_do_dealloc(struct usb_ov511 *ov)
{
int i;
PDEBUG(4, "entered");
- if (ov511->fbuf) {
- rvfree(ov511->fbuf, OV511_NUMFRAMES
- * MAX_DATA_SIZE(ov511->maxwidth, ov511->maxheight));
- ov511->fbuf = NULL;
+ if (ov->fbuf) {
+ rvfree(ov->fbuf, OV511_NUMFRAMES
+ * MAX_DATA_SIZE(ov->maxwidth, ov->maxheight));
+ ov->fbuf = NULL;
}
- if (ov511->rawfbuf) {
- vfree(ov511->rawfbuf);
- ov511->rawfbuf = NULL;
+ if (ov->rawfbuf) {
+ vfree(ov->rawfbuf);
+ ov->rawfbuf = NULL;
}
- if (ov511->tempfbuf) {
- vfree(ov511->tempfbuf);
- ov511->tempfbuf = NULL;
+ if (ov->tempfbuf) {
+ vfree(ov->tempfbuf);
+ ov->tempfbuf = NULL;
}
for (i = 0; i < OV511_NUMSBUF; i++) {
- if (ov511->sbuf[i].data) {
- kfree(ov511->sbuf[i].data);
- ov511->sbuf[i].data = NULL;
+ if (ov->sbuf[i].data) {
+ kfree(ov->sbuf[i].data);
+ ov->sbuf[i].data = NULL;
}
}
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].data = NULL;
- ov511->frame[i].rawdata = NULL;
- ov511->frame[i].tempdata = NULL;
+ ov->frame[i].data = NULL;
+ ov->frame[i].rawdata = NULL;
+ ov->frame[i].tempdata = NULL;
}
PDEBUG(4, "buffer memory deallocated");
- ov511->buf_state = BUF_NOT_ALLOCATED;
+ ov->buf_state = BUF_NOT_ALLOCATED;
PDEBUG(4, "leaving");
}
static void
-ov511_buf_callback(unsigned long data)
+ov51x_buf_callback(unsigned long data)
{
- struct usb_ov511 *ov511 = (struct usb_ov511 *)data;
+ struct usb_ov511 *ov = (struct usb_ov511 *)data;
PDEBUG(4, "entered");
- down(&ov511->buf_lock);
+ down(&ov->buf_lock);
- if (ov511->buf_state == BUF_PEND_DEALLOC)
- ov511_do_dealloc(ov511);
+ if (ov->buf_state == BUF_PEND_DEALLOC)
+ ov51x_do_dealloc(ov);
- up(&ov511->buf_lock);
+ up(&ov->buf_lock);
PDEBUG(4, "leaving");
}
static void
-ov511_dealloc(struct usb_ov511 *ov511, int now)
+ov51x_dealloc(struct usb_ov511 *ov, int now)
{
- struct timer_list *bt = &(ov511->buf_timer);
+ struct timer_list *bt = &(ov->buf_timer);
PDEBUG(4, "entered");
- down(&ov511->buf_lock);
+ down(&ov->buf_lock);
PDEBUG(4, "deallocating buffer memory %s", now ? "now" : "later");
- if (ov511->buf_state == BUF_PEND_DEALLOC) {
- ov511->buf_state = BUF_ALLOCATED;
+ if (ov->buf_state == BUF_PEND_DEALLOC) {
+ ov->buf_state = BUF_ALLOCATED;
del_timer(bt);
}
if (now)
- ov511_do_dealloc(ov511);
+ ov51x_do_dealloc(ov);
else {
- ov511->buf_state = BUF_PEND_DEALLOC;
+ ov->buf_state = BUF_PEND_DEALLOC;
init_timer(bt);
- bt->function = ov511_buf_callback;
- bt->data = (unsigned long)ov511;
+ bt->function = ov51x_buf_callback;
+ bt->data = (unsigned long)ov;
bt->expires = jiffies + buf_timeout * HZ;
add_timer(bt);
}
- up(&ov511->buf_lock);
+ up(&ov->buf_lock);
PDEBUG(4, "leaving");
}
/****************************************************************************
*
- * V4L API
+ * V4L 1 API
*
***************************************************************************/
static int
-ov511_open(struct video_device *vdev, int flags)
+ov51x_v4l1_open(struct video_device *vdev, int flags)
{
- struct usb_ov511 *ov511 = vdev->priv;
+ struct usb_ov511 *ov = vdev->priv;
int err, i;
PDEBUG(4, "opening");
- down(&ov511->lock);
+ down(&ov->lock);
err = -EBUSY;
- if (ov511->user)
+ if (ov->user)
goto out;
err = -ENOMEM;
- if (ov511_alloc(ov511))
+ if (ov51x_alloc(ov))
goto out;
- ov511->sub_flag = 0;
+ ov->sub_flag = 0;
/* In case app doesn't set them... */
- if (ov51x_set_default_params(ov511) < 0)
+ if (ov51x_set_default_params(ov) < 0)
goto out;
/* Make sure frames are reset */
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].grabstate = FRAME_UNUSED;
- ov511->frame[i].bytes_read = 0;
+ ov->frame[i].grabstate = FRAME_UNUSED;
+ ov->frame[i].bytes_read = 0;
}
/* If compression is on, make sure now that a
* decompressor can be loaded */
- if (ov511->compress && !ov511->decomp_ops) {
- err = ov51x_request_decompressor(ov511);
- if (err)
+ if (ov->compress && !ov->decomp_ops) {
+ err = request_decompressor(ov);
+ if (err && !dumppix)
goto out;
}
- err = ov511_init_isoc(ov511);
+ err = ov51x_init_isoc(ov);
if (err) {
- ov511_dealloc(ov511, 0);
+ ov51x_dealloc(ov, 0);
goto out;
}
- ov511->user++;
+ ov->user++;
- if (ov511->led_policy == LED_AUTO)
- ov51x_led_control(ov511, 1);
+ if (ov->led_policy == LED_AUTO)
+ ov51x_led_control(ov, 1);
out:
- up(&ov511->lock);
+ up(&ov->lock);
return err;
}
static void
-ov511_close(struct video_device *dev)
+ov51x_v4l1_close(struct video_device *vdev)
{
- struct usb_ov511 *ov511 = (struct usb_ov511 *)dev;
+ struct usb_ov511 *ov = vdev->priv;
PDEBUG(4, "ov511_close");
- down(&ov511->lock);
+ down(&ov->lock);
- ov511->user--;
- ov511_stop_isoc(ov511);
+ ov->user--;
+ ov51x_stop_isoc(ov);
- ov51x_release_decompressor(ov511);
+ release_decompressor(ov);
- if (ov511->led_policy == LED_AUTO)
- ov51x_led_control(ov511, 0);
+ if (ov->led_policy == LED_AUTO)
+ ov51x_led_control(ov, 0);
- if (ov511->dev)
- ov511_dealloc(ov511, 0);
+ if (ov->dev)
+ ov51x_dealloc(ov, 0);
- up(&ov511->lock);
+ up(&ov->lock);
/* Device unplugged while open. Only a minimum of unregistration is done
* here; the disconnect callback already did the rest. */
- if (!ov511->dev) {
- ov511_dealloc(ov511, 1);
- video_unregister_device(&ov511->vdev);
- kfree(ov511);
- ov511 = NULL;
+ if (!ov->dev) {
+ down(&ov->cbuf_lock);
+ kfree(ov->cbuf);
+ ov->cbuf = NULL;
+ up(&ov->cbuf_lock);
+
+ ov51x_dealloc(ov, 1);
+ video_unregister_device(&ov->vdev);
+ kfree(ov);
+ ov = NULL;
}
}
static int
-ov511_init_done(struct video_device *vdev)
+ov51x_v4l1_init_done(struct video_device *vdev)
{
#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
- create_proc_ov511_cam((struct usb_ov511 *)vdev);
+ create_proc_ov511_cam(vdev->priv);
#endif
return 0;
}
static long
-ov511_write(struct video_device *vdev, const char *buf,
- unsigned long count, int noblock)
+ov51x_v4l1_write(struct video_device *vdev, const char *buf,
+ unsigned long count, int noblock)
{
return -EINVAL;
}
/* Do not call this function directly! */
static int
-ov511_ioctl_internal(struct video_device *vdev, unsigned int cmd, void *arg)
+ov51x_v4l1_ioctl_internal(struct video_device *vdev, unsigned int cmd,
+ void *arg)
{
- struct usb_ov511 *ov511 = (struct usb_ov511 *)vdev;
+ struct usb_ov511 *ov = vdev->priv;
PDEBUG(5, "IOCtl: 0x%X", cmd);
- if (!ov511->dev)
+ if (!ov->dev)
return -EIO;
switch (cmd) {
@@ -4839,20 +4771,20 @@
memset(&b, 0, sizeof(b));
sprintf(b.name, "%s USB Camera",
- ov511->bridge == BRG_OV511 ? "OV511" :
- ov511->bridge == BRG_OV511PLUS ? "OV511+" :
- ov511->bridge == BRG_OV518 ? "OV518" :
- ov511->bridge == BRG_OV518PLUS ? "OV518+" :
+ ov->bridge == BRG_OV511 ? "OV511" :
+ ov->bridge == BRG_OV511PLUS ? "OV511+" :
+ ov->bridge == BRG_OV518 ? "OV518" :
+ ov->bridge == BRG_OV518PLUS ? "OV518+" :
"unknown");
b.type = VID_TYPE_CAPTURE | VID_TYPE_SUBCAPTURE;
- if (ov511->has_tuner)
+ if (ov->has_tuner)
b.type |= VID_TYPE_TUNER;
- b.channels = ov511->num_inputs;
- b.audios = ov511->has_audio_proc ? 1:0;
- b.maxwidth = ov511->maxwidth;
- b.maxheight = ov511->maxheight;
- b.minwidth = ov511->minwidth;
- b.minheight = ov511->minheight;
+ b.channels = ov->num_inputs;
+ b.audios = ov->has_audio_proc ? 1:0;
+ b.maxwidth = ov->maxwidth;
+ b.maxheight = ov->maxheight;
+ b.minwidth = ov->minwidth;
+ b.minheight = ov->minheight;
if (copy_to_user(arg, &b, sizeof(b)))
return -EFAULT;
@@ -4868,18 +4800,18 @@
if (copy_from_user(&v, arg, sizeof(v)))
return -EFAULT;
- if ((unsigned)(v.channel) >= ov511->num_inputs) {
+ if ((unsigned)(v.channel) >= ov->num_inputs) {
err("Invalid channel (%d)", v.channel);
return -EINVAL;
}
- v.norm = ov511->norm;
- v.type = (ov511->has_tuner) ? VIDEO_TYPE_TV : VIDEO_TYPE_CAMERA;
- v.flags = (ov511->has_tuner) ? VIDEO_VC_TUNER : 0;
- v.flags |= (ov511->has_audio_proc) ? VIDEO_VC_AUDIO : 0;
-// v.flags |= (ov511->has_decoder) ? VIDEO_VC_NORM : 0;
- v.tuners = (ov511->has_tuner) ? 1:0;
- decoder_get_input_name(ov511, v.channel, v.name);
+ 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.flags |= (ov->has_decoder) ? VIDEO_VC_NORM : 0;
+ v.tuners = (ov->has_tuner) ? 1:0;
+ decoder_get_input_name(ov, v.channel, v.name);
if (copy_to_user(arg, &v, sizeof(v)))
return -EFAULT;
@@ -4897,7 +4829,7 @@
return -EFAULT;
/* Make sure it's not a camera */
- if (!ov511->has_decoder) {
+ if (!ov->has_decoder) {
if (v.channel == 0)
return 0;
else
@@ -4912,16 +4844,16 @@
return -EINVAL;
}
- if ((unsigned)(v.channel) >= ov511->num_inputs) {
+ if ((unsigned)(v.channel) >= ov->num_inputs) {
err("Invalid channel (%d)", v.channel);
return -EINVAL;
}
- err = decoder_set_input(ov511, v.channel);
+ err = decoder_set_input(ov, v.channel);
if (err)
return err;
- err = decoder_set_norm(ov511, v.norm);
+ err = decoder_set_norm(ov, v.norm);
if (err)
return err;
@@ -4935,7 +4867,7 @@
memset(&p, 0, sizeof(p));
- if (sensor_get_picture(ov511, &p))
+ if (sensor_get_picture(ov, &p))
return -EIO;
if (copy_to_user(arg, &p, sizeof(p)))
@@ -4953,10 +4885,10 @@
if (copy_from_user(&p, arg, sizeof(p)))
return -EFAULT;
- if (!ov511_get_depth(p.palette))
+ if (!get_depth(p.palette))
return -EINVAL;
- if (sensor_set_picture(ov511, &p))
+ if (sensor_set_picture(ov, &p))
return -EIO;
if (force_palette && p.palette != force_palette) {
@@ -4965,23 +4897,22 @@
}
// FIXME: Format should be independent of frames
- if (p.palette != ov511->frame[0].format) {
+ if (p.palette != ov->frame[0].format) {
PDEBUG(4, "Detected format change");
/* If we're collecting previous frame wait
before changing modes */
- interruptible_sleep_on(&ov511->wq);
+ interruptible_sleep_on(&ov->wq);
if (signal_pending(current)) return -EINTR;
- mode_init_regs(ov511, ov511->frame[0].width,
- ov511->frame[0].height, p.palette,
- ov511->sub_flag);
+ mode_init_regs(ov, ov->frame[0].width,
+ ov->frame[0].height, p.palette, ov->sub_flag);
}
PDEBUG(4, "Setting depth=%d, palette=%d", p.depth, p.palette);
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].depth = p.depth;
- ov511->frame[i].format = p.palette;
+ ov->frame[i].depth = p.depth;
+ ov->frame[i].format = p.palette;
}
return 0;
@@ -4994,7 +4925,7 @@
if (copy_from_user(&vf, arg, sizeof(vf)))
return -EFAULT;
- ov511->sub_flag = vf;
+ ov->sub_flag = vf;
return 0;
}
case VIDIOCSCAPTURE:
@@ -5022,10 +4953,10 @@
if (vc.height == 0)
vc.height = 16;
- ov511->subx = vc.x;
- ov511->suby = vc.y;
- ov511->subw = vc.width;
- ov511->subh = vc.height;
+ ov->subx = vc.x;
+ ov->suby = vc.y;
+ ov->subw = vc.width;
+ ov->subh = vc.height;
return 0;
}
@@ -5045,25 +4976,25 @@
return -EINVAL;
if (vw.clipcount)
return -EINVAL;
- if (vw.height != ov511->maxheight)
+ if (vw.height != ov->maxheight)
return -EINVAL;
- if (vw.width != ov511->maxwidth)
+ if (vw.width != ov->maxwidth)
return -EINVAL;
#endif
/* If we're collecting previous frame wait
before changing modes */
- interruptible_sleep_on(&ov511->wq);
+ interruptible_sleep_on(&ov->wq);
if (signal_pending(current)) return -EINTR;
- result = mode_init_regs(ov511, vw.width, vw.height,
- ov511->frame[0].format, ov511->sub_flag);
+ result = mode_init_regs(ov, vw.width, vw.height,
+ ov->frame[0].format, ov->sub_flag);
if (result < 0)
return result;
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].width = vw.width;
- ov511->frame[i].height = vw.height;
+ ov->frame[i].width = vw.width;
+ ov->frame[i].height = vw.height;
}
return 0;
@@ -5075,8 +5006,8 @@
memset(&vw, 0, sizeof(vw));
vw.x = 0; /* FIXME */
vw.y = 0;
- vw.width = ov511->frame[0].width;
- vw.height = ov511->frame[0].height;
+ vw.width = ov->frame[0].width;
+ vw.height = ov->frame[0].height;
vw.flags = 30;
PDEBUG(4, "VIDIOCGWIN: %dx%d", vw.width, vw.height);
@@ -5095,13 +5026,13 @@
memset(&vm, 0, sizeof(vm));
vm.size = OV511_NUMFRAMES
- * MAX_DATA_SIZE(ov511->maxwidth, ov511->maxheight);
+ * MAX_DATA_SIZE(ov->maxwidth, ov->maxheight);
vm.frames = OV511_NUMFRAMES;
vm.offsets[0] = 0;
for (i = 1; i < OV511_NUMFRAMES; i++) {
vm.offsets[i] = vm.offsets[i-1]
- + MAX_DATA_SIZE(ov511->maxwidth, ov511->maxheight);
+ + MAX_DATA_SIZE(ov->maxwidth, ov->maxheight);
}
if (copy_to_user((void *)arg, (void *)&vm, sizeof(vm)))
@@ -5121,7 +5052,7 @@
PDEBUG(4, "frame: %d, size: %dx%d, format: %d",
vm.frame, vm.width, vm.height, vm.format);
- depth = ov511_get_depth(vm.format);
+ depth = get_depth(vm.format);
if (!depth) {
err("VIDIOCMCAPTURE: invalid format (%d)", vm.format);
return -EINVAL;
@@ -5132,13 +5063,13 @@
return -EINVAL;
}
- if (vm.width > ov511->maxwidth
- || vm.height > ov511->maxheight) {
+ if (vm.width > ov->maxwidth
+ || vm.height > ov->maxheight) {
err("VIDIOCMCAPTURE: requested dimensions too big");
return -EINVAL;
}
- if (ov511->frame[vm.frame].grabstate == FRAME_GRABBING) {
+ if (ov->frame[vm.frame].grabstate == FRAME_GRABBING) {
PDEBUG(4, "VIDIOCMCAPTURE: already grabbing");
return -EBUSY;
}
@@ -5148,38 +5079,38 @@
return -EINVAL;
}
- if ((ov511->frame[vm.frame].width != vm.width) ||
- (ov511->frame[vm.frame].height != vm.height) ||
- (ov511->frame[vm.frame].format != vm.format) ||
- (ov511->frame[vm.frame].sub_flag != ov511->sub_flag) ||
- (ov511->frame[vm.frame].depth != depth)) {
+ if ((ov->frame[vm.frame].width != vm.width) ||
+ (ov->frame[vm.frame].height != vm.height) ||
+ (ov->frame[vm.frame].format != vm.format) ||
+ (ov->frame[vm.frame].sub_flag != ov->sub_flag) ||
+ (ov->frame[vm.frame].depth != depth)) {
PDEBUG(4, "VIDIOCMCAPTURE: change in image parameters");
/* If we're collecting previous frame wait
before changing modes */
- interruptible_sleep_on(&ov511->wq);
+ interruptible_sleep_on(&ov->wq);
if (signal_pending(current)) return -EINTR;
- ret = mode_init_regs(ov511, vm.width, vm.height,
- vm.format, ov511->sub_flag);
+ ret = mode_init_regs(ov, vm.width, vm.height,
+ vm.format, ov->sub_flag);
#if 0
if (ret < 0) {
PDEBUG(1, "Got error while initializing regs ");
return ret;
}
#endif
- ov511->frame[vm.frame].width = vm.width;
- ov511->frame[vm.frame].height = vm.height;
- ov511->frame[vm.frame].format = vm.format;
- ov511->frame[vm.frame].sub_flag = ov511->sub_flag;
- ov511->frame[vm.frame].depth = depth;
+ ov->frame[vm.frame].width = vm.width;
+ ov->frame[vm.frame].height = vm.height;
+ ov->frame[vm.frame].format = vm.format;
+ ov->frame[vm.frame].sub_flag = ov->sub_flag;
+ ov->frame[vm.frame].depth = depth;
}
/* Mark it as ready */
- ov511->frame[vm.frame].grabstate = FRAME_READY;
+ ov->frame[vm.frame].grabstate = FRAME_READY;
PDEBUG(4, "VIDIOCMCAPTURE: renewing frame %d", vm.frame);
- return ov511_new_frame(ov511, vm.frame);
+ return ov51x_new_frame(ov, vm.frame);
}
case VIDIOCSYNC:
{
@@ -5194,7 +5125,7 @@
return -EINVAL;
}
- frame = &ov511->frame[fnum];
+ frame = &ov->frame[fnum];
PDEBUG(4, "syncing to frame %d, grabstate = %d", fnum,
frame->grabstate);
@@ -5206,7 +5137,7 @@
case FRAME_GRABBING:
case FRAME_ERROR:
redo:
- if (!ov511->dev)
+ if (!ov->dev)
return -EIO;
rc = wait_event_interruptible(frame->wq,
@@ -5219,15 +5150,15 @@
if (frame->grabstate == FRAME_ERROR) {
int ret;
- if ((ret = ov511_new_frame(ov511, fnum)) < 0)
+ if ((ret = ov51x_new_frame(ov, fnum)) < 0)
return ret;
goto redo;
}
/* Fall through */
case FRAME_DONE:
- if (ov511->snap_enabled && !frame->snapshot) {
+ if (ov->snap_enabled && !frame->snapshot) {
int ret;
- if ((ret = ov511_new_frame(ov511, fnum)) < 0)
+ if ((ret = ov51x_new_frame(ov, fnum)) < 0)
return ret;
goto redo;
}
@@ -5236,13 +5167,13 @@
/* Reset the hardware snapshot button */
/* FIXME - Is this the best place for this? */
- if ((ov511->snap_enabled) && (frame->snapshot)) {
+ if ((ov->snap_enabled) && (frame->snapshot)) {
frame->snapshot = 0;
- ov51x_clear_snapshot(ov511);
+ ov51x_clear_snapshot(ov);
}
/* Decompression, format conversion, etc... */
- ov511_postprocess(ov511, frame);
+ ov51x_postprocess(ov, frame);
break;
} /* end switch */
@@ -5271,7 +5202,7 @@
memset(&vu, 0, sizeof(vu));
- vu.video = ov511->vdev.minor; /* Video minor */
+ vu.video = ov->vdev.minor; /* Video minor */
vu.vbi = VIDEO_NO_UNIT; /* VBI minor */
vu.radio = VIDEO_NO_UNIT; /* Radio minor */
vu.audio = VIDEO_NO_UNIT; /* Audio minor */
@@ -5291,7 +5222,7 @@
if (copy_from_user(&v, arg, sizeof(v)))
return -EFAULT;
- if (!ov511->has_tuner || v.tuner) // Only tuner 0
+ if (!ov->has_tuner || v.tuner) // Only tuner 0
return -EINVAL;
strcpy(v.name, "Television");
@@ -5305,7 +5236,7 @@
v.mode = 0; /* FIXME: Not sure what this is yet */
v.signal = 0xFFFF; /* unknown */
- call_i2c_clients(ov511, cmd, &v);
+ call_i2c_clients(ov, cmd, &v);
if (copy_to_user(arg, &v, sizeof(v)))
return -EFAULT;
@@ -5323,7 +5254,7 @@
return -EFAULT;
/* Only no or one tuner for now */
- if (!ov511->has_tuner || v.tuner)
+ if (!ov->has_tuner || v.tuner)
return -EINVAL;
/* and it only has certain valid modes */
@@ -5332,21 +5263,21 @@
v.mode != VIDEO_MODE_SECAM) return -EOPNOTSUPP;
/* Is this right/necessary? */
- err = decoder_set_norm(ov511, v.mode);
+ err = decoder_set_norm(ov, v.mode);
if (err)
return err;
- call_i2c_clients(ov511, cmd, &v);
+ call_i2c_clients(ov, cmd, &v);
return 0;
}
case VIDIOCGFREQ:
{
- unsigned long v = ov511->freq;
+ unsigned long v = ov->freq;
PDEBUG(4, "VIDIOCGFREQ");
- if (!ov511->has_tuner)
+ if (!ov->has_tuner)
return -EINVAL;
#if 0
/* FIXME: this is necessary for testing */
@@ -5361,7 +5292,7 @@
{
unsigned long v;
- if (!ov511->has_tuner)
+ if (!ov->has_tuner)
return -EINVAL;
if (copy_from_user(&v, arg, sizeof(v)))
@@ -5369,8 +5300,8 @@
PDEBUG(4, "VIDIOCSFREQ: %lx", v);
- ov511->freq = v;
- call_i2c_clients(ov511, cmd, &v);
+ ov->freq = v;
+ call_i2c_clients(ov, cmd, &v);
return 0;
}
@@ -5389,29 +5320,29 @@
}
static int
-ov511_ioctl(struct video_device *vdev, unsigned int cmd, void *arg)
+ov51x_v4l1_ioctl(struct video_device *vdev, unsigned int cmd, void *arg)
{
int rc;
- struct usb_ov511 *ov511 = vdev->priv;
+ struct usb_ov511 *ov = vdev->priv;
- if (down_interruptible(&ov511->lock))
+ if (down_interruptible(&ov->lock))
return -EINTR;
- rc = ov511_ioctl_internal(vdev, cmd, arg);
+ rc = ov51x_v4l1_ioctl_internal(vdev, cmd, arg);
- up(&ov511->lock);
+ up(&ov->lock);
return rc;
}
static inline long
-ov511_read(struct video_device *vdev, char *buf, unsigned long count,
- int noblock)
+ov51x_v4l1_read(struct video_device *vdev, char *buf, unsigned long count,
+ int noblock)
{
- struct usb_ov511 *ov511 = vdev->priv;
+ struct usb_ov511 *ov = vdev->priv;
int i, rc = 0, frmx = -1;
struct ov511_frame *frame;
- if (down_interruptible(&ov511->lock))
+ if (down_interruptible(&ov->lock))
return -EINTR;
PDEBUG(4, "%ld bytes, noblock=%d", count, noblock);
@@ -5421,16 +5352,16 @@
goto error;
}
- if (!ov511->dev) {
+ if (!ov->dev) {
rc = -EIO;
goto error;
}
// FIXME: Only supports two frames
/* See if a frame is completed, then use it. */
- if (ov511->frame[0].grabstate >= FRAME_DONE) /* _DONE or _ERROR */
+ if (ov->frame[0].grabstate >= FRAME_DONE) /* _DONE or _ERROR */
frmx = 0;
- else if (ov511->frame[1].grabstate >= FRAME_DONE)/* _DONE or _ERROR */
+ else if (ov->frame[1].grabstate >= FRAME_DONE)/* _DONE or _ERROR */
frmx = 1;
/* If nonblocking we return immediately */
@@ -5442,24 +5373,24 @@
/* If no FRAME_DONE, look for a FRAME_GRABBING state. */
/* See if a frame is in process (grabbing), then use it. */
if (frmx == -1) {
- if (ov511->frame[0].grabstate == FRAME_GRABBING)
+ if (ov->frame[0].grabstate == FRAME_GRABBING)
frmx = 0;
- else if (ov511->frame[1].grabstate == FRAME_GRABBING)
+ else if (ov->frame[1].grabstate == FRAME_GRABBING)
frmx = 1;
}
/* If no frame is active, start one. */
if (frmx == -1) {
- if ((rc = ov511_new_frame(ov511, frmx = 0))) {
- err("read: ov511_new_frame error");
+ if ((rc = ov51x_new_frame(ov, frmx = 0))) {
+ err("read: ov51x_new_frame error");
goto error;
}
}
- frame = &ov511->frame[frmx];
+ frame = &ov->frame[frmx];
restart:
- if (!ov511->dev) {
+ if (!ov->dev) {
rc = -EIO;
goto error;
}
@@ -5478,9 +5409,9 @@
if (frame->grabstate == FRAME_ERROR) {
frame->bytes_read = 0;
- err("** ick! ** Errored frame %d", ov511->curframe);
- if (ov511_new_frame(ov511, frmx)) {
- err("read: ov511_new_frame error");
+ err("** ick! ** Errored frame %d", ov->curframe);
+ if (ov51x_new_frame(ov, frmx)) {
+ err("read: ov51x_new_frame error");
goto error;
}
goto restart;
@@ -5488,25 +5419,25 @@
/* Repeat until we get a snapshot frame */
- if (ov511->snap_enabled)
+ if (ov->snap_enabled)
PDEBUG(4, "Waiting snapshot frame");
- if (ov511->snap_enabled && !frame->snapshot) {
+ if (ov->snap_enabled && !frame->snapshot) {
frame->bytes_read = 0;
- if ((rc = ov511_new_frame(ov511, frmx))) {
- err("read: ov511_new_frame error");
+ if ((rc = ov51x_new_frame(ov, frmx))) {
+ err("read: ov51x_new_frame error");
goto error;
}
goto restart;
}
/* Clear the snapshot */
- if (ov511->snap_enabled && frame->snapshot) {
+ if (ov->snap_enabled && frame->snapshot) {
frame->snapshot = 0;
- ov51x_clear_snapshot(ov511);
+ ov51x_clear_snapshot(ov);
}
/* Decompression, format conversion, etc... */
- ov511_postprocess(ov511, frame);
+ ov51x_postprocess(ov, frame);
PDEBUG(4, "frmx=%d, bytes_read=%ld, length=%ld", frmx,
frame->bytes_read,
@@ -5538,48 +5469,48 @@
// FIXME: Only supports two frames
/* Mark it as available to be used again. */
- ov511->frame[frmx].grabstate = FRAME_UNUSED;
- if ((rc = ov511_new_frame(ov511, !frmx))) {
- err("ov511_new_frame returned error");
+ ov->frame[frmx].grabstate = FRAME_UNUSED;
+ if ((rc = ov51x_new_frame(ov, !frmx))) {
+ err("ov51x_new_frame returned error");
goto error;
}
}
PDEBUG(4, "read finished, returning %ld (sweet)", count);
- up(&ov511->lock);
+ up(&ov->lock);
return count;
error:
- up(&ov511->lock);
+ up(&ov->lock);
return rc;
}
static int
-ov511_mmap(struct video_device *vdev, const char *adr, unsigned long size)
+ov51x_v4l1_mmap(struct video_device *vdev, const char *adr, unsigned long size)
{
- struct usb_ov511 *ov511 = vdev->priv;
+ struct usb_ov511 *ov = vdev->priv;
unsigned long start = (unsigned long)adr;
unsigned long page, pos;
- if (ov511->dev == NULL)
+ if (ov->dev == NULL)
return -EIO;
PDEBUG(4, "mmap: %ld (%lX) bytes", size, size);
if (size > (((OV511_NUMFRAMES
- * MAX_DATA_SIZE(ov511->maxwidth, ov511->maxheight)
+ * MAX_DATA_SIZE(ov->maxwidth, ov->maxheight)
+ PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))))
return -EINVAL;
- if (down_interruptible(&ov511->lock))
+ if (down_interruptible(&ov->lock))
return -EINTR;
- pos = (unsigned long)ov511->fbuf;
+ pos = (unsigned long)ov->fbuf;
while (size > 0) {
page = kvirt_to_pa(pos);
if (remap_page_range(start, page, PAGE_SIZE, PAGE_SHARED)) {
- up(&ov511->lock);
+ up(&ov->lock);
return -EAGAIN;
}
start += PAGE_SIZE;
@@ -5590,43 +5521,42 @@
size = 0;
}
- up(&ov511->lock);
+ up(&ov->lock);
return 0;
}
-static struct video_device ov511_template = {
+static struct video_device vdev_template = {
owner: THIS_MODULE,
name: "OV511 USB Camera",
type: VID_TYPE_CAPTURE,
hardware: VID_HARDWARE_OV511,
- open: ov511_open,
- close: ov511_close,
- read: ov511_read,
- write: ov511_write,
- ioctl: ov511_ioctl,
- mmap: ov511_mmap,
- initialize: ov511_init_done,
+ open: ov51x_v4l1_open,
+ close: ov51x_v4l1_close,
+ read: ov51x_v4l1_read,
+ write: ov51x_v4l1_write,
+ ioctl: ov51x_v4l1_ioctl,
+ mmap: ov51x_v4l1_mmap,
+ initialize: ov51x_v4l1_init_done,
};
#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
static int
-ov511_control_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
+ov51x_control_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long ularg)
{
- struct proc_dir_entry *pde;
- struct usb_ov511 *ov511;
+ struct proc_dir_entry *pde = inode->u.generic_ip;
+ struct usb_ov511 *ov;
void *arg = (void *) ularg;
int rc;
- pde = (struct proc_dir_entry *) inode->u.generic_ip;
if (!pde)
return -ENOENT;
- ov511 = (struct usb_ov511 *) pde->data;
- if (!ov511)
+ ov = pde->data;
+ if (!ov)
return -ENODEV;
- if (!ov511->dev)
+ if (!ov->dev)
return -EIO;
/* Should we pass through standard V4L IOCTLs? */
@@ -5651,19 +5581,19 @@
switch (opt.optnum) {
case OV511_USOPT_BRIGHT:
- rc = sensor_get_brightness(ov511, &(opt.val));
+ rc = sensor_get_brightness(ov, &(opt.val));
if (rc) return rc;
break;
case OV511_USOPT_SAT:
- rc = sensor_get_saturation(ov511, &(opt.val));
+ rc = sensor_get_saturation(ov, &(opt.val));
if (rc) return rc;
break;
case OV511_USOPT_HUE:
- rc = sensor_get_hue(ov511, &(opt.val));
+ rc = sensor_get_hue(ov, &(opt.val));
if (rc) return rc;
break;
case OV511_USOPT_CONTRAST:
- rc = sensor_get_contrast(ov511, &(opt.val));
+ rc = sensor_get_contrast(ov, &(opt.val));
if (rc) return rc;
break;
default:
@@ -5685,19 +5615,19 @@
switch (opt.optnum) {
case OV511_USOPT_BRIGHT:
- rc = sensor_set_brightness(ov511, opt.val);
+ rc = sensor_set_brightness(ov, opt.val);
if (rc) return rc;
break;
case OV511_USOPT_SAT:
- rc = sensor_set_saturation(ov511, opt.val);
+ rc = sensor_set_saturation(ov, opt.val);
if (rc) return rc;
break;
case OV511_USOPT_HUE:
- rc = sensor_set_hue(ov511, opt.val);
+ rc = sensor_set_hue(ov, opt.val);
if (rc) return rc;
break;
case OV511_USOPT_CONTRAST:
- rc = sensor_set_contrast(ov511, opt.val);
+ rc = sensor_set_contrast(ov, opt.val);
if (rc) return rc;
break;
default:
@@ -5716,19 +5646,19 @@
switch (opt.optnum) {
case OV511_UIOPT_POWER_FREQ:
- opt.val = ov511->lightfreq;
+ opt.val = ov->lightfreq;
break;
case OV511_UIOPT_BFILTER:
- opt.val = ov511->bandfilt;
+ opt.val = ov->bandfilt;
break;
case OV511_UIOPT_LED:
- opt.val = ov511->led_policy;
+ opt.val = ov->led_policy;
break;
case OV511_UIOPT_DEBUG:
opt.val = debug;
break;
case OV511_UIOPT_COMPRESS:
- opt.val = ov511->compress;
+ opt.val = ov->compress;
break;
default:
err("Invalid get int option number");
@@ -5749,20 +5679,20 @@
switch (opt.optnum) {
case OV511_UIOPT_POWER_FREQ:
- rc = sensor_set_light_freq(ov511, opt.val);
+ rc = sensor_set_light_freq(ov, opt.val);
if (rc) return rc;
break;
case OV511_UIOPT_BFILTER:
- rc = sensor_set_banding_filter(ov511, opt.val);
+ rc = sensor_set_banding_filter(ov, opt.val);
if (rc) return rc;
break;
case OV511_UIOPT_LED:
if (opt.val <= 2) {
- ov511->led_policy = opt.val;
- if (ov511->led_policy == LED_OFF)
- ov51x_led_control(ov511, 0);
- else if (ov511->led_policy == LED_ON)
- ov51x_led_control(ov511, 1);
+ ov->led_policy = opt.val;
+ if (ov->led_policy == LED_OFF)
+ ov51x_led_control(ov, 0);
+ else if (ov->led_policy == LED_ON)
+ ov51x_led_control(ov, 1);
} else {
return -EINVAL;
}
@@ -5774,14 +5704,12 @@
return -EINVAL;
break;
case OV511_UIOPT_COMPRESS:
- ov511->compress = opt.val;
- if (ov511->compress) {
- if (ov511->bridge == BRG_OV511 ||
- ov511->bridge == BRG_OV511PLUS)
- ov511_init_compression(ov511);
- else if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS)
- ov518_init_compression(ov511);
+ ov->compress = opt.val;
+ if (ov->compress) {
+ if (ov->bclass == BCL_OV511)
+ ov511_init_compression(ov);
+ else if (ov->bclass == BCL_OV518)
+ ov518_init_compression(ov);
}
break;
default:
@@ -5798,7 +5726,7 @@
if (copy_from_user(&w, arg, sizeof(w)))
return -EFAULT;
- return ov51x_i2c_write_slave(ov511, w.slave, w.reg, w.value,
+ return i2c_w_slave(ov, w.slave, w.reg, w.value,
w.mask);
}
case OV511IOC_RI2C:
@@ -5808,7 +5736,7 @@
if (copy_from_user(&r, arg, sizeof(r)))
return -EFAULT;
- rc = ov51x_i2c_read_slave(ov511, r.slave, r.reg);
+ rc = i2c_r_slave(ov, r.slave, r.reg);
if (rc < 0)
return rc;
@@ -5837,7 +5765,7 @@
* the same register settings as the OV7610, since they are very similar.
*/
static int
-ov7xx0_configure(struct usb_ov511 *ov511)
+ov7xx0_configure(struct usb_ov511 *ov)
{
int i, success;
int rc;
@@ -5954,16 +5882,15 @@
PDEBUG(4, "starting configuration");
/* This looks redundant, but is necessary for WebCam 3 */
- ov511->primary_i2c_slave = OV7xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV7xx0_I2C_WRITE_ID,
- OV7xx0_I2C_READ_ID) < 0)
+ ov->primary_i2c_slave = OV7xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV7xx0_SID) < 0)
return -1;
- if (ov51x_init_ov_sensor(ov511) >= 0) {
+ if (init_ov_sensor(ov) >= 0) {
PDEBUG(1, "OV7xx0 sensor initalized (method 1)");
} else {
/* Reset the 76xx */
- if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -1;
+ if (i2c_w(ov, 0x12, 0x80) < 0) return -1;
/* Wait for it to initialize */
schedule_timeout(1 + 150 * HZ / 1000);
@@ -5971,10 +5898,8 @@
i = 0;
success = 0;
while (i <= i2c_detect_tries) {
- if ((ov51x_i2c_read(ov511,
- OV7610_REG_ID_HIGH) == 0x7F) &&
- (ov51x_i2c_read(ov511,
- OV7610_REG_ID_LOW) == 0xA2)) {
+ if ((i2c_r(ov, OV7610_REG_ID_HIGH) == 0x7F) &&
+ (i2c_r(ov, OV7610_REG_ID_LOW) == 0xA2)) {
success = 1;
break;
} else {
@@ -5998,17 +5923,17 @@
}
/* Detect sensor (sub)type */
- rc = ov51x_i2c_read(ov511, OV7610_REG_COM_I);
+ rc = i2c_r(ov, OV7610_REG_COM_I);
if (rc < 0) {
err("Error detecting sensor type");
return -1;
} else if ((rc & 3) == 3) {
info("Sensor is an OV7610");
- ov511->sensor = SEN_OV7610;
+ ov->sensor = SEN_OV7610;
} else if ((rc & 3) == 1) {
/* I don't know what's different about the 76BE yet */
- if (ov51x_i2c_read(ov511, 0x15) & 1)
+ if (i2c_r(ov, 0x15) & 1)
info("Sensor is an OV7620AE");
else
info("Sensor is an OV76BE");
@@ -6016,48 +5941,48 @@
/* OV511+ will return all zero isoc data unless we
* configure the sensor as a 7620. Someone needs to
* find the exact reg. setting that causes this. */
- if (ov511->bridge == BRG_OV511PLUS) {
+ if (ov->bridge == BRG_OV511PLUS) {
info("Enabling 511+/7620AE workaround");
- ov511->sensor = SEN_OV7620;
+ ov->sensor = SEN_OV7620;
} else {
- ov511->sensor = SEN_OV7620AE;
+ ov->sensor = SEN_OV7620AE;
}
} else if ((rc & 3) == 0) {
info("Sensor is an OV7620");
- ov511->sensor = SEN_OV7620;
+ ov->sensor = SEN_OV7620;
} else {
err("Unknown image sensor version: %d", rc & 3);
return -1;
}
- if (ov511->sensor == SEN_OV7620) {
+ if (ov->sensor == SEN_OV7620) {
PDEBUG(4, "Writing 7620 registers");
- if (ov511_write_regvals(ov511, aRegvalsNorm7620))
+ if (write_regvals(ov, aRegvalsNorm7620))
return -1;
} else {
PDEBUG(4, "Writing 7610 registers");
- if (ov511_write_regvals(ov511, aRegvalsNorm7610))
+ if (write_regvals(ov, aRegvalsNorm7610))
return -1;
}
/* Set sensor-specific vars */
- ov511->maxwidth = 640;
- ov511->maxheight = 480;
- ov511->minwidth = 64;
- ov511->minheight = 48;
+ ov->maxwidth = 640;
+ ov->maxheight = 480;
+ ov->minwidth = 64;
+ ov->minheight = 48;
// FIXME: These do not match the actual settings yet
- ov511->brightness = 0x80 << 8;
- ov511->contrast = 0x80 << 8;
- ov511->colour = 0x80 << 8;
- ov511->hue = 0x80 << 8;
+ ov->brightness = 0x80 << 8;
+ ov->contrast = 0x80 << 8;
+ ov->colour = 0x80 << 8;
+ ov->hue = 0x80 << 8;
return 0;
}
/* This initializes the OV6620, OV6630, OV6630AE, or OV6630AF sensor. */
static int
-ov6xx0_configure(struct usb_ov511 *ov511)
+ov6xx0_configure(struct usb_ov511 *ov)
{
int rc;
@@ -6183,7 +6108,7 @@
PDEBUG(4, "starting sensor configuration");
- if (ov51x_init_ov_sensor(ov511) < 0) {
+ 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);
return -1;
@@ -6192,50 +6117,44 @@
}
/* Detect sensor (sub)type */
- rc = ov51x_i2c_read(ov511, OV7610_REG_COM_I);
+ rc = i2c_r(ov, OV7610_REG_COM_I);
if (rc < 0) {
err("Error detecting sensor type");
return -1;
} else if ((rc & 3) == 0) {
info("Sensor is an OV6630");
- ov511->sensor = SEN_OV6630;
+ ov->sensor = SEN_OV6630;
} else if ((rc & 3) == 1) {
info("Sensor is an OV6620");
- ov511->sensor = SEN_OV6620;
+ ov->sensor = SEN_OV6620;
} else if ((rc & 3) == 2) {
info("Sensor is an OV6630AE");
- ov511->sensor = SEN_OV6630;
+ ov->sensor = SEN_OV6630;
} else if ((rc & 3) == 3) {
info("Sensor is an OV6630AF");
- ov511->sensor = SEN_OV6630;
+ ov->sensor = SEN_OV6630;
}
/* Set sensor-specific vars */
- if (ov511->sensor == SEN_OV6620) {
- ov511->maxwidth = 352;
- ov511->maxheight = 288;
- } else {
- /* 352x288 not working with OV518 yet */
- ov511->maxwidth = 320;
- ov511->maxheight = 240;
- }
- ov511->minwidth = 64;
- ov511->minheight = 48;
+ ov->maxwidth = 352;
+ ov->maxheight = 288;
+ ov->minwidth = 64;
+ ov->minheight = 48;
// FIXME: These do not match the actual settings yet
- ov511->brightness = 0x80 << 8;
- ov511->contrast = 0x80 << 8;
- ov511->colour = 0x80 << 8;
- ov511->hue = 0x80 << 8;
+ ov->brightness = 0x80 << 8;
+ ov->contrast = 0x80 << 8;
+ ov->colour = 0x80 << 8;
+ ov->hue = 0x80 << 8;
- if (ov511->sensor == SEN_OV6620) {
+ if (ov->sensor == SEN_OV6620) {
PDEBUG(4, "Writing 6x20 registers");
- if (ov511_write_regvals(ov511, aRegvalsNorm6x20))
+ if (write_regvals(ov, aRegvalsNorm6x20))
return -1;
} else {
PDEBUG(4, "Writing 6x30 registers");
- if (ov511_write_regvals(ov511, aRegvalsNorm6x30))
+ if (write_regvals(ov, aRegvalsNorm6x30))
return -1;
}
@@ -6244,13 +6163,13 @@
/* This initializes the KS0127 and KS0127B video decoders. */
static int
-ks0127_configure(struct usb_ov511 *ov511)
+ks0127_configure(struct usb_ov511 *ov)
{
int rc;
// FIXME: I don't know how to sync or reset it yet
#if 0
- if (ov51x_init_ks_sensor(ov511) < 0) {
+ if (ov51x_init_ks_sensor(ov) < 0) {
err("Failed to initialize the KS0127");
return -1;
} else {
@@ -6259,21 +6178,21 @@
#endif
/* Detect decoder subtype */
- rc = ov51x_i2c_read(ov511, 0x00);
+ rc = i2c_r(ov, 0x00);
if (rc < 0) {
err("Error detecting sensor type");
return -1;
} else if (rc & 0x08) {
- rc = ov51x_i2c_read(ov511, 0x3d);
+ rc = i2c_r(ov, 0x3d);
if (rc < 0) {
err("Error detecting sensor type");
return -1;
} else if ((rc & 0x0f) == 0) {
info("Sensor is a KS0127");
- ov511->sensor = SEN_KS0127;
+ ov->sensor = SEN_KS0127;
} else if ((rc & 0x0f) == 9) {
info("Sensor is a KS0127B Rev. A");
- ov511->sensor = SEN_KS0127B;
+ ov->sensor = SEN_KS0127B;
}
} else {
err("Error: Sensor is an unsupported KS0122");
@@ -6281,16 +6200,16 @@
}
/* Set sensor-specific vars */
- ov511->maxwidth = 640;
- ov511->maxheight = 480;
- ov511->minwidth = 64;
- ov511->minheight = 48;
+ ov->maxwidth = 640;
+ ov->maxheight = 480;
+ ov->minwidth = 64;
+ ov->minheight = 48;
// FIXME: These do not match the actual settings yet
- ov511->brightness = 0x80 << 8;
- ov511->contrast = 0x80 << 8;
- ov511->colour = 0x80 << 8;
- ov511->hue = 0x80 << 8;
+ ov->brightness = 0x80 << 8;
+ ov->contrast = 0x80 << 8;
+ ov->colour = 0x80 << 8;
+ ov->hue = 0x80 << 8;
/* This device is not supported yet. Bail out now... */
err("This sensor is not supported yet.");
@@ -6303,7 +6222,6 @@
static int
saa7111a_configure(struct usb_ov511 *ov511)
{
- struct usb_device *dev = ov511->dev;
int rc;
/* Since there is no register reset command, all registers must be
@@ -6338,7 +6256,7 @@
// FIXME: I don't know how to sync or reset it yet
#if 0
- if (ov51x_init_saa_sensor(ov511) < 0) {
+ if (ov51x_init_saa_sensor(ov) < 0) {
err("Failed to initialize the SAA7111A");
return -1;
} else {
@@ -6365,12 +6283,12 @@
ov511->hue = 32768;
PDEBUG(4, "Writing SAA7111A registers");
- if (ov511_write_regvals(ov511, aRegvalsNormSAA7111A))
+ if (write_regvals(ov511, aRegvalsNormSAA7111A))
return -1;
/* Detect version of decoder. This must be done after writing the
* initial regs or the decoder will lock up. */
- rc = ov51x_i2c_read(ov511, 0x00);
+ rc = i2c_r(ov511, 0x00);
if (rc < 0) {
err("Error detecting sensor version");
@@ -6383,8 +6301,8 @@
// FIXME: Fix this for OV518(+)
/* Latch to negative edge of clock. Otherwise, we get incorrect
* colors and jitter in the digital signal. */
- if (ov511->bridge == BRG_OV511 || ov511->bridge == BRG_OV511PLUS)
- ov511_reg_write(dev, 0x11, 0x00);
+ if (ov511->bclass == BCL_OV511)
+ reg_w(ov511, 0x11, 0x00);
else
warn("SAA7111A not yet supported with OV518/OV518+");
@@ -6393,144 +6311,138 @@
/* This initializes the OV511/OV511+ and the sensor */
static int
-ov511_configure(struct usb_ov511 *ov511)
+ov511_configure(struct usb_ov511 *ov)
{
- struct usb_device *dev = ov511->dev;
int i;
static struct ov511_regvals aRegvalsInit511[] = {
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x7f },
- { OV511_REG_BUS, OV511_REG_SYSTEM_INIT, 0x01 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x7f },
- { OV511_REG_BUS, OV511_REG_SYSTEM_INIT, 0x01 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x3f },
- { OV511_REG_BUS, OV511_REG_SYSTEM_INIT, 0x01 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x3d },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x7f },
+ { OV511_REG_BUS, R51x_SYS_INIT, 0x01 },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x7f },
+ { OV511_REG_BUS, R51x_SYS_INIT, 0x01 },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x3f },
+ { OV511_REG_BUS, R51x_SYS_INIT, 0x01 },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x3d },
{ OV511_DONE_BUS, 0x0, 0x00},
};
static struct ov511_regvals aRegvalsNorm511[] = {
- { OV511_REG_BUS, OV511_REG_DRAM_ENABLE_FLOW_CONTROL, 0x01 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_SNAPSHOT, 0x01 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_SNAPSHOT, 0x03 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_SNAPSHOT, 0x01 },
- { OV511_REG_BUS, OV511_REG_FIFO_BITMASK, 0x1f },
- { OV511_REG_BUS, OV511_OMNICE_ENABLE, 0x00 },
- { OV511_REG_BUS, OV511_OMNICE_LUT_ENABLE, 0x03 },
+ { OV511_REG_BUS, R511_DRAM_FLOW_CTL, 0x01 },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x01 },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x03 },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x01 },
+ { OV511_REG_BUS, R511_FIFO_OPTS, 0x1f },
+ { OV511_REG_BUS, R511_COMP_EN, 0x00 },
+ { OV511_REG_BUS, R511_COMP_LUT_EN, 0x03 },
{ OV511_DONE_BUS, 0x0, 0x00 },
};
static struct ov511_regvals aRegvalsNorm511Plus[] = {
- { OV511_REG_BUS, OV511_REG_DRAM_ENABLE_FLOW_CONTROL, 0xff },
- { OV511_REG_BUS, OV511_REG_SYSTEM_SNAPSHOT, 0x01 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_SNAPSHOT, 0x03 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_SNAPSHOT, 0x01 },
- { OV511_REG_BUS, OV511_REG_FIFO_BITMASK, 0xff },
- { OV511_REG_BUS, OV511_OMNICE_ENABLE, 0x00 },
- { OV511_REG_BUS, OV511_OMNICE_LUT_ENABLE, 0x03 },
+ { OV511_REG_BUS, R511_DRAM_FLOW_CTL, 0xff },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x01 },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x03 },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x01 },
+ { OV511_REG_BUS, R511_FIFO_OPTS, 0xff },
+ { OV511_REG_BUS, R511_COMP_EN, 0x00 },
+ { OV511_REG_BUS, R511_COMP_LUT_EN, 0x03 },
{ OV511_DONE_BUS, 0x0, 0x00 },
};
PDEBUG(4, "");
- ov511->customid = ov511_reg_read(dev, OV511_REG_SYSTEM_CUSTOM_ID);
- if (ov511->customid < 0) {
+ ov->customid = reg_r(ov, R511_SYS_CUST_ID);
+ if (ov->customid < 0) {
err("Unable to read camera bridge registers");
goto error;
}
- ov511->desc = -1;
- PDEBUG (1, "CustomID = %d", ov511->customid);
+ ov->desc = -1;
+ PDEBUG (1, "CustomID = %d", ov->customid);
for (i = 0; clist[i].id >= 0; i++) {
- if (ov511->customid == clist[i].id) {
+ if (ov->customid == clist[i].id) {
info("model: %s", clist[i].description);
- ov511->desc = i;
+ ov->desc = i;
break;
}
}
if (clist[i].id == -1) {
- err("Camera type (%d) not recognized", ov511->customid);
+ err("Camera type (%d) not recognized", ov->customid);
err("Please notify " EMAIL " of the name,");
err("manufacturer, model, and this number of your camera.");
err("Also include the output of the detection process.");
}
if (clist[i].id == 6) { /* USB Life TV (NTSC) */
- ov511->tuner_type = 8; /* Temic 4036FY5 3X 1981 */
+ ov->tuner_type = 8; /* Temic 4036FY5 3X 1981 */
}
- if (ov511_write_regvals(ov511, aRegvalsInit511)) goto error;
+ if (write_regvals(ov, aRegvalsInit511)) goto error;
- if (ov511->led_policy == LED_OFF || ov511->led_policy == LED_AUTO)
- ov51x_led_control(ov511, 0);
+ if (ov->led_policy == LED_OFF || ov->led_policy == LED_AUTO)
+ ov51x_led_control(ov, 0);
/* The OV511+ has undocumented bits in the flow control register.
* Setting it to 0xff fixes the corruption with moving objects. */
- if (ov511->bridge == BRG_OV511) {
- if (ov511_write_regvals(ov511, aRegvalsNorm511)) goto error;
- } else if (ov511->bridge == BRG_OV511PLUS) {
- if (ov511_write_regvals(ov511, aRegvalsNorm511Plus)) goto error;
+ if (ov->bridge == BRG_OV511) {
+ if (write_regvals(ov, aRegvalsNorm511)) goto error;
+ } else if (ov->bridge == BRG_OV511PLUS) {
+ if (write_regvals(ov, aRegvalsNorm511Plus)) goto error;
} else {
err("Invalid bridge");
}
- if (ov511_init_compression(ov511)) goto error;
+ if (ov511_init_compression(ov)) goto error;
- ov511_set_packet_size(ov511, 0);
+ ov51x_set_packet_size(ov, 0);
- ov511->snap_enabled = snapshot;
+ ov->snap_enabled = snapshot;
/* Test for 7xx0 */
PDEBUG(3, "Testing for 0V7xx0");
- ov511->primary_i2c_slave = OV7xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV7xx0_I2C_WRITE_ID,
- OV7xx0_I2C_READ_ID) < 0)
+ ov->primary_i2c_slave = OV7xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV7xx0_SID) < 0)
goto error;
- if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) {
+ if (i2c_w(ov, 0x12, 0x80) < 0) {
/* Test for 6xx0 */
PDEBUG(3, "Testing for 0V6xx0");
- ov511->primary_i2c_slave = OV6xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV6xx0_I2C_WRITE_ID,
- OV6xx0_I2C_READ_ID) < 0)
+ ov->primary_i2c_slave = OV6xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV6xx0_SID) < 0)
goto error;
- if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) {
+ if (i2c_w(ov, 0x12, 0x80) < 0) {
/* Test for 8xx0 */
PDEBUG(3, "Testing for 0V8xx0");
- ov511->primary_i2c_slave = OV8xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV8xx0_I2C_WRITE_ID,
- OV8xx0_I2C_READ_ID))
+ ov->primary_i2c_slave = OV8xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV8xx0_SID))
goto error;
- if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) {
+ if (i2c_w(ov, 0x12, 0x80) < 0) {
/* Test for SAA7111A */
PDEBUG(3, "Testing for SAA7111A");
- ov511->primary_i2c_slave = SAA7111A_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, SAA7111A_I2C_WRITE_ID,
- SAA7111A_I2C_READ_ID))
+ ov->primary_i2c_slave = SAA7111A_SID;
+ if (ov51x_set_slave_ids(ov, SAA7111A_SID))
goto error;
- if (ov51x_i2c_write(ov511, 0x0d, 0x00) < 0) {
+ if (i2c_w(ov, 0x0d, 0x00) < 0) {
/* Test for KS0127 */
PDEBUG(3, "Testing for KS0127");
- ov511->primary_i2c_slave = KS0127_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, KS0127_I2C_WRITE_ID,
- KS0127_I2C_READ_ID))
+ ov->primary_i2c_slave = KS0127_SID;
+ if (ov51x_set_slave_ids(ov, KS0127_SID))
goto error;
- if (ov51x_i2c_write(ov511, 0x10, 0x00) < 0) {
+ if (i2c_w(ov, 0x10, 0x00) < 0) {
err("Can't determine sensor slave IDs");
goto error;
} else {
- if(ks0127_configure(ov511) < 0) {
+ if (ks0127_configure(ov) < 0) {
err("Failed to configure KS0127");
goto error;
}
}
} else {
- if(saa7111a_configure(ov511) < 0) {
+ if (saa7111a_configure(ov) < 0) {
err("Failed to configure SAA7111A");
goto error;
}
@@ -6540,13 +6452,13 @@
goto error;
}
} else {
- if(ov6xx0_configure(ov511) < 0) {
+ if (ov6xx0_configure(ov) < 0) {
err("Failed to configure OV6xx0");
goto error;
}
}
} else {
- if(ov7xx0_configure(ov511) < 0) {
+ if (ov7xx0_configure(ov) < 0) {
err("Failed to configure OV7xx0");
goto error;
}
@@ -6562,96 +6474,90 @@
/* This initializes the OV518/OV518+ and the sensor */
static int
-ov518_configure(struct usb_ov511 *ov511)
+ov518_configure(struct usb_ov511 *ov)
{
- struct usb_device *dev = ov511->dev;
-
static struct ov511_regvals aRegvalsInit518[] = {
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x40 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_INIT, 0xe1 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x3e },
- { OV511_REG_BUS, OV511_REG_SYSTEM_INIT, 0xe1 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_RESET, 0x00 },
- { OV511_REG_BUS, OV511_REG_SYSTEM_INIT, 0xe1 },
- { OV511_REG_BUS, 0x46, 0x00 },
- { OV511_REG_BUS, 0x5d, 0x03 },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x40 },
+ { OV511_REG_BUS, R51x_SYS_INIT, 0xe1 },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x3e },
+ { OV511_REG_BUS, R51x_SYS_INIT, 0xe1 },
+ { OV511_REG_BUS, R51x_SYS_RESET, 0x00 },
+ { OV511_REG_BUS, R51x_SYS_INIT, 0xe1 },
+ { OV511_REG_BUS, 0x46, 0x00 },
+ { OV511_REG_BUS, 0x5d, 0x03 },
{ OV511_DONE_BUS, 0x0, 0x00},
};
/* New values, based on Windows driver. Since what they do is not
* known yet, this may be incorrect. */
static struct ov511_regvals aRegvalsNorm518[] = {
- { OV511_REG_BUS, 0x52, 0x02 }, /* Reset snapshot */
- { OV511_REG_BUS, 0x52, 0x01 }, /* Enable snapshot */
- { OV511_REG_BUS, 0x31, 0x0f },
- { OV511_REG_BUS, 0x5d, 0x03 },
- { OV511_REG_BUS, 0x24, 0x9f },
- { OV511_REG_BUS, 0x25, 0x90 },
- { OV511_REG_BUS, 0x20, 0x00 }, /* Was 0x08 */
- { OV511_REG_BUS, 0x51, 0x04 },
- { OV511_REG_BUS, 0x71, 0x19 },
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x02 }, /* Reset */
+ { OV511_REG_BUS, R51x_SYS_SNAP, 0x01 }, /* Enable */
+ { OV511_REG_BUS, 0x31, 0x0f },
+ { OV511_REG_BUS, 0x5d, 0x03 },
+ { OV511_REG_BUS, 0x24, 0x9f },
+ { OV511_REG_BUS, 0x25, 0x90 },
+ { OV511_REG_BUS, 0x20, 0x00 }, /* Was 0x08 */
+ { OV511_REG_BUS, 0x51, 0x04 },
+ { OV511_REG_BUS, 0x71, 0x19 },
{ OV511_DONE_BUS, 0x0, 0x00 },
};
PDEBUG(4, "");
/* First 5 bits of custom ID reg are a revision ID on OV518 */
- info("Device revision %d",
- 0x1F & ov511_reg_read(dev, OV511_REG_SYSTEM_CUSTOM_ID));
+ info("Device revision %d", 0x1F & reg_r(ov, R511_SYS_CUST_ID));
- if (ov511_write_regvals(ov511, aRegvalsInit518)) goto error;
+ if (write_regvals(ov, aRegvalsInit518)) goto error;
/* Set LED GPIO pin to output mode */
- if (ov511_reg_write_mask(dev, 0x57,0x00, 0x02) < 0) goto error;
+ if (reg_w_mask(ov, 0x57, 0x00, 0x02) < 0) goto error;
/* LED is off by default with OV518; have to explicitly turn it on */
- if (ov511->led_policy == LED_OFF || ov511->led_policy == LED_AUTO)
- ov51x_led_control(ov511, 0);
+ if (ov->led_policy == LED_OFF || ov->led_policy == LED_AUTO)
+ ov51x_led_control(ov, 0);
else
- ov51x_led_control(ov511, 1);
+ ov51x_led_control(ov, 1);
/* Don't require compression if dumppix is enabled; otherwise it's
* required. OV518 has no uncompressed mode, to save RAM. */
- if (!dumppix && !ov511->compress) {
- ov511->compress = 1;
+ if (!dumppix && !ov->compress) {
+ ov->compress = 1;
warn("Compression required with OV518...enabling");
}
- if (ov511_write_regvals(ov511, aRegvalsNorm518)) goto error;
+ if (write_regvals(ov, aRegvalsNorm518)) goto error;
- if (ov511_reg_write(dev, 0x2f,0x80) < 0) goto error;
+ if (reg_w(ov, 0x2f, 0x80) < 0) goto error;
- if (ov518_init_compression(ov511)) goto error;
+ if (ov518_init_compression(ov)) goto error;
- ov511_set_packet_size(ov511, 0);
+ ov51x_set_packet_size(ov, 0);
- ov511->snap_enabled = snapshot;
+ ov->snap_enabled = snapshot;
/* Test for 76xx */
- ov511->primary_i2c_slave = OV7xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV7xx0_I2C_WRITE_ID,
- OV7xx0_I2C_READ_ID) < 0)
+ ov->primary_i2c_slave = OV7xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV7xx0_SID) < 0)
goto error;
/* The OV518 must be more aggressive about sensor detection since
* I2C write will never fail if the sensor is not present. We have
* to try to initialize the sensor to detect its presence */
- if (ov51x_init_ov_sensor(ov511) < 0) {
+ if (init_ov_sensor(ov) < 0) {
/* Test for 6xx0 */
- ov511->primary_i2c_slave = OV6xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV6xx0_I2C_WRITE_ID,
- OV6xx0_I2C_READ_ID) < 0)
+ ov->primary_i2c_slave = OV6xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV6xx0_SID) < 0)
goto error;
- if (ov51x_init_ov_sensor(ov511) < 0) {
+ if (init_ov_sensor(ov) < 0) {
/* Test for 8xx0 */
- ov511->primary_i2c_slave = OV8xx0_I2C_WRITE_ID;
- if (ov51x_set_slave_ids(ov511, OV8xx0_I2C_WRITE_ID,
- OV8xx0_I2C_READ_ID) < 0)
+ ov->primary_i2c_slave = OV8xx0_SID;
+ if (ov51x_set_slave_ids(ov, OV8xx0_SID) < 0)
goto error;
- if (ov51x_init_ov_sensor(ov511) < 0) {
+ if (init_ov_sensor(ov) < 0) {
err("Can't determine sensor slave IDs");
goto error;
} else {
@@ -6659,21 +6565,25 @@
goto error;
}
} else {
- if (ov6xx0_configure(ov511) < 0) {
+ if (ov6xx0_configure(ov) < 0) {
err("Failed to configure OV6xx0");
goto error;
}
}
} else {
- if (ov7xx0_configure(ov511) < 0) {
+ if (ov7xx0_configure(ov) < 0) {
err("Failed to configure OV7xx0");
goto error;
}
}
+ // FIXME: Sizes > 320x240 are not working yet
+ ov->maxwidth = 320;
+ ov->maxheight = 240;
+
// The OV518 cannot go as low as the sensor can
- ov511->minwidth = 160;
- ov511->minheight = 120;
+ ov->minwidth = 160;
+ ov->minheight = 120;
return 0;
@@ -6695,7 +6605,7 @@
const struct usb_device_id *id)
{
struct usb_interface_descriptor *interface;
- struct usb_ov511 *ov511;
+ struct usb_ov511 *ov;
int i;
int registered = 0;
@@ -6716,54 +6626,54 @@
/* Since code below may sleep, we use this as a lock */
MOD_INC_USE_COUNT;
- if ((ov511 = kmalloc(sizeof(*ov511), GFP_KERNEL)) == NULL) {
- err("couldn't kmalloc ov511 struct");
- goto error_unlock;
- }
-
- memset(ov511, 0, sizeof(*ov511));
-
- ov511->dev = dev;
- ov511->iface = interface->bInterfaceNumber;
- ov511->led_policy = led;
- ov511->compress = compress;
- ov511->lightfreq = lightfreq;
- ov511->num_inputs = 1; /* Video decoder init functs. change this */
- ov511->stop_during_set = !fastset;
- ov511->tuner_type = tuner;
- ov511->backlight = backlight;
-
- ov511->auto_brt = autobright;
- ov511->auto_gain = autogain;
- ov511->auto_exp = autoexp;
+ if ((ov = kmalloc(sizeof(*ov), GFP_KERNEL)) == NULL) {
+ err("couldn't kmalloc ov struct");
+ goto error_out;
+ }
+
+ memset(ov, 0, sizeof(*ov));
+
+ ov->dev = dev;
+ ov->iface = interface->bInterfaceNumber;
+ ov->led_policy = led;
+ ov->compress = compress;
+ 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->auto_brt = autobright;
+ ov->auto_gain = autogain;
+ ov->auto_exp = autoexp;
switch (dev->descriptor.idProduct) {
case PROD_OV511:
info("USB OV511 camera found");
- ov511->bridge = BRG_OV511;
- ov511->bclass = BCL_OV511;
+ ov->bridge = BRG_OV511;
+ ov->bclass = BCL_OV511;
break;
case PROD_OV511PLUS:
info("USB OV511+ camera found");
- ov511->bridge = BRG_OV511PLUS;
- ov511->bclass = BCL_OV511;
+ ov->bridge = BRG_OV511PLUS;
+ ov->bclass = BCL_OV511;
break;
case PROD_OV518:
info("USB OV518 camera found");
- ov511->bridge = BRG_OV518;
- ov511->bclass = BCL_OV518;
+ ov->bridge = BRG_OV518;
+ ov->bclass = BCL_OV518;
break;
case PROD_OV518PLUS:
info("USB OV518+ camera found");
- ov511->bridge = BRG_OV518PLUS;
- ov511->bclass = BCL_OV518;
+ ov->bridge = BRG_OV518PLUS;
+ ov->bclass = BCL_OV518;
break;
case PROD_ME2CAM:
if (dev->descriptor.idVendor != VEND_MATTEL)
goto error;
info("Intel Play Me2Cam (OV511+) found");
- ov511->bridge = BRG_OV511PLUS;
- ov511->bclass = BCL_OV511;
+ ov->bridge = BRG_OV511PLUS;
+ ov->bclass = BCL_OV511;
break;
default:
err("Unknown product ID 0x%x", dev->descriptor.idProduct);
@@ -6775,47 +6685,53 @@
if (force_rgb)
info("data format set to RGB");
- init_waitqueue_head(&ov511->wq);
+ init_waitqueue_head(&ov->wq);
- init_MUTEX(&ov511->lock); /* to 1 == available */
- init_MUTEX(&ov511->buf_lock);
- init_MUTEX(&ov511->param_lock);
- init_MUTEX(&ov511->i2c_lock);
- ov511->buf_state = BUF_NOT_ALLOCATED;
-
- if (ov511->bridge == BRG_OV518 ||
- ov511->bridge == BRG_OV518PLUS) {
- if (ov518_configure(ov511) < 0)
+ init_MUTEX(&ov->lock); /* to 1 == available */
+ init_MUTEX(&ov->buf_lock);
+ init_MUTEX(&ov->param_lock);
+ init_MUTEX(&ov->i2c_lock);
+ init_MUTEX(&ov->cbuf_lock);
+
+ ov->buf_state = BUF_NOT_ALLOCATED;
+
+ /* Must be kmalloc()'ed, for DMA accessibility */
+ ov->cbuf = kmalloc(OV511_CBUF_SIZE, GFP_KERNEL);
+ if (!ov->cbuf)
+ goto error;
+
+ if (ov->bclass == BCL_OV518) {
+ if (ov518_configure(ov) < 0)
goto error;
} else {
- if (ov511_configure(ov511) < 0)
+ if (ov511_configure(ov) < 0)
goto error;
}
for (i = 0; i < OV511_NUMFRAMES; i++) {
- ov511->frame[i].framenum = i;
- init_waitqueue_head(&ov511->frame[i].wq);
+ ov->frame[i].framenum = i;
+ init_waitqueue_head(&ov->frame[i].wq);
}
/* Unnecessary? (This is done on open(). Need to make sure variables
* are properly initialized without this before removing it, though). */
- if (ov51x_set_default_params(ov511) < 0)
+ if (ov51x_set_default_params(ov) < 0)
goto error;
#ifdef OV511_DEBUG
if (dump_bridge)
- ov511_dump_regs(dev);
+ ov511_dump_regs(ov);
#endif
- memcpy(&ov511->vdev, &ov511_template, sizeof(ov511_template));
- ov511->vdev.priv = ov511;
+ memcpy(&ov->vdev, &vdev_template, sizeof(vdev_template));
+ ov->vdev.priv = ov;
for (i = 0; i < OV511_MAX_UNIT_VIDEO; i++) {
/* Minor 0 cannot be specified; assume user wants autodetect */
if (unit_video[i] == 0)
break;
- if (video_register_device(&ov511->vdev, VFL_TYPE_GRABBER,
+ if (video_register_device(&ov->vdev, VFL_TYPE_GRABBER,
unit_video[i]) >= 0) {
registered = 1;
break;
@@ -6824,34 +6740,41 @@
/* Use the next available one */
if (!registered &&
- video_register_device(&ov511->vdev, VFL_TYPE_GRABBER, -1) < 0) {
+ video_register_device(&ov->vdev, VFL_TYPE_GRABBER, -1) < 0) {
err("video_register_device failed");
goto error;
}
- info("Device registered on minor %d", ov511->vdev.minor);
+ info("Device registered on minor %d", ov->vdev.minor);
MOD_DEC_USE_COUNT;
- return ov511;
+ return ov;
error:
err("Camera initialization failed");
#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
/* Safe to call even if entry doesn't exist */
- destroy_proc_ov511_cam(ov511);
+ destroy_proc_ov511_cam(ov);
#endif
+ if (ov->cbuf) {
+ down(&ov->cbuf_lock);
+ kfree(ov->cbuf);
+ ov->cbuf = NULL;
+ up(&ov->cbuf_lock);
+ }
+
usb_driver_release_interface(&ov511_driver,
- &dev->actconfig->interface[ov511->iface]);
+ &dev->actconfig->interface[ov->iface]);
error_dealloc:
- if (ov511) {
- kfree(ov511);
- ov511 = NULL;
+ if (ov) {
+ kfree(ov);
+ ov = NULL;
}
-error_unlock:
+error_out:
MOD_DEC_USE_COUNT;
return NULL;
}
@@ -6860,7 +6783,7 @@
static void
ov51x_disconnect(struct usb_device *dev, void *ptr)
{
- struct usb_ov511 *ov511 = (struct usb_ov511 *) ptr;
+ struct usb_ov511 *ov = (struct usb_ov511 *) ptr;
int n;
MOD_INC_USE_COUNT;
@@ -6868,48 +6791,53 @@
PDEBUG(3, "");
/* We don't want people trying to open up the device */
- if (!ov511->user)
- video_unregister_device(&ov511->vdev);
+ if (!ov->user)
+ video_unregister_device(&ov->vdev);
else
PDEBUG(3, "Device open...deferring video_unregister_device");
for (n = 0; n < OV511_NUMFRAMES; n++)
- ov511->frame[n].grabstate = FRAME_ERROR;
+ ov->frame[n].grabstate = FRAME_ERROR;
- ov511->curframe = -1;
+ ov->curframe = -1;
/* This will cause the process to request another frame */
for (n = 0; n < OV511_NUMFRAMES; n++)
- if (waitqueue_active(&ov511->frame[n].wq))
- wake_up_interruptible(&ov511->frame[n].wq);
- if (waitqueue_active(&ov511->wq))
- wake_up_interruptible(&ov511->wq);
+ if (waitqueue_active(&ov->frame[n].wq))
+ wake_up_interruptible(&ov->frame[n].wq);
+ if (waitqueue_active(&ov->wq))
+ wake_up_interruptible(&ov->wq);
- ov511->streaming = 0;
+ ov->streaming = 0;
/* Unschedule all of the iso td's */
for (n = OV511_NUMSBUF - 1; n >= 0; n--) {
- if (ov511->sbuf[n].urb) {
- ov511->sbuf[n].urb->next = NULL;
- usb_unlink_urb(ov511->sbuf[n].urb);
- usb_free_urb(ov511->sbuf[n].urb);
- ov511->sbuf[n].urb = NULL;
+ if (ov->sbuf[n].urb) {
+ ov->sbuf[n].urb->next = NULL;
+ usb_unlink_urb(ov->sbuf[n].urb);
+ usb_free_urb(ov->sbuf[n].urb);
+ ov->sbuf[n].urb = NULL;
}
}
#if defined(CONFIG_PROC_FS) && defined(CONFIG_VIDEO_PROC_FS)
- destroy_proc_ov511_cam(ov511);
+ destroy_proc_ov511_cam(ov);
#endif
usb_driver_release_interface(&ov511_driver,
- &ov511->dev->actconfig->interface[ov511->iface]);
- ov511->dev = NULL;
+ &ov->dev->actconfig->interface[ov->iface]);
+ ov->dev = NULL;
/* Free the memory */
- if (ov511 && !ov511->user) {
- ov511_dealloc(ov511, 1);
- kfree(ov511);
- ov511 = NULL;
+ if (ov && !ov->user) {
+ down(&ov->cbuf_lock);
+ kfree(ov->cbuf);
+ ov->cbuf = NULL;
+ up(&ov->cbuf_lock);
+
+ ov51x_dealloc(ov, 1);
+ kfree(ov);
+ ov = NULL;
}
MOD_DEC_USE_COUNT;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)