summaryrefslogtreecommitdiff
path: root/linux/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers')
-rw-r--r--linux/drivers/media/common/ir-functions.c2
-rw-r--r--linux/drivers/media/common/saa7146_fops.c2
-rw-r--r--linux/drivers/media/common/saa7146_i2c.c2
-rw-r--r--linux/drivers/media/common/saa7146_vbi.c2
-rw-r--r--linux/drivers/media/common/saa7146_video.c2
-rw-r--r--linux/drivers/media/dvb/dvb-core/dvb_frontend.c6
-rw-r--r--linux/drivers/media/video/Kconfig12
-rw-r--r--linux/drivers/media/video/Makefile1
-rw-r--r--linux/drivers/media/video/btcx-risc.c2
-rw-r--r--linux/drivers/media/video/cafe_ccic.c4
-rw-r--r--linux/drivers/media/video/compat_ioctl32.c2
-rw-r--r--linux/drivers/media/video/cs53l32a.c2
-rw-r--r--linux/drivers/media/video/cx2341x.c2
-rw-r--r--linux/drivers/media/video/cx25840/cx25840-audio.c2
-rw-r--r--linux/drivers/media/video/cx25840/cx25840-core.c2
-rw-r--r--linux/drivers/media/video/cx25840/cx25840-firmware.c2
-rw-r--r--linux/drivers/media/video/cx25840/cx25840-vbi.c2
-rw-r--r--linux/drivers/media/video/cx88/cx88-blackbird.c14
-rw-r--r--linux/drivers/media/video/cx88/cx88.h1
-rw-r--r--linux/drivers/media/video/dpc7146.c2
-rw-r--r--linux/drivers/media/video/em28xx/em28xx-video.c7
-rw-r--r--linux/drivers/media/video/hexium_gemini.c2
-rw-r--r--linux/drivers/media/video/hexium_orion.c2
-rw-r--r--linux/drivers/media/video/msp3400-driver.c9
-rw-r--r--linux/drivers/media/video/msp3400-kthreads.c2
-rw-r--r--linux/drivers/media/video/mxb.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-audio.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-context.c1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-context.h1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-io.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-ioread.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-main.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-std.c1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-std.h1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-v4l2.c2
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.c1
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.h1
-rw-r--r--linux/drivers/media/video/saa6588.c2
-rw-r--r--linux/drivers/media/video/saa7115.c2
-rw-r--r--linux/drivers/media/video/saa7127.c2
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-alsa.c2
-rw-r--r--linux/drivers/media/video/saa7191.c1
-rw-r--r--linux/drivers/media/video/sn9c102/sn9c102_core.c6
-rw-r--r--linux/drivers/media/video/tda9840.c2
-rw-r--r--linux/drivers/media/video/tea6415c.c2
-rw-r--r--linux/drivers/media/video/tea6420.c2
-rw-r--r--linux/drivers/media/video/tlv320aic23b.c2
-rw-r--r--linux/drivers/media/video/tuner-types.c2
-rw-r--r--linux/drivers/media/video/tveeprom.c2
-rw-r--r--linux/drivers/media/video/upd64031a.c2
-rw-r--r--linux/drivers/media/video/upd64083.c2
-rw-r--r--linux/drivers/media/video/usbvideo/konicawc.c13
-rw-r--r--linux/drivers/media/video/usbvideo/quickcam_messenger.c12
-rw-r--r--linux/drivers/media/video/usbvideo/usbvideo.h2
-rw-r--r--linux/drivers/media/video/usbvision/usbvision-i2c.c1
-rw-r--r--linux/drivers/media/video/usbvision/usbvision-video.c10
-rw-r--r--linux/drivers/media/video/v4l1-compat.c2
-rw-r--r--linux/drivers/media/video/v4l2-common.c2
-rw-r--r--linux/drivers/media/video/video-buf-dvb.c8
-rw-r--r--linux/drivers/media/video/video-buf.c2
-rw-r--r--linux/drivers/media/video/vivi.c7
-rw-r--r--linux/drivers/media/video/wm8739.c2
-rw-r--r--linux/drivers/media/video/wm8775.c2
-rw-r--r--linux/drivers/media/video/zr364xx.c958
75 files changed, 1054 insertions, 119 deletions
diff --git a/linux/drivers/media/common/ir-functions.c b/linux/drivers/media/common/ir-functions.c
index 13259912f..2a05e06cc 100644
--- a/linux/drivers/media/common/ir-functions.c
+++ b/linux/drivers/media/common/ir-functions.c
@@ -20,12 +20,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/string.h>
#include <linux/jiffies.h>
#include <media/ir-common.h>
+#include "compat.h"
/* -------------------------------------------------------------------------- */
diff --git a/linux/drivers/media/common/saa7146_fops.c b/linux/drivers/media/common/saa7146_fops.c
index 6b429ff37..19d48272c 100644
--- a/linux/drivers/media/common/saa7146_fops.c
+++ b/linux/drivers/media/common/saa7146_fops.c
@@ -1,5 +1,5 @@
-#include "compat.h"
#include <media/saa7146_vv.h>
+#include "compat.h"
#define BOARD_CAN_DO_VBI(dev) (dev->revision != 0 && dev->vv_data->vbi_minor != -1)
diff --git a/linux/drivers/media/common/saa7146_i2c.c b/linux/drivers/media/common/saa7146_i2c.c
index dffa769ef..3ae8660be 100644
--- a/linux/drivers/media/common/saa7146_i2c.c
+++ b/linux/drivers/media/common/saa7146_i2c.c
@@ -1,5 +1,5 @@
-#include "compat.h"
#include <media/saa7146_vv.h>
+#include "compat.h"
static u32 saa7146_i2c_func(struct i2c_adapter *adapter)
{
diff --git a/linux/drivers/media/common/saa7146_vbi.c b/linux/drivers/media/common/saa7146_vbi.c
index 510594fbd..2c63875d1 100644
--- a/linux/drivers/media/common/saa7146_vbi.c
+++ b/linux/drivers/media/common/saa7146_vbi.c
@@ -1,5 +1,5 @@
-#include "compat.h"
#include <media/saa7146_vv.h>
+#include "compat.h"
static int vbi_pixel_to_capture = 720 * 2;
diff --git a/linux/drivers/media/common/saa7146_video.c b/linux/drivers/media/common/saa7146_video.c
index 1fb373ee2..35288c4bc 100644
--- a/linux/drivers/media/common/saa7146_video.c
+++ b/linux/drivers/media/common/saa7146_video.c
@@ -1,5 +1,5 @@
-#include "compat.h"
#include <media/saa7146_vv.h>
+#include "compat.h"
static int max_memory = 32;
diff --git a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
index f39e3504d..319dccf5f 100644
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -540,14 +540,8 @@ restart:
break;
}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
if (try_to_freeze())
goto restart;
-#else
- if (current->flags & PF_FREEZE) {
- refrigerator (PF_FREEZE);
- }
-#endif
if (down_interruptible(&fepriv->sem))
break;
diff --git a/linux/drivers/media/video/Kconfig b/linux/drivers/media/video/Kconfig
index 7a6105153..fa0a87679 100644
--- a/linux/drivers/media/video/Kconfig
+++ b/linux/drivers/media/video/Kconfig
@@ -761,6 +761,18 @@ source "drivers/media/video/zc0301/Kconfig"
source "drivers/media/video/pwc/Kconfig"
+config USB_ZR364XX
+ tristate "USB ZR364XX Camera support"
+ depends on USB && VIDEO_V4L2
+ ---help---
+ Say Y here if you want to connect this type of camera to your
+ computer's USB port.
+ See <file:Documentation/video4linux/zr364xx.txt> for more info
+ and list of supported cameras.
+
+ To compile this driver as a module, choose M here: the
+ module will be called zr364xx.
+
endmenu # V4L USB devices
endmenu
diff --git a/linux/drivers/media/video/Makefile b/linux/drivers/media/video/Makefile
index 44ccaed40..384f01c13 100644
--- a/linux/drivers/media/video/Makefile
+++ b/linux/drivers/media/video/Makefile
@@ -99,6 +99,7 @@ obj-$(CONFIG_USB_OV511) += ov511.o
obj-$(CONFIG_USB_SE401) += se401.o
obj-$(CONFIG_USB_STV680) += stv680.o
obj-$(CONFIG_USB_W9968CF) += w9968cf.o
+obj-$(CONFIG_USB_ZR364XX) += zr364xx.o
obj-$(CONFIG_USB_SN9C102) += sn9c102/
obj-$(CONFIG_USB_ET61X251) += et61x251/
diff --git a/linux/drivers/media/video/btcx-risc.c b/linux/drivers/media/video/btcx-risc.c
index a3bd492eb..8950c8a8b 100644
--- a/linux/drivers/media/video/btcx-risc.c
+++ b/linux/drivers/media/video/btcx-risc.c
@@ -27,10 +27,10 @@
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
-#include "compat.h"
#include <linux/videodev2.h>
#include <asm/page.h>
#include <asm/pgtable.h>
+#include "compat.h"
#include "btcx-risc.h"
diff --git a/linux/drivers/media/video/cafe_ccic.c b/linux/drivers/media/video/cafe_ccic.c
index a8d0cb910..b61a90e78 100644
--- a/linux/drivers/media/video/cafe_ccic.c
+++ b/linux/drivers/media/video/cafe_ccic.c
@@ -1028,7 +1028,7 @@ static ssize_t cafe_v4l_read(struct file *filp,
char __user *buffer, size_t len, loff_t *pos)
{
struct cafe_camera *cam = filp->private_data;
- int ret;
+ int ret = 0;
/*
* Perhaps we're in speculative read mode and already
@@ -1257,8 +1257,6 @@ static int cafe_vidioc_reqbufs(struct file *filp, void *priv,
if (cam->n_sbufs == 0) /* no luck at all - ret already set */
kfree(cam->sb_bufs);
- else
- ret = 0;
req->count = cam->n_sbufs; /* In case of partial success */
out:
diff --git a/linux/drivers/media/video/compat_ioctl32.c b/linux/drivers/media/video/compat_ioctl32.c
index e0d6500f4..15151f56b 100644
--- a/linux/drivers/media/video/compat_ioctl32.c
+++ b/linux/drivers/media/video/compat_ioctl32.c
@@ -12,7 +12,6 @@
* ioctls.
*/
-#include "compat.h"
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
#include <linux/compat.h>
#include <linux/videodev.h>
@@ -20,6 +19,7 @@
#include <linux/module.h>
#include <linux/smp_lock.h>
#include <media/v4l2-common.h>
+#include "compat.h"
#ifdef CONFIG_COMPAT
diff --git a/linux/drivers/media/video/cs53l32a.c b/linux/drivers/media/video/cs53l32a.c
index c6657317b..07644a97d 100644
--- a/linux/drivers/media/video/cs53l32a.c
+++ b/linux/drivers/media/video/cs53l32a.c
@@ -19,7 +19,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/types.h>
@@ -33,6 +32,7 @@
#include "i2c-compat.h"
#include <linux/slab.h>
#endif
+#include "compat.h"
MODULE_DESCRIPTION("i2c device driver for cs53l32a Audio ADC");
MODULE_AUTHOR("Martin Vaughan");
diff --git a/linux/drivers/media/video/cx2341x.c b/linux/drivers/media/video/cx2341x.c
index 18e86cd4e..422d2c6a4 100644
--- a/linux/drivers/media/video/cx2341x.c
+++ b/linux/drivers/media/video/cx2341x.c
@@ -18,7 +18,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -35,6 +34,7 @@
#include <media/tuner.h>
#include <media/cx2341x.h>
#include <media/v4l2-common.h>
+#include "compat.h"
MODULE_DESCRIPTION("cx23415/6 driver");
MODULE_AUTHOR("Hans Verkuil");
diff --git a/linux/drivers/media/video/cx25840/cx25840-audio.c b/linux/drivers/media/video/cx25840/cx25840-audio.c
index 4cdf4c60e..40d931591 100644
--- a/linux/drivers/media/video/cx25840/cx25840-audio.c
+++ b/linux/drivers/media/video/cx25840/cx25840-audio.c
@@ -15,12 +15,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/videodev2.h>
#include <linux/i2c.h>
#include <media/v4l2-common.h>
#include <media/cx25840.h>
+#include "compat.h"
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
#endif
diff --git a/linux/drivers/media/video/cx25840/cx25840-core.c b/linux/drivers/media/video/cx25840/cx25840-core.c
index fc1e7da7c..75dbba700 100644
--- a/linux/drivers/media/video/cx25840/cx25840-core.c
+++ b/linux/drivers/media/video/cx25840/cx25840-core.c
@@ -28,7 +28,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/kernel.h>
#include <linux/module.h>
@@ -37,6 +36,7 @@
#include <linux/i2c.h>
#include <media/v4l2-common.h>
#include <media/cx25840.h>
+#include "compat.h"
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
#endif
diff --git a/linux/drivers/media/video/cx25840/cx25840-firmware.c b/linux/drivers/media/video/cx25840/cx25840-firmware.c
index 1b730b155..e42d32829 100644
--- a/linux/drivers/media/video/cx25840/cx25840-firmware.c
+++ b/linux/drivers/media/video/cx25840/cx25840-firmware.c
@@ -15,13 +15,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <linux/firmware.h>
#include <media/v4l2-common.h>
#include <media/cx25840.h>
+#include "compat.h"
#include "cx25840-core.h"
diff --git a/linux/drivers/media/video/cx25840/cx25840-vbi.c b/linux/drivers/media/video/cx25840/cx25840-vbi.c
index 876adbcba..8bb20bf77 100644
--- a/linux/drivers/media/video/cx25840/cx25840-vbi.c
+++ b/linux/drivers/media/video/cx25840/cx25840-vbi.c
@@ -15,12 +15,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/videodev2.h>
#include <linux/i2c.h>
#include <media/v4l2-common.h>
#include <media/cx25840.h>
+#include "compat.h"
#include "cx25840-core.h"
diff --git a/linux/drivers/media/video/cx88/cx88-blackbird.c b/linux/drivers/media/video/cx88/cx88-blackbird.c
index 3bb0a80de..3f11707b3 100644
--- a/linux/drivers/media/video/cx88/cx88-blackbird.c
+++ b/linux/drivers/media/video/cx88/cx88-blackbird.c
@@ -59,7 +59,8 @@ MODULE_PARM_DESC(debug,"enable debug messages [blackbird]");
/* ------------------------------------------------------------------ */
-#define BLACKBIRD_FIRM_IMAGE_SIZE 256*1024
+#define OLD_BLACKBIRD_FIRM_IMAGE_SIZE 262144
+#define BLACKBIRD_FIRM_IMAGE_SIZE 376836
/* defines below are from ivtv-driver.h */
@@ -410,7 +411,7 @@ static int blackbird_find_mailbox(struct cx8802_dev *dev)
u32 value;
int i;
- for (i = 0; i < BLACKBIRD_FIRM_IMAGE_SIZE; i++) {
+ for (i = 0; i < dev->fw_size; i++) {
memory_read(dev->core, i, &value);
if (value == signature[signaturecnt])
signaturecnt++;
@@ -463,12 +464,15 @@ static int blackbird_load_firmware(struct cx8802_dev *dev)
return -1;
}
- if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) {
- dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n",
- firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE);
+ if ((firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) &&
+ (firmware->size != OLD_BLACKBIRD_FIRM_IMAGE_SIZE)) {
+ dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d or %d)\n",
+ firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE,
+ OLD_BLACKBIRD_FIRM_IMAGE_SIZE);
release_firmware(firmware);
return -1;
}
+ dev->fw_size = firmware->size;
if (0 != memcmp(firmware->data, magic, 8)) {
dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n");
diff --git a/linux/drivers/media/video/cx88/cx88.h b/linux/drivers/media/video/cx88/cx88.h
index ddd2c2fe9..8a8b58f99 100644
--- a/linux/drivers/media/video/cx88/cx88.h
+++ b/linux/drivers/media/video/cx88/cx88.h
@@ -496,6 +496,7 @@ struct cx8802_dev {
u32 mailbox;
int width;
int height;
+ int fw_size;
#if defined(CONFIG_VIDEO_BUF_DVB) || defined(CONFIG_VIDEO_BUF_DVB_MODULE)
/* for dvb only */
diff --git a/linux/drivers/media/video/dpc7146.c b/linux/drivers/media/video/dpc7146.c
index 3ee2cc6e3..7070538c0 100644
--- a/linux/drivers/media/video/dpc7146.c
+++ b/linux/drivers/media/video/dpc7146.c
@@ -20,9 +20,9 @@
#define DEBUG_VARIABLE debug
-#include "compat.h"
#include <media/saa7146_vv.h>
#include <linux/video_decoder.h> /* for saa7111a */
+#include "compat.h"
#define I2C_SAA7111A 0x24
diff --git a/linux/drivers/media/video/em28xx/em28xx-video.c b/linux/drivers/media/video/em28xx/em28xx-video.c
index f03547db8..3abd11d2b 100644
--- a/linux/drivers/media/video/em28xx/em28xx-video.c
+++ b/linux/drivers/media/video/em28xx/em28xx-video.c
@@ -660,15 +660,8 @@ static int em28xx_v4l2_mmap(struct file *filp, struct vm_area_struct *vma)
pos = dev->frame[i].bufmem;
while (size > 0) { /* size is page-aligned */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
- unsigned long page = vmalloc_to_pfn(pos);
- if (remap_pfn_range(vma, start, page, PAGE_SIZE,
- vma->vm_page_prot)) {
- em28xx_videodbg("mmap: rename page map failed\n");
-#else
if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
em28xx_videodbg("mmap: vm_insert_page failed\n");
-#endif
mutex_unlock(&dev->fileop_lock);
return -EAGAIN;
}
diff --git a/linux/drivers/media/video/hexium_gemini.c b/linux/drivers/media/video/hexium_gemini.c
index 6cc7ca99d..d1957736b 100644
--- a/linux/drivers/media/video/hexium_gemini.c
+++ b/linux/drivers/media/video/hexium_gemini.c
@@ -23,8 +23,8 @@
#define DEBUG_VARIABLE debug
-#include "compat.h"
#include <media/saa7146_vv.h>
+#include "compat.h"
static int debug = 0;
module_param(debug, int, 0);
diff --git a/linux/drivers/media/video/hexium_orion.c b/linux/drivers/media/video/hexium_orion.c
index 59ed0dfd2..2c9eb6923 100644
--- a/linux/drivers/media/video/hexium_orion.c
+++ b/linux/drivers/media/video/hexium_orion.c
@@ -23,8 +23,8 @@
#define DEBUG_VARIABLE debug
-#include "compat.h"
#include <media/saa7146_vv.h>
+#include "compat.h"
static int debug = 0;
module_param(debug, int, 0);
diff --git a/linux/drivers/media/video/msp3400-driver.c b/linux/drivers/media/video/msp3400-driver.c
index f03cc0032..9958e2570 100644
--- a/linux/drivers/media/video/msp3400-driver.c
+++ b/linux/drivers/media/video/msp3400-driver.c
@@ -45,7 +45,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/kernel.h>
#include <linux/module.h>
@@ -67,6 +66,7 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
#endif
+#include "compat.h"
#include "msp3400-driver.h"
/* ---------------------------------------------------------------------- */
@@ -399,16 +399,9 @@ int msp_sleep(struct msp_state *state, int timeout)
(msecs_to_jiffies(timeout));
}
}
-#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
- if (current->flags & PF_FREEZE) {
- refrigerator (PF_FREEZE);
- }
-#endif
remove_wait_queue(&state->wq, &wait);
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)
try_to_freeze();
-#endif
return state->restart;
}
diff --git a/linux/drivers/media/video/msp3400-kthreads.c b/linux/drivers/media/video/msp3400-kthreads.c
index df95b0cfb..041ad89c6 100644
--- a/linux/drivers/media/video/msp3400-kthreads.c
+++ b/linux/drivers/media/video/msp3400-kthreads.c
@@ -18,7 +18,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/kernel.h>
#include <linux/module.h>
@@ -35,6 +34,7 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
#endif
+#include "compat.h"
#include "msp3400-driver.h"
/* this one uses the automatic sound standard detection of newer msp34xx
diff --git a/linux/drivers/media/video/mxb.c b/linux/drivers/media/video/mxb.c
index 928a3ab91..0ed5c1e47 100644
--- a/linux/drivers/media/video/mxb.c
+++ b/linux/drivers/media/video/mxb.c
@@ -23,11 +23,11 @@
#define DEBUG_VARIABLE debug
-#include "compat.h"
#include <media/saa7146_vv.h>
#include <media/tuner.h>
#include <linux/video_decoder.h>
#include <media/v4l2-common.h>
+#include "compat.h"
#include "mxb.h"
#include "tea6415c.h"
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-audio.c b/linux/drivers/media/video/pvrusb2/pvrusb2-audio.c
index 7f38dae17..7fcc6cffa 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-audio.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-audio.c
@@ -20,13 +20,13 @@
*
*/
-#include "compat.h"
#include "pvrusb2-audio.h"
#include "pvrusb2-hdw-internal.h"
#include "pvrusb2-debug.h"
#include <linux/videodev2.h>
#include <media/msp3400.h>
#include <media/v4l2-common.h>
+#include "compat.h"
struct pvr2_msp3400_handler {
struct pvr2_hdw *hdw;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-context.c b/linux/drivers/media/video/pvrusb2/pvrusb2-context.c
index 3103c808c..a7684d9d3 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-context.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-context.c
@@ -27,6 +27,7 @@
#include <linux/string.h>
#include <linux/slab.h>
#include <asm/semaphore.h>
+#include "compat.h"
static void pvr2_context_destroy(struct pvr2_context *mp)
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-context.h b/linux/drivers/media/video/pvrusb2/pvrusb2-context.h
index 69c1f3a92..0a05ea692 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-context.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-context.h
@@ -20,7 +20,6 @@
#ifndef __PVRUSB2_BASE_H
#define __PVRUSB2_BASE_H
-#include "compat.h"
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
#include <linux/mutex.h>
#else
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c b/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c
index f44048186..71cc14280 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.c
@@ -39,6 +39,7 @@
#include <media/v4l2-common.h>
#include <linux/errno.h>
#include <linux/slab.h>
+#include "compat.h"
struct pvr2_v4l_cx2584x {
struct pvr2_i2c_handler handler;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h b/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h
index 5dea8d7b3..54b2844e7 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-cx2584x-v4l.h
@@ -33,7 +33,6 @@
*/
-#include "compat.h"
#include "pvrusb2-i2c-core.h"
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c
index fb0a9ca67..649ac3875 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-encoder.c
@@ -20,7 +20,6 @@
*
*/
-#include "compat.h"
#include <linux/device.h> // for linux/firmware.h
#include <linux/firmware.h>
#include "pvrusb2-util.h"
@@ -28,6 +27,7 @@
#include "pvrusb2-hdw-internal.h"
#include "pvrusb2-debug.h"
#include "pvrusb2-fx2-cmd.h"
+#include "compat.h"
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
index 47b1365d7..db0b02f0f 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
@@ -33,7 +33,6 @@
*/
-#include "compat.h"
#include <linux/videodev2.h>
#include <linux/i2c.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index d80136377..1f7586078 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -19,7 +19,6 @@
*
*/
-#include "compat.h"
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/slab.h>
@@ -38,6 +37,7 @@
#include "pvrusb2-encoder.h"
#include "pvrusb2-debug.h"
#include "pvrusb2-fx2-cmd.h"
+#include "compat.h"
#define TV_MIN_FREQ 55250000L
#define TV_MAX_FREQ 850000000L
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c
index 40200c79f..4b0ded374 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-chips-v4l2.c
@@ -19,7 +19,6 @@
*
*/
-#include "compat.h"
#include <linux/kernel.h>
#include "pvrusb2-i2c-core.h"
#include "pvrusb2-hdw-internal.h"
@@ -30,6 +29,7 @@
#include "pvrusb2-video-v4l.h"
#include "pvrusb2-cx2584x-v4l.h"
#include "pvrusb2-wm8775.h"
+#include "compat.h"
#define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c
index c650e02cc..7ce929be8 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.c
@@ -25,6 +25,7 @@
#include "pvrusb2-debug.h"
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
+#include "compat.h"
static void set_standard(struct pvr2_hdw *hdw)
{
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h
index 6c2379fc5..c838df616 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-cmd-v4l2.h
@@ -23,7 +23,6 @@
#ifndef __PVRUSB2_CMD_V4L2_H
#define __PVRUSB2_CMD_V4L2_H
-#include "compat.h"
#include "pvrusb2-i2c-core.h"
extern const struct pvr2_i2c_op pvr2_i2c_op_v4l2_standard;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
index 215fbf473..22a02dd76 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
@@ -19,11 +19,11 @@
*
*/
-#include "compat.h"
#include "pvrusb2-i2c-core.h"
#include "pvrusb2-hdw-internal.h"
#include "pvrusb2-debug.h"
#include "pvrusb2-fx2-cmd.h"
+#include "compat.h"
#define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-io.c b/linux/drivers/media/video/pvrusb2/pvrusb2-io.c
index ef7293bf1..7b3be67f5 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-io.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-io.c
@@ -19,7 +19,6 @@
*
*/
-#include "compat.h"
#include "pvrusb2-io.h"
#include "pvrusb2-debug.h"
#include <linux/errno.h>
@@ -30,6 +29,7 @@
#else
#include <asm/semaphore.h>
#endif
+#include "compat.h"
static const char *pvr2_buffer_state_decode(enum pvr2_buffer_state);
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-ioread.c b/linux/drivers/media/video/pvrusb2/pvrusb2-ioread.c
index c42eef3c2..aef12fecb 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-ioread.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-ioread.c
@@ -19,7 +19,6 @@
*
*/
-#include "compat.h"
#include "pvrusb2-ioread.h"
#include "pvrusb2-debug.h"
#include <linux/errno.h>
@@ -31,6 +30,7 @@
#include <asm/semaphore.h>
#endif
#include <asm/uaccess.h>
+#include "compat.h"
#define BUFFER_COUNT 32
#define BUFFER_SIZE PAGE_ALIGN(0x4000)
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-main.c b/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
index 1abbaf3cc..ccf5a1ac0 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
@@ -20,7 +20,6 @@
*
*/
-#include "compat.h"
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>
@@ -37,6 +36,7 @@
#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
#include "pvrusb2-sysfs.h"
#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */
+#include "compat.h"
#define DRIVER_AUTHOR "Mike Isely <isely@pobox.com>"
#define DRIVER_DESC "Hauppauge WinTV-PVR-USB2 MPEG2 Encoder/Tuner"
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-std.c b/linux/drivers/media/video/pvrusb2/pvrusb2-std.c
index 4de535498..e4dff8d1c 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-std.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-std.c
@@ -23,6 +23,7 @@
#include "pvrusb2-debug.h"
#include <asm/string.h>
#include <linux/slab.h>
+#include "compat.h"
struct std_name {
const char *name;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-std.h b/linux/drivers/media/video/pvrusb2/pvrusb2-std.h
index dc9ef5bb3..07c399375 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-std.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-std.h
@@ -21,7 +21,6 @@
#ifndef __PVRUSB2_STD_H
#define __PVRUSB2_STD_H
-#include "compat.h"
#include <linux/videodev2.h>
// Convert string describing one or more video standards into a mask of V4L
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/linux/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
index 165c00f44..1e656f23d 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-v4l2.c
@@ -20,7 +20,6 @@
*
*/
-#include "compat.h"
#include <linux/kernel.h>
#include <linux/version.h>
#include "pvrusb2-context.h"
@@ -32,6 +31,7 @@
#include <linux/videodev2.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-common.h>
+#include "compat.h"
struct pvr2_v4l2_dev;
struct pvr2_v4l2_fh;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c b/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c
index df042509a..a842c8fd1 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.c
@@ -39,6 +39,7 @@
#include <media/saa7115.h>
#include <linux/errno.h>
#include <linux/slab.h>
+#include "compat.h"
struct pvr2_v4l_decoder {
struct pvr2_i2c_handler handler;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h b/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h
index 1c0c98efb..2b917fda0 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-video-v4l.h
@@ -32,7 +32,6 @@
*/
-#include "compat.h"
#include "pvrusb2-i2c-core.h"
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.c b/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.c
index 7890b45d2..6bf125213 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.c
@@ -37,6 +37,7 @@
#include <media/v4l2-common.h>
#include <linux/errno.h>
#include <linux/slab.h>
+#include "compat.h"
struct pvr2_v4l_wm8775 {
struct pvr2_i2c_handler handler;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.h b/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.h
index 15ee1e215..8aaeff4e1 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.h
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-wm8775.h
@@ -33,7 +33,6 @@
*/
-#include "compat.h"
#include "pvrusb2-i2c-core.h"
diff --git a/linux/drivers/media/video/saa6588.c b/linux/drivers/media/video/saa6588.c
index ff6f29eac..f6840efa9 100644
--- a/linux/drivers/media/video/saa6588.c
+++ b/linux/drivers/media/video/saa6588.c
@@ -18,7 +18,6 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/kernel.h>
@@ -37,6 +36,7 @@
#endif
#include <media/rds.h>
+#include "compat.h"
/* Addresses to scan */
static unsigned short normal_i2c[] = {
diff --git a/linux/drivers/media/video/saa7115.c b/linux/drivers/media/video/saa7115.c
index 6163a68e3..d868920de 100644
--- a/linux/drivers/media/video/saa7115.c
+++ b/linux/drivers/media/video/saa7115.c
@@ -37,7 +37,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include "saa711x_regs.h"
#include <linux/kernel.h>
@@ -51,6 +50,7 @@
#include "i2c-compat.h"
#endif
#include <asm/div64.h>
+#include "compat.h"
#define VRES_60HZ (480+16)
diff --git a/linux/drivers/media/video/saa7127.c b/linux/drivers/media/video/saa7127.c
index e1e697579..35342dbe5 100644
--- a/linux/drivers/media/video/saa7127.c
+++ b/linux/drivers/media/video/saa7127.c
@@ -47,7 +47,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/kernel.h>
#include <linux/module.h>
@@ -59,6 +58,7 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include "i2c-compat.h"
#endif
+#include "compat.h"
static int debug = 0;
static int test_image = 0;
diff --git a/linux/drivers/media/video/saa7134/saa7134-alsa.c b/linux/drivers/media/video/saa7134/saa7134-alsa.c
index 1ff1c706d..6b8e0e1f0 100644
--- a/linux/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/linux/drivers/media/video/saa7134/saa7134-alsa.c
@@ -16,7 +16,6 @@
*
*/
-#include "compat.h"
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
#include <linux/init.h>
#include <linux/slab.h>
@@ -31,6 +30,7 @@
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <linux/interrupt.h>
+#include "compat.h"
#include "saa7134.h"
#include "saa7134-reg.h"
diff --git a/linux/drivers/media/video/saa7191.c b/linux/drivers/media/video/saa7191.c
index 746cadb8f..99b33ea18 100644
--- a/linux/drivers/media/video/saa7191.c
+++ b/linux/drivers/media/video/saa7191.c
@@ -23,6 +23,7 @@
#include <linux/videodev.h>
#include <linux/video_decoder.h>
#include <linux/i2c.h>
+#include "compat.h"
#include "saa7191.h"
diff --git a/linux/drivers/media/video/sn9c102/sn9c102_core.c b/linux/drivers/media/video/sn9c102/sn9c102_core.c
index ef431d942..956e25041 100644
--- a/linux/drivers/media/video/sn9c102/sn9c102_core.c
+++ b/linux/drivers/media/video/sn9c102/sn9c102_core.c
@@ -2025,13 +2025,7 @@ static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma)
pos = cam->frame[i].bufmem;
while (size > 0) { /* size is page-aligned */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
- unsigned long page = vmalloc_to_pfn(pos);
- if (remap_pfn_range(vma, start, page, PAGE_SIZE,
- vma->vm_page_prot)) {
-#else
if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
-#endif
mutex_unlock(&cam->fileop_mutex);
return -EAGAIN;
}
diff --git a/linux/drivers/media/video/tda9840.c b/linux/drivers/media/video/tda9840.c
index cc6de147c..d74b68ae3 100644
--- a/linux/drivers/media/video/tda9840.c
+++ b/linux/drivers/media/video/tda9840.c
@@ -24,11 +24,11 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/ioctl.h>
#include <linux/i2c.h>
+#include "compat.h"
#include "tda9840.h"
diff --git a/linux/drivers/media/video/tea6415c.c b/linux/drivers/media/video/tea6415c.c
index 4e6038324..03716e2c9 100644
--- a/linux/drivers/media/video/tea6415c.c
+++ b/linux/drivers/media/video/tea6415c.c
@@ -26,11 +26,11 @@
Foundation, Inc., 675 Mvss Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/ioctl.h>
#include <linux/i2c.h>
+#include "compat.h"
#include "tea6415c.h"
diff --git a/linux/drivers/media/video/tea6420.c b/linux/drivers/media/video/tea6420.c
index 9896661da..d8611e213 100644
--- a/linux/drivers/media/video/tea6420.c
+++ b/linux/drivers/media/video/tea6420.c
@@ -26,11 +26,11 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/ioctl.h>
#include <linux/i2c.h>
+#include "compat.h"
#include "tea6420.h"
diff --git a/linux/drivers/media/video/tlv320aic23b.c b/linux/drivers/media/video/tlv320aic23b.c
index 4721d6f93..ee10fbeaa 100644
--- a/linux/drivers/media/video/tlv320aic23b.c
+++ b/linux/drivers/media/video/tlv320aic23b.c
@@ -23,7 +23,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/types.h>
#include <linux/ioctl.h>
@@ -36,6 +35,7 @@
#include "i2c-compat.h"
#include <linux/slab.h>
#endif
+#include "compat.h"
MODULE_DESCRIPTION("tlv320aic23b driver");
MODULE_AUTHOR("Scott Alfter, Ulf Eklund, Hans Verkuil");
diff --git a/linux/drivers/media/video/tuner-types.c b/linux/drivers/media/video/tuner-types.c
index 512b39cb9..22b159d44 100644
--- a/linux/drivers/media/video/tuner-types.c
+++ b/linux/drivers/media/video/tuner-types.c
@@ -4,10 +4,10 @@
*
*/
-#include "compat.h"
#include <linux/i2c.h>
#include <media/tuner.h>
#include <media/tuner-types.h>
+#include "compat.h"
/* ---------------------------------------------------------------------- */
diff --git a/linux/drivers/media/video/tveeprom.c b/linux/drivers/media/video/tveeprom.c
index 4b3ee1fcb..43017a006 100644
--- a/linux/drivers/media/video/tveeprom.c
+++ b/linux/drivers/media/video/tveeprom.c
@@ -28,7 +28,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -46,6 +45,7 @@
#include <media/tveeprom.h>
#include <media/v4l2-common.h>
#include <media/audiochip.h>
+#include "compat.h"
MODULE_DESCRIPTION("i2c Hauppauge eeprom decoder driver");
MODULE_AUTHOR("John Klar");
diff --git a/linux/drivers/media/video/upd64031a.c b/linux/drivers/media/video/upd64031a.c
index ae0a843ff..f73cb2c81 100644
--- a/linux/drivers/media/video/upd64031a.c
+++ b/linux/drivers/media/video/upd64031a.c
@@ -20,7 +20,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/version.h>
#include <linux/module.h>
@@ -29,6 +28,7 @@
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
#include <media/upd64031a.h>
+#include "compat.h"
// --------------------- read registers functions define -----------------------
diff --git a/linux/drivers/media/video/upd64083.c b/linux/drivers/media/video/upd64083.c
index 61be85abd..1fdde6e06 100644
--- a/linux/drivers/media/video/upd64083.c
+++ b/linux/drivers/media/video/upd64083.c
@@ -20,7 +20,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-#include "compat.h"
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
@@ -28,6 +27,7 @@
#include <linux/videodev2.h>
#include <media/v4l2-common.h>
#include <media/upd64083.h>
+#include "compat.h"
MODULE_DESCRIPTION("uPD64083 driver");
MODULE_AUTHOR("T. Adachi, Takeru KOMORIYA, Hans Verkuil");
diff --git a/linux/drivers/media/video/usbvideo/konicawc.c b/linux/drivers/media/video/usbvideo/konicawc.c
index 5ab17aaab..8ca93f248 100644
--- a/linux/drivers/media/video/usbvideo/konicawc.c
+++ b/linux/drivers/media/video/usbvideo/konicawc.c
@@ -15,15 +15,16 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
-#include "compat.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-#include <linux/input.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
+#include <linux/usb/input.h>
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
#include <linux/usb_input.h>
#else
-#include <linux/usb/input.h>
+#include <linux/input.h>
#endif
#include "usbvideo.h"
+#include "compat.h"
#define MAX_BRIGHTNESS 108
#define MAX_CONTRAST 108
@@ -242,7 +243,11 @@ static void konicawc_register_input(struct konicawc *cam, struct usb_device *dev
input_dev->name = "Konicawc snapshot button";
input_dev->phys = cam->input_physname;
usb_to_input_id(dev, &input_dev->id);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
input_dev->cdev.dev = &dev->dev;
+#else
+ input_dev->dev = &dev->dev;
+#endif
input_dev->evbit[0] = BIT(EV_KEY);
input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0);
diff --git a/linux/drivers/media/video/usbvideo/quickcam_messenger.c b/linux/drivers/media/video/usbvideo/quickcam_messenger.c
index 614c821ed..849f94bab 100644
--- a/linux/drivers/media/video/usbvideo/quickcam_messenger.c
+++ b/linux/drivers/media/video/usbvideo/quickcam_messenger.c
@@ -33,15 +33,15 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/input.h>
-#include "compat.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-#include <linux/usb_input.h>
-#else
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18)
#include <linux/usb/input.h>
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
+#include <linux/usb_input.h>
#endif
#include "usbvideo.h"
#include "quickcam_messenger.h"
+#include "compat.h"
/*
* Version Information
@@ -105,7 +105,11 @@ static void qcm_register_input(struct qcm *cam, struct usb_device *dev)
input_dev->name = "QCM button";
input_dev->phys = cam->input_physname;
usb_to_input_id(dev, &input_dev->id);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15)
input_dev->cdev.dev = &dev->dev;
+#else
+ input_dev->dev = &dev->dev;
+#endif
input_dev->evbit[0] = BIT(EV_KEY);
input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0);
diff --git a/linux/drivers/media/video/usbvideo/usbvideo.h b/linux/drivers/media/video/usbvideo/usbvideo.h
index aaafce2b5..c1f892825 100644
--- a/linux/drivers/media/video/usbvideo/usbvideo.h
+++ b/linux/drivers/media/video/usbvideo/usbvideo.h
@@ -16,13 +16,13 @@
#ifndef usbvideo_h
#define usbvideo_h
-#include "compat.h"
#include <linux/videodev.h>
#include <media/v4l2-common.h>
#include <linux/usb.h>
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
#include <linux/mutex.h>
#endif
+#include "compat.h"
/* Most helpful debugging aid */
#define assert(expr) ((void) ((expr) ? 0 : (err("assert failed at line %d",__LINE__))))
diff --git a/linux/drivers/media/video/usbvision/usbvision-i2c.c b/linux/drivers/media/video/usbvision/usbvision-i2c.c
index 30cb93a70..7fc39605c 100644
--- a/linux/drivers/media/video/usbvision/usbvision-i2c.c
+++ b/linux/drivers/media/video/usbvision/usbvision-i2c.c
@@ -39,6 +39,7 @@
#include <linux/sched.h>
#include <linux/usb.h>
#include <linux/i2c.h>
+#include "compat.h"
#include "usbvision.h"
#define DBG_I2C 1<<0
diff --git a/linux/drivers/media/video/usbvision/usbvision-video.c b/linux/drivers/media/video/usbvision/usbvision-video.c
index 1d0d61469..ff9d1cbbb 100644
--- a/linux/drivers/media/video/usbvision/usbvision-video.c
+++ b/linux/drivers/media/video/usbvision/usbvision-video.c
@@ -1255,21 +1255,11 @@ static int usbvision_v4l2_mmap(struct file *file, struct vm_area_struct *vma)
pos = usbvision->frame[i].data;
while (size > 0) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
- unsigned long page = vmalloc_to_pfn(pos);
- if (remap_pfn_range(vma, start, page, PAGE_SIZE,
- vma->vm_page_prot)) {
- PDEBUG(DBG_MMAP, "mmap: rename page map failed");
- up(&usbvision->lock);
- return -EAGAIN;
- }
-#else
if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
PDEBUG(DBG_MMAP, "mmap: vm_insert_page failed");
up(&usbvision->lock);
return -EAGAIN;
}
-#endif
start += PAGE_SIZE;
pos += PAGE_SIZE;
size -= PAGE_SIZE;
diff --git a/linux/drivers/media/video/v4l1-compat.c b/linux/drivers/media/video/v4l1-compat.c
index 02c5a2f58..2e42ee3a2 100644
--- a/linux/drivers/media/video/v4l1-compat.c
+++ b/linux/drivers/media/video/v4l1-compat.c
@@ -17,7 +17,6 @@
*/
-#include "compat.h"
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -41,6 +40,7 @@
#ifdef CONFIG_KMOD
#include <linux/kmod.h>
#endif
+#include "compat.h"
static unsigned int debug = 0;
module_param(debug, int, 0644);
diff --git a/linux/drivers/media/video/v4l2-common.c b/linux/drivers/media/video/v4l2-common.c
index 210de4a0c..8f45ba75a 100644
--- a/linux/drivers/media/video/v4l2-common.c
+++ b/linux/drivers/media/video/v4l2-common.c
@@ -44,7 +44,6 @@
* Added Gerd Knorrs v4l1 enhancements (Justin Schoeman)
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
@@ -75,6 +74,7 @@
#endif
#include <linux/videodev.h>
+#include "compat.h"
MODULE_AUTHOR("Bill Dirks, Justin Schoeman, Gerd Knorr");
MODULE_DESCRIPTION("misc helper functions for v4l2 device drivers");
diff --git a/linux/drivers/media/video/video-buf-dvb.c b/linux/drivers/media/video/video-buf-dvb.c
index 86993f95a..4776364a6 100644
--- a/linux/drivers/media/video/video-buf-dvb.c
+++ b/linux/drivers/media/video/video-buf-dvb.c
@@ -13,7 +13,6 @@
* (at your option) any later version.
*/
-#include "compat.h"
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0)
#include <linux/module.h>
@@ -30,6 +29,7 @@
#include <media/video-buf.h>
#include <media/video-buf-dvb.h>
+#include "compat.h"
/* ------------------------------------------------------------------ */
@@ -68,13 +68,7 @@ static int videobuf_dvb_thread(void *data)
break;
if (kthread_should_stop())
break;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
try_to_freeze();
-#else
- if (current->flags & PF_FREEZE) {
- refrigerator (PF_FREEZE);
- }
-#endif
/* feed buffer data to demux */
if (buf->state == STATE_DONE)
diff --git a/linux/drivers/media/video/video-buf.c b/linux/drivers/media/video/video-buf.c
index a2251c7e3..5564e20af 100644
--- a/linux/drivers/media/video/video-buf.c
+++ b/linux/drivers/media/video/video-buf.c
@@ -22,7 +22,6 @@
* (at your option) any later version.
*/
-#include "compat.h"
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -35,6 +34,7 @@
#include <asm/pgtable.h>
#include <media/video-buf.h>
+#include "compat.h"
#define MAGIC_DMABUF 0x19721112
#define MAGIC_BUFFER 0x20040302
diff --git a/linux/drivers/media/video/vivi.c b/linux/drivers/media/video/vivi.c
index 798e711f4..5dd6dd096 100644
--- a/linux/drivers/media/video/vivi.c
+++ b/linux/drivers/media/video/vivi.c
@@ -586,16 +586,9 @@ static void vivi_sleep(struct vivi_dmaqueue *dma_q)
schedule_timeout_interruptible (timeout);
}
-#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12)) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
- if (current->flags & PF_FREEZE) {
- refrigerator (PF_FREEZE);
- }
-#endif
remove_wait_queue(&dma_q->wq, &wait);
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12)
try_to_freeze();
-#endif
}
static int vivi_thread(void *data)
diff --git a/linux/drivers/media/video/wm8739.c b/linux/drivers/media/video/wm8739.c
index 79394f205..4b4e5277f 100644
--- a/linux/drivers/media/video/wm8739.c
+++ b/linux/drivers/media/video/wm8739.c
@@ -21,7 +21,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/types.h>
#include <linux/ioctl.h>
@@ -34,6 +33,7 @@
#include "i2c-compat.h"
#include <linux/slab.h>
#endif
+#include "compat.h"
MODULE_DESCRIPTION("wm8739 driver");
MODULE_AUTHOR("T. Adachi, Hans Verkuil");
diff --git a/linux/drivers/media/video/wm8775.c b/linux/drivers/media/video/wm8775.c
index 390d0cb29..d64f9c534 100644
--- a/linux/drivers/media/video/wm8775.c
+++ b/linux/drivers/media/video/wm8775.c
@@ -25,7 +25,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#include "compat.h"
#include <linux/module.h>
#include <linux/types.h>
#include <linux/ioctl.h>
@@ -38,6 +37,7 @@
#include "i2c-compat.h"
#include <linux/slab.h>
#endif
+#include "compat.h"
MODULE_DESCRIPTION("wm8775 driver");
MODULE_AUTHOR("Ulf Eklund, Hans Verkuil");
diff --git a/linux/drivers/media/video/zr364xx.c b/linux/drivers/media/video/zr364xx.c
new file mode 100644
index 000000000..2c9ac4cd2
--- /dev/null
+++ b/linux/drivers/media/video/zr364xx.c
@@ -0,0 +1,958 @@
+/*
+ * Zoran 364xx based USB webcam module version 0.72
+ *
+ * Allows you to use your USB webcam with V4L2 applications
+ * This is still in heavy developpement !
+ *
+ * Copyright (C) 2004 Antoine Jacquet <royale@zerezo.com>
+ * http://royale.zerezo.com/zr364xx/
+ *
+ * Heavily inspired by usb-skeleton.c, vicam.c, cpia.c and spca50x.c drivers
+ * V4L2 version inspired by meye.c driver
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/usb.h>
+#include <linux/vmalloc.h>
+#include <linux/slab.h>
+#include <linux/proc_fs.h>
+#include <media/v4l2-common.h>
+#include "compat.h"
+
+
+/* Version Information */
+#define DRIVER_VERSION "v0.72"
+#define DRIVER_AUTHOR "Antoine Jacquet, http://royale.zerezo.com/"
+#define DRIVER_DESC "Zoran 364xx"
+
+
+/* Camera */
+#define FRAMES 2
+#define MAX_FRAME_SIZE 100000
+#define BUFFER_SIZE 0x1000
+#define CTRL_TIMEOUT 500
+
+
+/* Debug macro */
+#define DBG(x...) if (debug) info(x)
+
+
+/* Module parameters */
+static int debug = 0;
+static int mode = 0;
+
+
+/* Module parameters interface */
+module_param(debug, int, 0644);
+MODULE_PARM_DESC(debug, "Debug level");
+module_param(mode, int, 0644);
+MODULE_PARM_DESC(mode, "0 = 320x240, 1 = 160x120, 2 = 640x480");
+
+
+/* Devices supported by this driver
+ * .driver_info contains the init method used by the camera */
+static struct usb_device_id device_table[] = {
+ {USB_DEVICE(0x08ca, 0x0109), .driver_info = 0 },
+ {USB_DEVICE(0x041e, 0x4024), .driver_info = 0 },
+ {USB_DEVICE(0x0d64, 0x0108), .driver_info = 0 },
+ {USB_DEVICE(0x0546, 0x3187), .driver_info = 0 },
+ {USB_DEVICE(0x0d64, 0x3108), .driver_info = 0 },
+ {USB_DEVICE(0x0595, 0x4343), .driver_info = 0 },
+ {USB_DEVICE(0x0bb0, 0x500d), .driver_info = 0 },
+ {USB_DEVICE(0x0feb, 0x2004), .driver_info = 0 },
+ {USB_DEVICE(0x055f, 0xb500), .driver_info = 0 },
+ {USB_DEVICE(0x08ca, 0x2062), .driver_info = 2 },
+ {USB_DEVICE(0x052b, 0x1a18), .driver_info = 1 },
+ {USB_DEVICE(0x04c8, 0x0729), .driver_info = 0 },
+ {USB_DEVICE(0x04f2, 0xa208), .driver_info = 0 },
+ {USB_DEVICE(0x0784, 0x0040), .driver_info = 1 },
+ {USB_DEVICE(0x06d6, 0x0034), .driver_info = 0 },
+ {USB_DEVICE(0x0a17, 0x0062), .driver_info = 2 },
+ {} /* Terminating entry */
+};
+
+MODULE_DEVICE_TABLE(usb, device_table);
+
+
+/* Camera stuff */
+struct zr364xx_camera {
+ struct usb_device *udev; /* save off the usb device pointer */
+ struct usb_interface *interface;/* the interface for this device */
+ struct video_device *vdev; /* v4l video device */
+ u8 *framebuf;
+ int nb;
+ unsigned char *buffer;
+ int skip;
+ int brightness;
+ int width;
+ int height;
+ int method;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,15)
+ struct mutex lock;
+#else
+ struct semaphore lock;
+#endif
+};
+
+
+/* function used to send initialisation commands to the camera */
+static int send_control_msg(struct usb_device *udev, u8 request, u16 value,
+ u16 index, unsigned char *cp, u16 size)
+{
+ int status;
+
+ unsigned char *transfer_buffer = kmalloc(size, GFP_KERNEL);
+ if (!transfer_buffer) {
+ info("kmalloc(%d) failed", size);
+ return -ENOMEM;
+ }
+
+ memcpy(transfer_buffer, cp, size);
+
+ status = usb_control_msg(udev,
+ usb_sndctrlpipe(udev, 0),
+ request,
+ USB_DIR_OUT | USB_TYPE_VENDOR |
+ USB_RECIP_DEVICE, value, index,
+ transfer_buffer, size, CTRL_TIMEOUT);
+
+ kfree(transfer_buffer);
+
+ if (status < 0)
+ info("Failed sending control message, error %d.", status);
+
+ return status;
+}
+
+
+/* Control messages sent to the camera to initialize it
+ * and launch the capture */
+typedef struct {
+ unsigned int value;
+ unsigned int size;
+ unsigned char *bytes;
+} message;
+
+/* method 0 */
+static unsigned char m0d1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+static unsigned char m0d2[] = { 0, 0, 0, 0, 0, 0 };
+static unsigned char m0d3[] = { 0, 0 };
+static message m0[] = {
+ {0x1f30, 0, NULL},
+ {0xd000, 0, NULL},
+ {0x3370, sizeof(m0d1), m0d1},
+ {0x2000, 0, NULL},
+ {0x2f0f, 0, NULL},
+ {0x2610, sizeof(m0d2), m0d2},
+ {0xe107, 0, NULL},
+ {0x2502, 0, NULL},
+ {0x1f70, 0, NULL},
+ {0xd000, 0, NULL},
+ {0x9a01, sizeof(m0d3), m0d3},
+ {-1, -1, NULL}
+};
+
+/* method 1 */
+static unsigned char m1d1[] = { 0xff, 0xff };
+static unsigned char m1d2[] = { 0x00, 0x00 };
+static message m1[] = {
+ {0x1f30, 0, NULL},
+ {0xd000, 0, NULL},
+ {0xf000, 0, NULL},
+ {0x2000, 0, NULL},
+ {0x2f0f, 0, NULL},
+ {0x2650, 0, NULL},
+ {0xe107, 0, NULL},
+ {0x2502, sizeof(m1d1), m1d1},
+ {0x1f70, 0, NULL},
+ {0xd000, 0, NULL},
+ {0xd000, 0, NULL},
+ {0xd000, 0, NULL},
+ {0x9a01, sizeof(m1d2), m1d2},
+ {-1, -1, NULL}
+};
+
+/* method 2 */
+static unsigned char m2d1[] = { 0xff, 0xff };
+static message m2[] = {
+ {0x1f30, 0, NULL},
+ {0xf000, 0, NULL},
+ {0x2000, 0, NULL},
+ {0x2f0f, 0, NULL},
+ {0x2650, 0, NULL},
+ {0xe107, 0, NULL},
+ {0x2502, sizeof(m2d1), m2d1},
+ {0x1f70, 0, NULL},
+ {-1, -1, NULL}
+};
+
+/* init table */
+static message *init[3] = { m0, m1, m2 };
+
+
+/* JPEG static data in header (Huffman table, etc) */
+static unsigned char header1[] = {
+ 0xFF, 0xD8,
+ /*
+ 0xFF, 0xE0, 0x00, 0x10, 'J', 'F', 'I', 'F',
+ 0x00, 0x01, 0x01, 0x00, 0x33, 0x8A, 0x00, 0x00, 0x33, 0x88,
+ */
+ 0xFF, 0xDB, 0x00, 0x84
+};
+static unsigned char header2[] = {
+ 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
+ 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
+ 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
+ 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
+ 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
+ 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33,
+ 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
+ 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
+ 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
+ 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
+ 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
+ 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
+ 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
+ 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
+ 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
+ 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F,
+ 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
+ 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5,
+ 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
+ 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
+ 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
+ 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1,
+ 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
+ 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
+ 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
+ 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
+ 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,
+ 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
+ 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
+ 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
+ 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
+ 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5,
+ 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+ 0xF8, 0xF9, 0xFA, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01,
+ 0x40, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01,
+ 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
+ 0x00, 0x3F, 0x00
+};
+static unsigned char header3;
+
+
+
+/********************/
+/* V4L2 integration */
+/********************/
+
+/* this function reads a full JPEG picture synchronously
+ * TODO: do it asynchronously... */
+static int read_frame(struct zr364xx_camera *cam, int framenum)
+{
+ int i, n, temp, head, size, actual_length;
+ unsigned char *ptr = NULL, *jpeg, swap;
+
+ redo:
+ /* hardware brightness */
+ n = send_control_msg(cam->udev, 1, 0x2001, 0, NULL, 0);
+ temp = (0x60 << 8) + 127 - cam->brightness;
+ n = send_control_msg(cam->udev, 1, temp, 0, NULL, 0);
+
+ /* during the first loop we are going to insert JPEG header */
+ head = 0;
+ /* this is the place in memory where we are going to build
+ * the JPEG image */
+ jpeg = cam->framebuf + framenum * MAX_FRAME_SIZE;
+ /* read data... */
+ do {
+ n = usb_bulk_msg(cam->udev,
+ usb_rcvbulkpipe(cam->udev, 0x81),
+ cam->buffer, BUFFER_SIZE, &actual_length,
+ CTRL_TIMEOUT);
+ DBG("buffer : %d %d", cam->buffer[0], cam->buffer[1]);
+ DBG("bulk : n=%d size=%d", n, actual_length);
+ if (n < 0) {
+ info("error reading bulk msg");
+ return 0;
+ }
+ if (actual_length < 0 || actual_length > BUFFER_SIZE) {
+ info("wrong number of bytes");
+ return 0;
+ }
+
+ /* swap bytes if camera needs it */
+ if (cam->method == 0)
+ for (i = 0; i < BUFFER_SIZE; i += 2) {
+ swap = cam->buffer[i];
+ cam->buffer[i] = cam->buffer[i + 1];
+ cam->buffer[i + 1] = swap;
+ }
+
+ /* write the JPEG header */
+ if (!head) {
+ DBG("jpeg header");
+ ptr = jpeg;
+ memcpy(ptr, header1, sizeof(header1));
+ ptr += sizeof(header1);
+ header3 = 0;
+ memcpy(ptr, &header3, 1);
+ ptr++;
+ memcpy(ptr, cam->buffer, 64);
+ ptr += 64;
+ header3 = 1;
+ memcpy(ptr, &header3, 1);
+ ptr++;
+ memcpy(ptr, cam->buffer + 64, 64);
+ ptr += 64;
+ memcpy(ptr, header2, sizeof(header2));
+ ptr += sizeof(header2);
+ memcpy(ptr, cam->buffer + 128,
+ actual_length - 128);
+ ptr += actual_length - 128;
+ head = 1;
+ DBG("header : %d %d %d %d %d %d %d %d %d",
+ cam->buffer[0], cam->buffer[1], cam->buffer[2],
+ cam->buffer[3], cam->buffer[4], cam->buffer[5],
+ cam->buffer[6], cam->buffer[7], cam->buffer[8]);
+ } else {
+ memcpy(ptr, cam->buffer, actual_length);
+ ptr += actual_length;
+ }
+ }
+ /* ... until there is no more */
+ while (actual_length == BUFFER_SIZE);
+
+ /* we skip the 2 first frames which are usually buggy */
+ if (cam->skip) {
+ cam->skip--;
+ goto redo;
+ }
+
+ /* go back to find the JPEG EOI marker */
+ size = ptr - jpeg;
+ ptr -= 2;
+ while (ptr > jpeg) {
+ if (*ptr == 0xFF && *(ptr + 1) == 0xD9
+ && *(ptr + 2) == 0xFF)
+ break;
+ ptr--;
+ }
+ if (ptr == jpeg)
+ DBG("No EOI marker");
+
+ /* Sometimes there is junk data in the middle of the picture,
+ * we want to skip this bogus frames */
+ while (ptr > jpeg) {
+ if (*ptr == 0xFF && *(ptr + 1) == 0xFF
+ && *(ptr + 2) == 0xFF)
+ break;
+ ptr--;
+ }
+ if (ptr != jpeg) {
+ DBG("Bogus frame ? %d", cam->nb);
+ goto redo;
+ }
+
+ DBG("jpeg : %d %d %d %d %d %d %d %d",
+ jpeg[0], jpeg[1], jpeg[2], jpeg[3],
+ jpeg[4], jpeg[5], jpeg[6], jpeg[7]);
+
+ return size;
+}
+
+
+static ssize_t zr364xx_read(struct file *file, char *buf, size_t cnt,
+ loff_t * ppos)
+{
+ unsigned long count = cnt;
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("zr364xx_read: read %d bytes.", (int) count);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ if (!buf)
+ return -EINVAL;
+
+ if (!count)
+ return -EINVAL;
+
+ /* NoMan Sux ! */
+ count = read_frame(cam, 0);
+
+ if (copy_to_user(buf, cam->framebuf, count))
+ return -EFAULT;
+
+ return count;
+}
+
+
+static int zr364xx_vidioc_querycap(struct file *file, void *priv,
+ struct v4l2_capability *cap)
+{
+ DBG("VIDIOC_QUERYCAP");
+ memset(cap, 0, sizeof(*cap));
+ strcpy(cap->driver, DRIVER_DESC);
+ cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE;
+ return 0;
+}
+
+static int zr364xx_vidioc_enum_input(struct file *file, void *priv,
+ struct v4l2_input *i)
+{
+ DBG("VIDIOC_ENUMINPUT");
+ if (i->index != 0)
+ return -EINVAL;
+ memset(i, 0, sizeof(*i));
+ i->index = 0;
+ strcpy(i->name, DRIVER_DESC " Camera");
+ i->type = V4L2_INPUT_TYPE_CAMERA;
+ return 0;
+}
+
+static int zr364xx_vidioc_g_input(struct file *file, void *priv,
+ unsigned int *i)
+{
+ DBG("VIDIOC_G_INPUT");
+ *i = 0;
+ return 0;
+}
+
+static int zr364xx_vidioc_s_input(struct file *file, void *priv,
+ unsigned int i)
+{
+ DBG("VIDIOC_S_INPUT: %d", i);
+ if (i != 0)
+ return -EINVAL;
+ return 0;
+}
+
+static int zr364xx_vidioc_queryctrl(struct file *file, void *priv,
+ struct v4l2_queryctrl *c)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("VIDIOC_QUERYCTRL: %d", c->id);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ switch (c->id) {
+ case V4L2_CID_BRIGHTNESS:
+ c->type = V4L2_CTRL_TYPE_INTEGER;
+ strcpy(c->name, "Brightness");
+ c->minimum = 0;
+ c->maximum = 127;
+ c->step = 1;
+ c->default_value = cam->brightness;
+ c->flags = 0;
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int zr364xx_vidioc_s_ctrl(struct file *file, void *priv,
+ struct v4l2_control *c)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("VIDIOC_S_CTRL: %d <- %d", c->id, c->value);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ switch (c->id) {
+ case V4L2_CID_BRIGHTNESS:
+ cam->brightness = c->value;
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int zr364xx_vidioc_g_ctrl(struct file *file, void *priv,
+ struct v4l2_control *c)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("VIDIOC_G_CTRL: %d -> %d", c->id, c->value);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ switch (c->id) {
+ case V4L2_CID_BRIGHTNESS:
+ c->value = cam->brightness;
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int zr364xx_vidioc_enum_fmt_cap(struct file *file,
+ void *priv, struct v4l2_fmtdesc *f)
+{
+ DBG("VIDIOC_ENUM_FMT: index = %d type = %d", f->index, f->type);
+ if (f->index > 0)
+ return -EINVAL;
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+ memset(f, 0, sizeof(*f));
+ f->index = 0;
+ f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ f->flags = V4L2_FMT_FLAG_COMPRESSED;
+ strcpy(f->description, "JPEG");
+ f->pixelformat = V4L2_PIX_FMT_JPEG;
+ return 0;
+}
+
+static int zr364xx_vidioc_try_fmt_cap(struct file *file, void *priv,
+ struct v4l2_format *f)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("VIDIOC_TRY_FMT: type = %d", f->type);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+ if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
+ return -EINVAL;
+ if (f->fmt.pix.field != V4L2_FIELD_ANY &&
+ f->fmt.pix.field != V4L2_FIELD_NONE)
+ return -EINVAL;
+ f->fmt.pix.field = V4L2_FIELD_NONE;
+ f->fmt.pix.width = cam->width;
+ f->fmt.pix.height = cam->height;
+ f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
+ f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
+ f->fmt.pix.colorspace = 0;
+ f->fmt.pix.priv = 0;
+ return 0;
+}
+
+static int zr364xx_vidioc_g_fmt_cap(struct file *file, void *priv,
+ struct v4l2_format *f)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("VIDIOC_G_FMT: type = %d (should be %d)",
+ f->type, V4L2_BUF_TYPE_VIDEO_CAPTURE);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+ memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
+ f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ f->fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
+ f->fmt.pix.field = V4L2_FIELD_NONE;
+ f->fmt.pix.width = cam->width;
+ f->fmt.pix.height = cam->height;
+ f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
+ f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
+ f->fmt.pix.colorspace = 0;
+ f->fmt.pix.priv = 0;
+ return 0;
+}
+
+static int zr364xx_vidioc_s_fmt_cap(struct file *file, void *priv,
+ struct v4l2_format *f)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("VIDIOC_S_FMT: type = %d (should be %d), "
+ "pixelformat = %d (should be %d), "
+ "field = %d (should be %d or %d) ",
+ f->type, V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ f->fmt.pix.pixelformat,
+ V4L2_PIX_FMT_JPEG, f->fmt.pix.field,
+ V4L2_FIELD_ANY, V4L2_FIELD_NONE);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
+ return -EINVAL;
+ if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
+ return -EINVAL;
+ if (f->fmt.pix.field != V4L2_FIELD_ANY &&
+ f->fmt.pix.field != V4L2_FIELD_NONE)
+ return -EINVAL;
+ f->fmt.pix.field = V4L2_FIELD_NONE;
+ f->fmt.pix.width = cam->width;
+ f->fmt.pix.height = cam->height;
+ f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
+ f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
+ f->fmt.pix.colorspace = 0;
+ f->fmt.pix.priv = 0;
+ DBG("ok!");
+ return 0;
+}
+
+static int zr364xx_vidioc_streamon(struct file *file, void *priv,
+ enum v4l2_buf_type type)
+{
+ DBG("VIDIOC_STREAMON");
+ return 0;
+}
+
+static int zr364xx_vidioc_streamoff(struct file *file, void *priv,
+ enum v4l2_buf_type type)
+{
+ DBG("VIDIOC_STREAMOFF");
+ return 0;
+}
+
+
+/* open the camera */
+static int zr364xx_open(struct inode *inode, struct file *file)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam = video_get_drvdata(vdev);
+ struct usb_device *udev = cam->udev;
+ int i, err;
+
+ DBG("zr364xx_open");
+
+ cam->skip = 2;
+
+ err = video_exclusive_open(inode, file);
+ if (err < 0)
+ return err;
+
+ if (!cam->framebuf) {
+ cam->framebuf = vmalloc_32(MAX_FRAME_SIZE * FRAMES);
+ if (!cam->framebuf) {
+ info("vmalloc_32 failed!");
+ return -ENOMEM;
+ }
+ }
+
+ mutex_lock(&cam->lock);
+ for (i = 0; init[cam->method][i].size != -1; i++) {
+ err =
+ send_control_msg(udev, 1, init[cam->method][i].value,
+ 0, init[cam->method][i].bytes,
+ init[cam->method][i].size);
+ if (err < 0) {
+ info("error during open sequence: %d", i);
+ mutex_unlock(&cam->lock);
+ return err;
+ }
+ }
+
+ file->private_data = vdev;
+
+ /* Added some delay here, since opening/closing the camera quickly,
+ * like Ekiga does during its startup, can crash the webcam
+ */
+ mdelay(100);
+
+ mutex_unlock(&cam->lock);
+ return 0;
+}
+
+
+/* release the camera */
+static int zr364xx_release(struct inode *inode, struct file *file)
+{
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+ struct usb_device *udev;
+ int i, err;
+
+ DBG("zr364xx_release");
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ udev = cam->udev;
+
+ mutex_lock(&cam->lock);
+ for (i = 0; i < 2; i++) {
+ err =
+ send_control_msg(udev, 1, init[cam->method][i].value,
+ 0, init[i][cam->method].bytes,
+ init[cam->method][i].size);
+ if (err < 0) {
+ info("error during release sequence");
+ mutex_unlock(&cam->lock);
+ return err;
+ }
+ }
+
+ file->private_data = NULL;
+ video_exclusive_release(inode, file);
+
+ /* Added some delay here, since opening/closing the camera quickly,
+ * like Ekiga does during its startup, can crash the webcam
+ */
+ mdelay(100);
+
+ mutex_unlock(&cam->lock);
+ return 0;
+}
+
+
+static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
+{
+ void *pos;
+ unsigned long start = vma->vm_start;
+ unsigned long size = vma->vm_end - vma->vm_start;
+ struct video_device *vdev = video_devdata(file);
+ struct zr364xx_camera *cam;
+
+ DBG("zr364xx_mmap: %ld\n", size);
+
+ if (vdev == NULL)
+ return -ENODEV;
+ cam = video_get_drvdata(vdev);
+
+ pos = cam->framebuf;
+ while (size > 0) {
+ if (vm_insert_page(vma, start, vmalloc_to_page(pos)))
+ return -EAGAIN;
+ start += PAGE_SIZE;
+ pos += PAGE_SIZE;
+ if (size > PAGE_SIZE)
+ size -= PAGE_SIZE;
+ else
+ size = 0;
+ }
+
+ return 0;
+}
+
+
+static struct file_operations zr364xx_fops = {
+ .owner = THIS_MODULE,
+ .open = zr364xx_open,
+ .release = zr364xx_release,
+ .read = zr364xx_read,
+ .mmap = zr364xx_mmap,
+ .ioctl = video_ioctl2,
+ .llseek = no_llseek,
+};
+
+static struct video_device zr364xx_template = {
+ .owner = THIS_MODULE,
+ .name = DRIVER_DESC,
+ .type = VID_TYPE_CAPTURE,
+ .fops = &zr364xx_fops,
+ .release = video_device_release,
+ .minor = -1,
+
+ .vidioc_querycap = zr364xx_vidioc_querycap,
+ .vidioc_enum_fmt_cap = zr364xx_vidioc_enum_fmt_cap,
+ .vidioc_try_fmt_cap = zr364xx_vidioc_try_fmt_cap,
+ .vidioc_s_fmt_cap = zr364xx_vidioc_s_fmt_cap,
+ .vidioc_g_fmt_cap = zr364xx_vidioc_g_fmt_cap,
+ .vidioc_enum_input = zr364xx_vidioc_enum_input,
+ .vidioc_g_input = zr364xx_vidioc_g_input,
+ .vidioc_s_input = zr364xx_vidioc_s_input,
+ .vidioc_streamon = zr364xx_vidioc_streamon,
+ .vidioc_streamoff = zr364xx_vidioc_streamoff,
+ .vidioc_queryctrl = zr364xx_vidioc_queryctrl,
+ .vidioc_g_ctrl = zr364xx_vidioc_g_ctrl,
+ .vidioc_s_ctrl = zr364xx_vidioc_s_ctrl,
+};
+
+
+
+/*******************/
+/* USB integration */
+/*******************/
+
+static int zr364xx_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+ struct usb_device *udev = interface_to_usbdev(intf);
+ struct zr364xx_camera *cam = NULL;
+
+ DBG("probing...");
+
+ info(DRIVER_DESC " compatible webcam plugged");
+ info("model %04x:%04x detected", udev->descriptor.idVendor,
+ udev->descriptor.idProduct);
+
+ if ((cam =
+ kmalloc(sizeof(struct zr364xx_camera), GFP_KERNEL)) == NULL) {
+ info("cam: out of memory !");
+ return -ENODEV;
+ }
+ memset(cam, 0x00, sizeof(struct zr364xx_camera));
+ /* save the init method used by this camera */
+ cam->method = id->driver_info;
+
+ cam->vdev = video_device_alloc();
+ if (cam->vdev == NULL) {
+ info("cam->vdev: out of memory !");
+ kfree(cam);
+ return -ENODEV;
+ }
+ memcpy(cam->vdev, &zr364xx_template, sizeof(zr364xx_template));
+ video_set_drvdata(cam->vdev, cam);
+
+ cam->udev = udev;
+
+ if ((cam->buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL)) == NULL) {
+ info("cam->buffer: out of memory !");
+ video_device_release(cam->vdev);
+ kfree(cam);
+ return -ENODEV;
+ }
+
+ switch (mode) {
+ case 1:
+ info("160x120 mode selected");
+ cam->width = 160;
+ cam->height = 120;
+ break;
+ case 2:
+ info("640x480 mode selected");
+ cam->width = 640;
+ cam->height = 480;
+ break;
+ default:
+ info("320x240 mode selected");
+ cam->width = 320;
+ cam->height = 240;
+ break;
+ }
+
+ m0d1[0] = mode;
+ m1[2].value = 0xf000 + mode;
+ m2[1].value = 0xf000 + mode;
+#ifdef __LITTLE_ENDIAN
+ header2[437] = cam->height / 256;
+ header2[438] = cam->height % 256;
+ header2[439] = cam->width / 256;
+ header2[440] = cam->width % 256;
+#else
+ header2[437] = cam->height % 256;
+ header2[438] = cam->height / 256;
+ header2[439] = cam->width % 256;
+ header2[440] = cam->width / 256;
+#endif
+
+ cam->nb = 0;
+ cam->brightness = 64;
+ mutex_init(&cam->lock);
+
+ if (video_register_device(cam->vdev, VFL_TYPE_GRABBER, -1) == -1) {
+ info("video_register_device failed");
+ video_device_release(cam->vdev);
+ kfree(cam->buffer);
+ kfree(cam);
+ return -ENODEV;
+ }
+
+ usb_set_intfdata(intf, cam);
+
+ info(DRIVER_DESC " controlling video device %d", cam->vdev->minor);
+ return 0;
+}
+
+
+static void zr364xx_disconnect(struct usb_interface *intf)
+{
+ struct zr364xx_camera *cam = usb_get_intfdata(intf);
+ usb_set_intfdata(intf, NULL);
+ dev_set_drvdata(&intf->dev, NULL);
+ info(DRIVER_DESC " webcam unplugged");
+ if (cam->vdev)
+ video_unregister_device(cam->vdev);
+ cam->vdev = NULL;
+ kfree(cam->buffer);
+ if (cam->framebuf)
+ vfree(cam->framebuf);
+ kfree(cam);
+}
+
+
+
+/**********************/
+/* Module integration */
+/**********************/
+
+static struct usb_driver zr364xx_driver = {
+ .name = "zr364xx",
+ .probe = zr364xx_probe,
+ .disconnect = zr364xx_disconnect,
+ .id_table = device_table
+};
+
+
+static int __init zr364xx_init(void)
+{
+ int retval;
+ retval = usb_register(&zr364xx_driver) < 0;
+ if (retval)
+ info("usb_register failed!");
+ else
+ info(DRIVER_DESC " module loaded");
+ return retval;
+}
+
+
+static void __exit zr364xx_exit(void)
+{
+ info(DRIVER_DESC " module unloaded");
+ usb_deregister(&zr364xx_driver);
+}
+
+
+module_init(zr364xx_init);
+module_exit(zr364xx_exit);
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL");