Commit 51c555690d16d1d1354ee9b5a3c9098766702094

Authored by Amerigo Wang
Committed by Mauro Carvalho Chehab
1 parent 7373ab3669

V4L/DVB: Remove obsolete w9968cf v4l1 driver

>From a97df96226e89d3539be93ddb5a8df3a2f7edcb6 Mon Sep 17 00:00:00 2001

obsolete v4l1 driver replaced by gspca_ov519

Signed-off-by: Amerigo Wang <amwang@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

Showing 7 changed files with 0 additions and 4109 deletions Side-by-side Diff

Documentation/feature-removal-schedule.txt
... ... @@ -459,14 +459,6 @@
459 459  
460 460 ----------------------------
461 461  
462   -What: w9968cf v4l1 driver
463   -When: 2.6.35
464   -Files: drivers/media/video/w9968cf*.[ch]
465   -Why: obsolete v4l1 driver replaced by gspca_ov519
466   -Who: Hans de Goede <hdegoede@redhat.com>
467   -
468   -----------------------------
469   -
470 462 What: ovcamchip sensor framework
471 463 When: 2.6.35
472 464 Files: drivers/media/video/ovcamchip/*
drivers/media/video/Kconfig
... ... @@ -1018,28 +1018,6 @@
1018 1018 To compile this driver as a module, choose M here: the
1019 1019 module will be called ovcamchip.
1020 1020  
1021   -config USB_W9968CF
1022   - tristate "USB W996[87]CF JPEG Dual Mode Camera support (DEPRECATED)"
1023   - depends on VIDEO_V4L1 && I2C && VIDEO_OVCAMCHIP
1024   - default n
1025   - ---help---
1026   - This driver is DEPRECATED please use the gspca ov519 module
1027   - instead. Note that for the w9968cf support of the gspca module
1028   - you need atleast version 0.6.3 of libv4l.
1029   -
1030   - Say Y here if you want support for cameras based on OV681 or
1031   - Winbond W9967CF/W9968CF JPEG USB Dual Mode Camera Chips.
1032   -
1033   - This driver has an optional plugin, which is distributed as a
1034   - separate module only (released under GPL). It allows to use higher
1035   - resolutions and framerates, but cannot be included in the official
1036   - Linux kernel for performance purposes.
1037   -
1038   - See <file:Documentation/video4linux/w9968cf.txt> for more info.
1039   -
1040   - To compile this driver as a module, choose M here: the
1041   - module will be called w9968cf.
1042   -
1043 1021 config USB_SE401
1044 1022 tristate "USB SE401 Camera support"
1045 1023 depends on VIDEO_V4L1
drivers/media/video/Makefile
... ... @@ -129,7 +129,6 @@
129 129 obj-$(CONFIG_USB_DABUSB) += dabusb.o
130 130 obj-$(CONFIG_USB_SE401) += se401.o
131 131 obj-$(CONFIG_USB_STV680) += stv680.o
132   -obj-$(CONFIG_USB_W9968CF) += w9968cf.o
133 132 obj-$(CONFIG_USB_ZR364XX) += zr364xx.o
134 133 obj-$(CONFIG_USB_STKWEBCAM) += stkwebcam.o
135 134  
drivers/media/video/w9968cf.c
Changes suppressed. Click to show
1   -/***************************************************************************
2   - * Video4Linux driver for W996[87]CF JPEG USB Dual Mode Camera Chip. *
3   - * *
4   - * Copyright (C) 2002-2004 by Luca Risolia <luca.risolia@studio.unibo.it> *
5   - * *
6   - * - Memory management code from bttv driver by Ralph Metzler, *
7   - * Marcus Metzler and Gerd Knorr. *
8   - * - I2C interface to kernel, high-level image sensor control routines and *
9   - * some symbolic names from OV511 driver by Mark W. McClelland. *
10   - * - Low-level I2C fast write function by Piotr Czerczak. *
11   - * - Low-level I2C read function by Frederic Jouault. *
12   - * *
13   - * This program is free software; you can redistribute it and/or modify *
14   - * it under the terms of the GNU General Public License as published by *
15   - * the Free Software Foundation; either version 2 of the License, or *
16   - * (at your option) any later version. *
17   - * *
18   - * This program is distributed in the hope that it will be useful, *
19   - * but WITHOUT ANY WARRANTY; without even the implied warranty of *
20   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
21   - * GNU General Public License for more details. *
22   - * *
23   - * You should have received a copy of the GNU General Public License *
24   - * along with this program; if not, write to the Free Software *
25   - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
26   - ***************************************************************************/
27   -
28   -#include <linux/module.h>
29   -#include <linux/kernel.h>
30   -#include <linux/kmod.h>
31   -#include <linux/init.h>
32   -#include <linux/fs.h>
33   -#include <linux/vmalloc.h>
34   -#include <linux/slab.h>
35   -#include <linux/mm.h>
36   -#include <linux/string.h>
37   -#include <linux/errno.h>
38   -#include <linux/sched.h>
39   -#include <linux/ioctl.h>
40   -#include <linux/delay.h>
41   -#include <linux/stddef.h>
42   -#include <asm/page.h>
43   -#include <asm/uaccess.h>
44   -#include <linux/page-flags.h>
45   -#include <linux/videodev.h>
46   -#include <media/v4l2-ioctl.h>
47   -
48   -#include "w9968cf.h"
49   -#include "w9968cf_decoder.h"
50   -
51   -static struct w9968cf_vpp_t* w9968cf_vpp;
52   -static DECLARE_WAIT_QUEUE_HEAD(w9968cf_vppmod_wait);
53   -
54   -static LIST_HEAD(w9968cf_dev_list); /* head of V4L registered cameras list */
55   -static DEFINE_MUTEX(w9968cf_devlist_mutex); /* semaphore for list traversal */
56   -
57   -static DECLARE_RWSEM(w9968cf_disconnect); /* prevent races with open() */
58   -
59   -
60   -/****************************************************************************
61   - * Module macros and parameters *
62   - ****************************************************************************/
63   -
64   -MODULE_DEVICE_TABLE(usb, winbond_id_table);
65   -
66   -MODULE_AUTHOR(W9968CF_MODULE_AUTHOR" "W9968CF_AUTHOR_EMAIL);
67   -MODULE_DESCRIPTION(W9968CF_MODULE_NAME);
68   -MODULE_VERSION(W9968CF_MODULE_VERSION);
69   -MODULE_LICENSE(W9968CF_MODULE_LICENSE);
70   -MODULE_SUPPORTED_DEVICE("Video");
71   -
72   -static unsigned short simcams = W9968CF_SIMCAMS;
73   -static short video_nr[]={[0 ... W9968CF_MAX_DEVICES-1] = -1}; /*-1=first free*/
74   -static unsigned int packet_size[] = {[0 ... W9968CF_MAX_DEVICES-1] =
75   - W9968CF_PACKET_SIZE};
76   -static unsigned short max_buffers[] = {[0 ... W9968CF_MAX_DEVICES-1] =
77   - W9968CF_BUFFERS};
78   -static int double_buffer[] = {[0 ... W9968CF_MAX_DEVICES-1] =
79   - W9968CF_DOUBLE_BUFFER};
80   -static int clamping[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_CLAMPING};
81   -static unsigned short filter_type[]= {[0 ... W9968CF_MAX_DEVICES-1] =
82   - W9968CF_FILTER_TYPE};
83   -static int largeview[]= {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_LARGEVIEW};
84   -static unsigned short decompression[] = {[0 ... W9968CF_MAX_DEVICES-1] =
85   - W9968CF_DECOMPRESSION};
86   -static int upscaling[]= {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_UPSCALING};
87   -static unsigned short force_palette[] = {[0 ... W9968CF_MAX_DEVICES-1] = 0};
88   -static int force_rgb[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_FORCE_RGB};
89   -static int autobright[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_AUTOBRIGHT};
90   -static int autoexp[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_AUTOEXP};
91   -static unsigned short lightfreq[] = {[0 ... W9968CF_MAX_DEVICES-1] =
92   - W9968CF_LIGHTFREQ};
93   -static int bandingfilter[] = {[0 ... W9968CF_MAX_DEVICES-1]=
94   - W9968CF_BANDINGFILTER};
95   -static short clockdiv[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_CLOCKDIV};
96   -static int backlight[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_BACKLIGHT};
97   -static int mirror[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_MIRROR};
98   -static int monochrome[] = {[0 ... W9968CF_MAX_DEVICES-1]=W9968CF_MONOCHROME};
99   -static unsigned int brightness[] = {[0 ... W9968CF_MAX_DEVICES-1] =
100   - W9968CF_BRIGHTNESS};
101   -static unsigned int hue[] = {[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_HUE};
102   -static unsigned int colour[]={[0 ... W9968CF_MAX_DEVICES-1] = W9968CF_COLOUR};
103   -static unsigned int contrast[] = {[0 ... W9968CF_MAX_DEVICES-1] =
104   - W9968CF_CONTRAST};
105   -static unsigned int whiteness[] = {[0 ... W9968CF_MAX_DEVICES-1] =
106   - W9968CF_WHITENESS};
107   -#ifdef W9968CF_DEBUG
108   -static unsigned short debug = W9968CF_DEBUG_LEVEL;
109   -static int specific_debug = W9968CF_SPECIFIC_DEBUG;
110   -#endif
111   -
112   -static unsigned int param_nv[24]; /* number of values per parameter */
113   -
114   -module_param(simcams, ushort, 0644);
115   -module_param_array(video_nr, short, &param_nv[0], 0444);
116   -module_param_array(packet_size, uint, &param_nv[1], 0444);
117   -module_param_array(max_buffers, ushort, &param_nv[2], 0444);
118   -module_param_array(double_buffer, bool, &param_nv[3], 0444);
119   -module_param_array(clamping, bool, &param_nv[4], 0444);
120   -module_param_array(filter_type, ushort, &param_nv[5], 0444);
121   -module_param_array(largeview, bool, &param_nv[6], 0444);
122   -module_param_array(decompression, ushort, &param_nv[7], 0444);
123   -module_param_array(upscaling, bool, &param_nv[8], 0444);
124   -module_param_array(force_palette, ushort, &param_nv[9], 0444);
125   -module_param_array(force_rgb, ushort, &param_nv[10], 0444);
126   -module_param_array(autobright, bool, &param_nv[11], 0444);
127   -module_param_array(autoexp, bool, &param_nv[12], 0444);
128   -module_param_array(lightfreq, ushort, &param_nv[13], 0444);
129   -module_param_array(bandingfilter, bool, &param_nv[14], 0444);
130   -module_param_array(clockdiv, short, &param_nv[15], 0444);
131   -module_param_array(backlight, bool, &param_nv[16], 0444);
132   -module_param_array(mirror, bool, &param_nv[17], 0444);
133   -module_param_array(monochrome, bool, &param_nv[18], 0444);
134   -module_param_array(brightness, uint, &param_nv[19], 0444);
135   -module_param_array(hue, uint, &param_nv[20], 0444);
136   -module_param_array(colour, uint, &param_nv[21], 0444);
137   -module_param_array(contrast, uint, &param_nv[22], 0444);
138   -module_param_array(whiteness, uint, &param_nv[23], 0444);
139   -#ifdef W9968CF_DEBUG
140   -module_param(debug, ushort, 0644);
141   -module_param(specific_debug, bool, 0644);
142   -#endif
143   -
144   -MODULE_PARM_DESC(simcams,
145   - "\n<n> Number of cameras allowed to stream simultaneously."
146   - "\nn may vary from 0 to "
147   - __MODULE_STRING(W9968CF_MAX_DEVICES)"."
148   - "\nDefault value is "__MODULE_STRING(W9968CF_SIMCAMS)"."
149   - "\n");
150   -MODULE_PARM_DESC(video_nr,
151   - "\n<-1|n[,...]> Specify V4L minor mode number."
152   - "\n -1 = use next available (default)"
153   - "\n n = use minor number n (integer >= 0)"
154   - "\nYou can specify up to "__MODULE_STRING(W9968CF_MAX_DEVICES)
155   - " cameras this way."
156   - "\nFor example:"
157   - "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
158   - "\nthe second camera and use auto for the first"
159   - "\none and for every other camera."
160   - "\n");
161   -MODULE_PARM_DESC(packet_size,
162   - "\n<n[,...]> Specify the maximum data payload"
163   - "\nsize in bytes for alternate settings, for each device."
164   - "\nn is scaled between 63 and 1023 "
165   - "(default is "__MODULE_STRING(W9968CF_PACKET_SIZE)")."
166   - "\n");
167   -MODULE_PARM_DESC(max_buffers,
168   - "\n<n[,...]> For advanced users."
169   - "\nSpecify the maximum number of video frame buffers"
170   - "\nto allocate for each device, from 2 to "
171   - __MODULE_STRING(W9968CF_MAX_BUFFERS)
172   - ". (default is "__MODULE_STRING(W9968CF_BUFFERS)")."
173   - "\n");
174   -MODULE_PARM_DESC(double_buffer,
175   - "\n<0|1[,...]> "
176   - "Hardware double buffering: 0 disabled, 1 enabled."
177   - "\nIt should be enabled if you want smooth video output: if"
178   - "\nyou obtain out of sync. video, disable it, or try to"
179   - "\ndecrease the 'clockdiv' module parameter value."
180   - "\nDefault value is "__MODULE_STRING(W9968CF_DOUBLE_BUFFER)
181   - " for every device."
182   - "\n");
183   -MODULE_PARM_DESC(clamping,
184   - "\n<0|1[,...]> Video data clamping: 0 disabled, 1 enabled."
185   - "\nDefault value is "__MODULE_STRING(W9968CF_CLAMPING)
186   - " for every device."
187   - "\n");
188   -MODULE_PARM_DESC(filter_type,
189   - "\n<0|1|2[,...]> Video filter type."
190   - "\n0 none, 1 (1-2-1) 3-tap filter, "
191   - "2 (2-3-6-3-2) 5-tap filter."
192   - "\nDefault value is "__MODULE_STRING(W9968CF_FILTER_TYPE)
193   - " for every device."
194   - "\nThe filter is used to reduce noise and aliasing artifacts"
195   - "\nproduced by the CCD or CMOS image sensor, and the scaling"
196   - " process."
197   - "\n");
198   -MODULE_PARM_DESC(largeview,
199   - "\n<0|1[,...]> Large view: 0 disabled, 1 enabled."
200   - "\nDefault value is "__MODULE_STRING(W9968CF_LARGEVIEW)
201   - " for every device."
202   - "\n");
203   -MODULE_PARM_DESC(upscaling,
204   - "\n<0|1[,...]> Software scaling (for non-compressed video):"
205   - "\n0 disabled, 1 enabled."
206   - "\nDisable it if you have a slow CPU or you don't have"
207   - " enough memory."
208   - "\nDefault value is "__MODULE_STRING(W9968CF_UPSCALING)
209   - " for every device."
210   - "\nIf 'w9968cf-vpp' is not present, this parameter is"
211   - " set to 0."
212   - "\n");
213   -MODULE_PARM_DESC(decompression,
214   - "\n<0|1|2[,...]> Software video decompression:"
215   - "\n- 0 disables decompression (doesn't allow formats needing"
216   - " decompression)"
217   - "\n- 1 forces decompression (allows formats needing"
218   - " decompression only);"
219   - "\n- 2 allows any permitted formats."
220   - "\nFormats supporting compressed video are YUV422P and"
221   - " YUV420P/YUV420 "
222   - "\nin any resolutions where both width and height are "
223   - "a multiple of 16."
224   - "\nDefault value is "__MODULE_STRING(W9968CF_DECOMPRESSION)
225   - " for every device."
226   - "\nIf 'w9968cf-vpp' is not present, forcing decompression is "
227   - "\nnot allowed; in this case this parameter is set to 2."
228   - "\n");
229   -MODULE_PARM_DESC(force_palette,
230   - "\n<0"
231   - "|" __MODULE_STRING(VIDEO_PALETTE_UYVY)
232   - "|" __MODULE_STRING(VIDEO_PALETTE_YUV420)
233   - "|" __MODULE_STRING(VIDEO_PALETTE_YUV422P)
234   - "|" __MODULE_STRING(VIDEO_PALETTE_YUV420P)
235   - "|" __MODULE_STRING(VIDEO_PALETTE_YUYV)
236   - "|" __MODULE_STRING(VIDEO_PALETTE_YUV422)
237   - "|" __MODULE_STRING(VIDEO_PALETTE_GREY)
238   - "|" __MODULE_STRING(VIDEO_PALETTE_RGB555)
239   - "|" __MODULE_STRING(VIDEO_PALETTE_RGB565)
240   - "|" __MODULE_STRING(VIDEO_PALETTE_RGB24)
241   - "|" __MODULE_STRING(VIDEO_PALETTE_RGB32)
242   - "[,...]>"
243   - " Force picture palette."
244   - "\nIn order:"
245   - "\n- 0 allows any of the following formats:"
246   - "\n- UYVY 16 bpp - Original video, compression disabled"
247   - "\n- YUV420 12 bpp - Original video, compression enabled"
248   - "\n- YUV422P 16 bpp - Original video, compression enabled"
249   - "\n- YUV420P 12 bpp - Original video, compression enabled"
250   - "\n- YUVY 16 bpp - Software conversion from UYVY"
251   - "\n- YUV422 16 bpp - Software conversion from UYVY"
252   - "\n- GREY 8 bpp - Software conversion from UYVY"
253   - "\n- RGB555 16 bpp - Software conversion from UYVY"
254   - "\n- RGB565 16 bpp - Software conversion from UYVY"
255   - "\n- RGB24 24 bpp - Software conversion from UYVY"
256   - "\n- RGB32 32 bpp - Software conversion from UYVY"
257   - "\nWhen not 0, this parameter will override 'decompression'."
258   - "\nDefault value is 0 for every device."
259   - "\nInitial palette is "
260   - __MODULE_STRING(W9968CF_PALETTE_DECOMP_ON)"."
261   - "\nIf 'w9968cf-vpp' is not present, this parameter is"
262   - " set to 9 (UYVY)."
263   - "\n");
264   -MODULE_PARM_DESC(force_rgb,
265   - "\n<0|1[,...]> Read RGB video data instead of BGR:"
266   - "\n 1 = use RGB component ordering."
267   - "\n 0 = use BGR component ordering."
268   - "\nThis parameter has effect when using RGBX palettes only."
269   - "\nDefault value is "__MODULE_STRING(W9968CF_FORCE_RGB)
270   - " for every device."
271   - "\n");
272   -MODULE_PARM_DESC(autobright,
273   - "\n<0|1[,...]> Image sensor automatically changes brightness:"
274   - "\n 0 = no, 1 = yes"
275   - "\nDefault value is "__MODULE_STRING(W9968CF_AUTOBRIGHT)
276   - " for every device."
277   - "\n");
278   -MODULE_PARM_DESC(autoexp,
279   - "\n<0|1[,...]> Image sensor automatically changes exposure:"
280   - "\n 0 = no, 1 = yes"
281   - "\nDefault value is "__MODULE_STRING(W9968CF_AUTOEXP)
282   - " for every device."
283   - "\n");
284   -MODULE_PARM_DESC(lightfreq,
285   - "\n<50|60[,...]> Light frequency in Hz:"
286   - "\n 50 for European and Asian lighting,"
287   - " 60 for American lighting."
288   - "\nDefault value is "__MODULE_STRING(W9968CF_LIGHTFREQ)
289   - " for every device."
290   - "\n");
291   -MODULE_PARM_DESC(bandingfilter,
292   - "\n<0|1[,...]> Banding filter to reduce effects of"
293   - " fluorescent lighting:"
294   - "\n 0 disabled, 1 enabled."
295   - "\nThis filter tries to reduce the pattern of horizontal"
296   - "\nlight/dark bands caused by some (usually fluorescent)"
297   - " lighting."
298   - "\nDefault value is "__MODULE_STRING(W9968CF_BANDINGFILTER)
299   - " for every device."
300   - "\n");
301   -MODULE_PARM_DESC(clockdiv,
302   - "\n<-1|n[,...]> "
303   - "Force pixel clock divisor to a specific value (for experts):"
304   - "\n n may vary from 0 to 127."
305   - "\n -1 for automatic value."
306   - "\nSee also the 'double_buffer' module parameter."
307   - "\nDefault value is "__MODULE_STRING(W9968CF_CLOCKDIV)
308   - " for every device."
309   - "\n");
310   -MODULE_PARM_DESC(backlight,
311   - "\n<0|1[,...]> Objects are lit from behind:"
312   - "\n 0 = no, 1 = yes"
313   - "\nDefault value is "__MODULE_STRING(W9968CF_BACKLIGHT)
314   - " for every device."
315   - "\n");
316   -MODULE_PARM_DESC(mirror,
317   - "\n<0|1[,...]> Reverse image horizontally:"
318   - "\n 0 = no, 1 = yes"
319   - "\nDefault value is "__MODULE_STRING(W9968CF_MIRROR)
320   - " for every device."
321   - "\n");
322   -MODULE_PARM_DESC(monochrome,
323   - "\n<0|1[,...]> Use image sensor as monochrome sensor:"
324   - "\n 0 = no, 1 = yes"
325   - "\nNot all the sensors support monochrome color."
326   - "\nDefault value is "__MODULE_STRING(W9968CF_MONOCHROME)
327   - " for every device."
328   - "\n");
329   -MODULE_PARM_DESC(brightness,
330   - "\n<n[,...]> Set picture brightness (0-65535)."
331   - "\nDefault value is "__MODULE_STRING(W9968CF_BRIGHTNESS)
332   - " for every device."
333   - "\nThis parameter has no effect if 'autobright' is enabled."
334   - "\n");
335   -MODULE_PARM_DESC(hue,
336   - "\n<n[,...]> Set picture hue (0-65535)."
337   - "\nDefault value is "__MODULE_STRING(W9968CF_HUE)
338   - " for every device."
339   - "\n");
340   -MODULE_PARM_DESC(colour,
341   - "\n<n[,...]> Set picture saturation (0-65535)."
342   - "\nDefault value is "__MODULE_STRING(W9968CF_COLOUR)
343   - " for every device."
344   - "\n");
345   -MODULE_PARM_DESC(contrast,
346   - "\n<n[,...]> Set picture contrast (0-65535)."
347   - "\nDefault value is "__MODULE_STRING(W9968CF_CONTRAST)
348   - " for every device."
349   - "\n");
350   -MODULE_PARM_DESC(whiteness,
351   - "\n<n[,...]> Set picture whiteness (0-65535)."
352   - "\nDefault value is "__MODULE_STRING(W9968CF_WHITENESS)
353   - " for every device."
354   - "\n");
355   -#ifdef W9968CF_DEBUG
356   -MODULE_PARM_DESC(debug,
357   - "\n<n> Debugging information level, from 0 to 6:"
358   - "\n0 = none (use carefully)"
359   - "\n1 = critical errors"
360   - "\n2 = significant informations"
361   - "\n3 = configuration or general messages"
362   - "\n4 = warnings"
363   - "\n5 = called functions"
364   - "\n6 = function internals"
365   - "\nLevel 5 and 6 are useful for testing only, when only "
366   - "one device is used."
367   - "\nDefault value is "__MODULE_STRING(W9968CF_DEBUG_LEVEL)"."
368   - "\n");
369   -MODULE_PARM_DESC(specific_debug,
370   - "\n<0|1> Enable or disable specific debugging messages:"
371   - "\n0 = print messages concerning every level"
372   - " <= 'debug' level."
373   - "\n1 = print messages concerning the level"
374   - " indicated by 'debug'."
375   - "\nDefault value is "
376   - __MODULE_STRING(W9968CF_SPECIFIC_DEBUG)"."
377   - "\n");
378   -#endif /* W9968CF_DEBUG */
379   -
380   -
381   -
382   -/****************************************************************************
383   - * Some prototypes *
384   - ****************************************************************************/
385   -
386   -/* Video4linux interface */
387   -static const struct v4l2_file_operations w9968cf_fops;
388   -static int w9968cf_open(struct file *);
389   -static int w9968cf_release(struct file *);
390   -static int w9968cf_mmap(struct file *, struct vm_area_struct *);
391   -static long w9968cf_ioctl(struct file *, unsigned, unsigned long);
392   -static ssize_t w9968cf_read(struct file *, char __user *, size_t, loff_t *);
393   -static long w9968cf_v4l_ioctl(struct file *, unsigned int,
394   - void __user *);
395   -
396   -/* USB-specific */
397   -static int w9968cf_start_transfer(struct w9968cf_device*);
398   -static int w9968cf_stop_transfer(struct w9968cf_device*);
399   -static int w9968cf_write_reg(struct w9968cf_device*, u16 value, u16 index);
400   -static int w9968cf_read_reg(struct w9968cf_device*, u16 index);
401   -static int w9968cf_write_fsb(struct w9968cf_device*, u16* data);
402   -static int w9968cf_write_sb(struct w9968cf_device*, u16 value);
403   -static int w9968cf_read_sb(struct w9968cf_device*);
404   -static int w9968cf_upload_quantizationtables(struct w9968cf_device*);
405   -static void w9968cf_urb_complete(struct urb *urb);
406   -
407   -/* Low-level I2C (SMBus) I/O */
408   -static int w9968cf_smbus_start(struct w9968cf_device*);
409   -static int w9968cf_smbus_stop(struct w9968cf_device*);
410   -static int w9968cf_smbus_write_byte(struct w9968cf_device*, u8 v);
411   -static int w9968cf_smbus_read_byte(struct w9968cf_device*, u8* v);
412   -static int w9968cf_smbus_write_ack(struct w9968cf_device*);
413   -static int w9968cf_smbus_read_ack(struct w9968cf_device*);
414   -static int w9968cf_smbus_refresh_bus(struct w9968cf_device*);
415   -static int w9968cf_i2c_adap_read_byte(struct w9968cf_device* cam,
416   - u16 address, u8* value);
417   -static int w9968cf_i2c_adap_read_byte_data(struct w9968cf_device*, u16 address,
418   - u8 subaddress, u8* value);
419   -static int w9968cf_i2c_adap_write_byte(struct w9968cf_device*,
420   - u16 address, u8 subaddress);
421   -static int w9968cf_i2c_adap_fastwrite_byte_data(struct w9968cf_device*,
422   - u16 address, u8 subaddress,
423   - u8 value);
424   -
425   -/* I2C interface to kernel */
426   -static int w9968cf_i2c_init(struct w9968cf_device*);
427   -static int w9968cf_i2c_smbus_xfer(struct i2c_adapter*, u16 addr,
428   - unsigned short flags, char read_write,
429   - u8 command, int size, union i2c_smbus_data*);
430   -static u32 w9968cf_i2c_func(struct i2c_adapter*);
431   -
432   -/* Memory management */
433   -static void* rvmalloc(unsigned long size);
434   -static void rvfree(void *mem, unsigned long size);
435   -static void w9968cf_deallocate_memory(struct w9968cf_device*);
436   -static int w9968cf_allocate_memory(struct w9968cf_device*);
437   -
438   -/* High-level image sensor control functions */
439   -static int w9968cf_sensor_set_control(struct w9968cf_device*,int cid,int val);
440   -static int w9968cf_sensor_get_control(struct w9968cf_device*,int cid,int *val);
441   -static int w9968cf_sensor_cmd(struct w9968cf_device*,
442   - unsigned int cmd, void *arg);
443   -static int w9968cf_sensor_init(struct w9968cf_device*);
444   -static int w9968cf_sensor_update_settings(struct w9968cf_device*);
445   -static int w9968cf_sensor_get_picture(struct w9968cf_device*);
446   -static int w9968cf_sensor_update_picture(struct w9968cf_device*,
447   - struct video_picture pict);
448   -
449   -/* Other helper functions */
450   -static void w9968cf_configure_camera(struct w9968cf_device*,struct usb_device*,
451   - enum w9968cf_model_id,
452   - const unsigned short dev_nr);
453   -static void w9968cf_adjust_configuration(struct w9968cf_device*);
454   -static int w9968cf_turn_on_led(struct w9968cf_device*);
455   -static int w9968cf_init_chip(struct w9968cf_device*);
456   -static inline u16 w9968cf_valid_palette(u16 palette);
457   -static inline u16 w9968cf_valid_depth(u16 palette);
458   -static inline u8 w9968cf_need_decompression(u16 palette);
459   -static int w9968cf_set_picture(struct w9968cf_device*, struct video_picture);
460   -static int w9968cf_set_window(struct w9968cf_device*, struct video_window);
461   -static int w9968cf_postprocess_frame(struct w9968cf_device*,
462   - struct w9968cf_frame_t*);
463   -static int w9968cf_adjust_window_size(struct w9968cf_device*, u32 *w, u32 *h);
464   -static void w9968cf_init_framelist(struct w9968cf_device*);
465   -static void w9968cf_push_frame(struct w9968cf_device*, u8 f_num);
466   -static void w9968cf_pop_frame(struct w9968cf_device*,struct w9968cf_frame_t**);
467   -static void w9968cf_release_resources(struct w9968cf_device*);
468   -
469   -
470   -
471   -/****************************************************************************
472   - * Symbolic names *
473   - ****************************************************************************/
474   -
475   -/* Used to represent a list of values and their respective symbolic names */
476   -struct w9968cf_symbolic_list {
477   - const int num;
478   - const char *name;
479   -};
480   -
481   -/*--------------------------------------------------------------------------
482   - Returns the name of the matching element in the symbolic_list array. The
483   - end of the list must be marked with an element that has a NULL name.
484   - --------------------------------------------------------------------------*/
485   -static inline const char *
486   -symbolic(struct w9968cf_symbolic_list list[], const int num)
487   -{
488   - int i;
489   -
490   - for (i = 0; list[i].name != NULL; i++)
491   - if (list[i].num == num)
492   - return (list[i].name);
493   -
494   - return "Unknown";
495   -}
496   -
497   -static struct w9968cf_symbolic_list camlist[] = {
498   - { W9968CF_MOD_GENERIC, "W996[87]CF JPEG USB Dual Mode Camera" },
499   - { W9968CF_MOD_CLVBWGP, "Creative Labs Video Blaster WebCam Go Plus" },
500   -
501   - /* Other cameras (having the same descriptors as Generic W996[87]CF) */
502   - { W9968CF_MOD_ADPVDMA, "Aroma Digi Pen VGA Dual Mode ADG-5000" },
503   - { W9986CF_MOD_AAU, "AVerMedia AVerTV USB" },
504   - { W9968CF_MOD_CLVBWG, "Creative Labs Video Blaster WebCam Go" },
505   - { W9968CF_MOD_LL, "Lebon LDC-035A" },
506   - { W9968CF_MOD_EEEMC, "Ezonics EZ-802 EZMega Cam" },
507   - { W9968CF_MOD_OOE, "OmniVision OV8610-EDE" },
508   - { W9968CF_MOD_ODPVDMPC, "OPCOM Digi Pen VGA Dual Mode Pen Camera" },
509   - { W9968CF_MOD_PDPII, "Pretec Digi Pen-II" },
510   - { W9968CF_MOD_PDP480, "Pretec DigiPen-480" },
511   -
512   - { -1, NULL }
513   -};
514   -
515   -static struct w9968cf_symbolic_list senlist[] = {
516   - { CC_OV76BE, "OV76BE" },
517   - { CC_OV7610, "OV7610" },
518   - { CC_OV7620, "OV7620" },
519   - { CC_OV7620AE, "OV7620AE" },
520   - { CC_OV6620, "OV6620" },
521   - { CC_OV6630, "OV6630" },
522   - { CC_OV6630AE, "OV6630AE" },
523   - { CC_OV6630AF, "OV6630AF" },
524   - { -1, NULL }
525   -};
526   -
527   -/* Video4Linux1 palettes */
528   -static struct w9968cf_symbolic_list v4l1_plist[] = {
529   - { VIDEO_PALETTE_GREY, "GREY" },
530   - { VIDEO_PALETTE_HI240, "HI240" },
531   - { VIDEO_PALETTE_RGB565, "RGB565" },
532   - { VIDEO_PALETTE_RGB24, "RGB24" },
533   - { VIDEO_PALETTE_RGB32, "RGB32" },
534   - { VIDEO_PALETTE_RGB555, "RGB555" },
535   - { VIDEO_PALETTE_YUV422, "YUV422" },
536   - { VIDEO_PALETTE_YUYV, "YUYV" },
537   - { VIDEO_PALETTE_UYVY, "UYVY" },
538   - { VIDEO_PALETTE_YUV420, "YUV420" },
539   - { VIDEO_PALETTE_YUV411, "YUV411" },
540   - { VIDEO_PALETTE_RAW, "RAW" },
541   - { VIDEO_PALETTE_YUV422P, "YUV422P" },
542   - { VIDEO_PALETTE_YUV411P, "YUV411P" },
543   - { VIDEO_PALETTE_YUV420P, "YUV420P" },
544   - { VIDEO_PALETTE_YUV410P, "YUV410P" },
545   - { -1, NULL }
546   -};
547   -
548   -/* Decoder error codes: */
549   -static struct w9968cf_symbolic_list decoder_errlist[] = {
550   - { W9968CF_DEC_ERR_CORRUPTED_DATA, "Corrupted data" },
551   - { W9968CF_DEC_ERR_BUF_OVERFLOW, "Buffer overflow" },
552   - { W9968CF_DEC_ERR_NO_SOI, "SOI marker not found" },
553   - { W9968CF_DEC_ERR_NO_SOF0, "SOF0 marker not found" },
554   - { W9968CF_DEC_ERR_NO_SOS, "SOS marker not found" },
555   - { W9968CF_DEC_ERR_NO_EOI, "EOI marker not found" },
556   - { -1, NULL }
557   -};
558   -
559   -/* URB error codes: */
560   -static struct w9968cf_symbolic_list urb_errlist[] = {
561   - { -ENOMEM, "No memory for allocation of internal structures" },
562   - { -ENOSPC, "The host controller's bandwidth is already consumed" },
563   - { -ENOENT, "URB was canceled by unlink_urb" },
564   - { -EXDEV, "ISO transfer only partially completed" },
565   - { -EAGAIN, "Too match scheduled for the future" },
566   - { -ENXIO, "URB already queued" },
567   - { -EFBIG, "Too much ISO frames requested" },
568   - { -ENOSR, "Buffer error (overrun)" },
569   - { -EPIPE, "Specified endpoint is stalled (device not responding)"},
570   - { -EOVERFLOW, "Babble (too much data)" },
571   - { -EPROTO, "Bit-stuff error (bad cable?)" },
572   - { -EILSEQ, "CRC/Timeout" },
573   - { -ETIME, "Device does not respond to token" },
574   - { -ETIMEDOUT, "Device does not respond to command" },
575   - { -1, NULL }
576   -};
577   -
578   -/****************************************************************************
579   - * Memory management functions *
580   - ****************************************************************************/
581   -static void* rvmalloc(unsigned long size)
582   -{
583   - void* mem;
584   - unsigned long adr;
585   -
586   - size = PAGE_ALIGN(size);
587   - mem = vmalloc_32(size);
588   - if (!mem)
589   - return NULL;
590   -
591   - memset(mem, 0, size); /* Clear the ram out, no junk to the user */
592   - adr = (unsigned long) mem;
593   - while (size > 0) {
594   - SetPageReserved(vmalloc_to_page((void *)adr));
595   - adr += PAGE_SIZE;
596   - size -= PAGE_SIZE;
597   - }
598   -
599   - return mem;
600   -}
601   -
602   -
603   -static void rvfree(void* mem, unsigned long size)
604   -{
605   - unsigned long adr;
606   -
607   - if (!mem)
608   - return;
609   -
610   - adr = (unsigned long) mem;
611   - while ((long) size > 0) {
612   - ClearPageReserved(vmalloc_to_page((void *)adr));
613   - adr += PAGE_SIZE;
614   - size -= PAGE_SIZE;
615   - }
616   - vfree(mem);
617   -}
618   -
619   -
620   -/*--------------------------------------------------------------------------
621   - Deallocate previously allocated memory.
622   - --------------------------------------------------------------------------*/
623   -static void w9968cf_deallocate_memory(struct w9968cf_device* cam)
624   -{
625   - u8 i;
626   -
627   - /* Free the isochronous transfer buffers */
628   - for (i = 0; i < W9968CF_URBS; i++) {
629   - kfree(cam->transfer_buffer[i]);
630   - cam->transfer_buffer[i] = NULL;
631   - }
632   -
633   - /* Free temporary frame buffer */
634   - if (cam->frame_tmp.buffer) {
635   - rvfree(cam->frame_tmp.buffer, cam->frame_tmp.size);
636   - cam->frame_tmp.buffer = NULL;
637   - }
638   -
639   - /* Free helper buffer */
640   - if (cam->frame_vpp.buffer) {
641   - rvfree(cam->frame_vpp.buffer, cam->frame_vpp.size);
642   - cam->frame_vpp.buffer = NULL;
643   - }
644   -
645   - /* Free video frame buffers */
646   - if (cam->frame[0].buffer) {
647   - rvfree(cam->frame[0].buffer, cam->nbuffers*cam->frame[0].size);
648   - cam->frame[0].buffer = NULL;
649   - }
650   -
651   - cam->nbuffers = 0;
652   -
653   - DBG(5, "Memory successfully deallocated")
654   -}
655   -
656   -
657   -/*--------------------------------------------------------------------------
658   - Allocate memory buffers for USB transfers and video frames.
659   - This function is called by open() only.
660   - Return 0 on success, a negative number otherwise.
661   - --------------------------------------------------------------------------*/
662   -static int w9968cf_allocate_memory(struct w9968cf_device* cam)
663   -{
664   - const u16 p_size = wMaxPacketSize[cam->altsetting-1];
665   - void* buff = NULL;
666   - unsigned long hw_bufsize, vpp_bufsize;
667   - u8 i, bpp;
668   -
669   - /* NOTE: Deallocation is done elsewhere in case of error */
670   -
671   - /* Calculate the max amount of raw data per frame from the device */
672   - hw_bufsize = cam->maxwidth*cam->maxheight*2;
673   -
674   - /* Calculate the max buf. size needed for post-processing routines */
675   - bpp = (w9968cf_vpp) ? 4 : 2;
676   - if (cam->upscaling)
677   - vpp_bufsize = max(W9968CF_MAX_WIDTH*W9968CF_MAX_HEIGHT*bpp,
678   - cam->maxwidth*cam->maxheight*bpp);
679   - else
680   - vpp_bufsize = cam->maxwidth*cam->maxheight*bpp;
681   -
682   - /* Allocate memory for the isochronous transfer buffers */
683   - for (i = 0; i < W9968CF_URBS; i++) {
684   - if (!(cam->transfer_buffer[i] =
685   - kzalloc(W9968CF_ISO_PACKETS*p_size, GFP_KERNEL))) {
686   - DBG(1, "Couldn't allocate memory for the isochronous "
687   - "transfer buffers (%u bytes)",
688   - p_size * W9968CF_ISO_PACKETS)
689   - return -ENOMEM;
690   - }
691   - }
692   -
693   - /* Allocate memory for the temporary frame buffer */
694   - if (!(cam->frame_tmp.buffer = rvmalloc(hw_bufsize))) {
695   - DBG(1, "Couldn't allocate memory for the temporary "
696   - "video frame buffer (%lu bytes)", hw_bufsize)
697   - return -ENOMEM;
698   - }
699   - cam->frame_tmp.size = hw_bufsize;
700   - cam->frame_tmp.number = -1;
701   -
702   - /* Allocate memory for the helper buffer */
703   - if (w9968cf_vpp) {
704   - if (!(cam->frame_vpp.buffer = rvmalloc(vpp_bufsize))) {
705   - DBG(1, "Couldn't allocate memory for the helper buffer"
706   - " (%lu bytes)", vpp_bufsize)
707   - return -ENOMEM;
708   - }
709   - cam->frame_vpp.size = vpp_bufsize;
710   - } else
711   - cam->frame_vpp.buffer = NULL;
712   -
713   - /* Allocate memory for video frame buffers */
714   - cam->nbuffers = cam->max_buffers;
715   - while (cam->nbuffers >= 2) {
716   - if ((buff = rvmalloc(cam->nbuffers * vpp_bufsize)))
717   - break;
718   - else
719   - cam->nbuffers--;
720   - }
721   -
722   - if (!buff) {
723   - DBG(1, "Couldn't allocate memory for the video frame buffers")
724   - cam->nbuffers = 0;
725   - return -ENOMEM;
726   - }
727   -
728   - if (cam->nbuffers != cam->max_buffers)
729   - DBG(2, "Couldn't allocate memory for %u video frame buffers. "
730   - "Only memory for %u buffers has been allocated",
731   - cam->max_buffers, cam->nbuffers)
732   -
733   - for (i = 0; i < cam->nbuffers; i++) {
734   - cam->frame[i].buffer = buff + i*vpp_bufsize;
735   - cam->frame[i].size = vpp_bufsize;
736   - cam->frame[i].number = i;
737   - /* Circular list */
738   - if (i != cam->nbuffers-1)
739   - cam->frame[i].next = &cam->frame[i+1];
740   - else
741   - cam->frame[i].next = &cam->frame[0];
742   - cam->frame[i].status = F_UNUSED;
743   - }
744   -
745   - DBG(5, "Memory successfully allocated")
746   - return 0;
747   -}
748   -
749   -
750   -
751   -/****************************************************************************
752   - * USB-specific functions *
753   - ****************************************************************************/
754   -
755   -/*--------------------------------------------------------------------------
756   - This is an handler function which is called after the URBs are completed.
757   - It collects multiple data packets coming from the camera by putting them
758   - into frame buffers: one or more zero data length data packets are used to
759   - mark the end of a video frame; the first non-zero data packet is the start
760   - of the next video frame; if an error is encountered in a packet, the entire
761   - video frame is discarded and grabbed again.
762   - If there are no requested frames in the FIFO list, packets are collected into
763   - a temporary buffer.
764   - --------------------------------------------------------------------------*/
765   -static void w9968cf_urb_complete(struct urb *urb)
766   -{
767   - struct w9968cf_device* cam = (struct w9968cf_device*)urb->context;
768   - struct w9968cf_frame_t** f;
769   - unsigned int len, status;
770   - void* pos;
771   - u8 i;
772   - int err = 0;
773   -
774   - if ((!cam->streaming) || cam->disconnected) {
775   - DBG(4, "Got interrupt, but not streaming")
776   - return;
777   - }
778   -
779   - /* "(*f)" will be used instead of "cam->frame_current" */
780   - f = &cam->frame_current;
781   -
782   - /* If a frame has been requested and we are grabbing into
783   - the temporary frame, we'll switch to that requested frame */
784   - if ((*f) == &cam->frame_tmp && *cam->requested_frame) {
785   - if (cam->frame_tmp.status == F_GRABBING) {
786   - w9968cf_pop_frame(cam, &cam->frame_current);
787   - (*f)->status = F_GRABBING;
788   - (*f)->length = cam->frame_tmp.length;
789   - memcpy((*f)->buffer, cam->frame_tmp.buffer,
790   - (*f)->length);
791   - DBG(6, "Switched from temp. frame to frame #%d",
792   - (*f)->number)
793   - }
794   - }
795   -
796   - for (i = 0; i < urb->number_of_packets; i++) {
797   - len = urb->iso_frame_desc[i].actual_length;
798   - status = urb->iso_frame_desc[i].status;
799   - pos = urb->iso_frame_desc[i].offset + urb->transfer_buffer;
800   -
801   - if (status && len != 0) {
802   - DBG(4, "URB failed, error in data packet "
803   - "(error #%u, %s)",
804   - status, symbolic(urb_errlist, status))
805   - (*f)->status = F_ERROR;
806   - continue;
807   - }
808   -
809   - if (len) { /* start of frame */
810   -
811   - if ((*f)->status == F_UNUSED) {
812   - (*f)->status = F_GRABBING;
813   - (*f)->length = 0;
814   - }
815   -
816   - /* Buffer overflows shouldn't happen, however...*/
817   - if ((*f)->length + len > (*f)->size) {
818   - DBG(4, "Buffer overflow: bad data packets")
819   - (*f)->status = F_ERROR;
820   - }
821   -
822   - if ((*f)->status == F_GRABBING) {
823   - memcpy((*f)->buffer + (*f)->length, pos, len);
824   - (*f)->length += len;
825   - }
826   -
827   - } else if ((*f)->status == F_GRABBING) { /* end of frame */
828   -
829   - DBG(6, "Frame #%d successfully grabbed", (*f)->number)
830   -
831   - if (cam->vpp_flag & VPP_DECOMPRESSION) {
832   - err = w9968cf_vpp->check_headers((*f)->buffer,
833   - (*f)->length);
834   - if (err) {
835   - DBG(4, "Skip corrupted frame: %s",
836   - symbolic(decoder_errlist, err))
837   - (*f)->status = F_UNUSED;
838   - continue; /* grab this frame again */
839   - }
840   - }
841   -
842   - (*f)->status = F_READY;
843   - (*f)->queued = 0;
844   -
845   - /* Take a pointer to the new frame from the FIFO list.
846   - If the list is empty,we'll use the temporary frame*/
847   - if (*cam->requested_frame)
848   - w9968cf_pop_frame(cam, &cam->frame_current);
849   - else {
850   - cam->frame_current = &cam->frame_tmp;
851   - (*f)->status = F_UNUSED;
852   - }
853   -
854   - } else if ((*f)->status == F_ERROR)
855   - (*f)->status = F_UNUSED; /* grab it again */
856   -
857   - PDBGG("Frame length %lu | pack.#%u | pack.len. %u | state %d",
858   - (unsigned long)(*f)->length, i, len, (*f)->status)
859   -
860   - } /* end for */
861   -
862   - /* Resubmit this URB */
863   - urb->dev = cam->usbdev;
864   - urb->status = 0;
865   - spin_lock(&cam->urb_lock);
866   - if (cam->streaming)
867   - if ((err = usb_submit_urb(urb, GFP_ATOMIC))) {
868   - cam->misconfigured = 1;
869   - DBG(1, "Couldn't resubmit the URB: error %d, %s",
870   - err, symbolic(urb_errlist, err))
871   - }
872   - spin_unlock(&cam->urb_lock);
873   -
874   - /* Wake up the user process */
875   - wake_up_interruptible(&cam->wait_queue);
876   -}
877   -
878   -
879   -/*---------------------------------------------------------------------------
880   - Setup the URB structures for the isochronous transfer.
881   - Submit the URBs so that the data transfer begins.
882   - Return 0 on success, a negative number otherwise.
883   - ---------------------------------------------------------------------------*/
884   -static int w9968cf_start_transfer(struct w9968cf_device* cam)
885   -{
886   - struct usb_device *udev = cam->usbdev;
887   - struct urb* urb;
888   - const u16 p_size = wMaxPacketSize[cam->altsetting-1];
889   - u16 w, h, d;
890   - int vidcapt;
891   - u32 t_size;
892   - int err = 0;
893   - s8 i, j;
894   -
895   - for (i = 0; i < W9968CF_URBS; i++) {
896   - urb = usb_alloc_urb(W9968CF_ISO_PACKETS, GFP_KERNEL);
897   - if (!urb) {
898   - for (j = 0; j < i; j++)
899   - usb_free_urb(cam->urb[j]);
900   - DBG(1, "Couldn't allocate the URB structures")
901   - return -ENOMEM;
902   - }
903   -
904   - cam->urb[i] = urb;
905   - urb->dev = udev;
906   - urb->context = (void*)cam;
907   - urb->pipe = usb_rcvisocpipe(udev, 1);
908   - urb->transfer_flags = URB_ISO_ASAP;
909   - urb->number_of_packets = W9968CF_ISO_PACKETS;
910   - urb->complete = w9968cf_urb_complete;
911   - urb->transfer_buffer = cam->transfer_buffer[i];
912   - urb->transfer_buffer_length = p_size*W9968CF_ISO_PACKETS;
913   - urb->interval = 1;
914   - for (j = 0; j < W9968CF_ISO_PACKETS; j++) {
915   - urb->iso_frame_desc[j].offset = p_size*j;
916   - urb->iso_frame_desc[j].length = p_size;
917   - }
918   - }
919   -
920   - /* Transfer size per frame, in WORD ! */
921   - d = cam->hw_depth;
922   - w = cam->hw_width;
923   - h = cam->hw_height;
924   -
925   - t_size = (w*h*d)/16;
926   -
927   - err = w9968cf_write_reg(cam, 0xbf17, 0x00); /* reset everything */
928   - err += w9968cf_write_reg(cam, 0xbf10, 0x00); /* normal operation */
929   -
930   - /* Transfer size */
931   - err += w9968cf_write_reg(cam, t_size & 0xffff, 0x3d); /* low bits */
932   - err += w9968cf_write_reg(cam, t_size >> 16, 0x3e); /* high bits */
933   -
934   - if (cam->vpp_flag & VPP_DECOMPRESSION)
935   - err += w9968cf_upload_quantizationtables(cam);
936   -
937   - vidcapt = w9968cf_read_reg(cam, 0x16); /* read picture settings */
938   - err += w9968cf_write_reg(cam, vidcapt|0x8000, 0x16); /* capt. enable */
939   -
940   - err += usb_set_interface(udev, 0, cam->altsetting);
941   - err += w9968cf_write_reg(cam, 0x8a05, 0x3c); /* USB FIFO enable */
942   -
943   - if (err || (vidcapt < 0)) {
944   - for (i = 0; i < W9968CF_URBS; i++)
945   - usb_free_urb(cam->urb[i]);
946   - DBG(1, "Couldn't tell the camera to start the data transfer")
947   - return err;
948   - }
949   -
950   - w9968cf_init_framelist(cam);
951   -
952   - /* Begin to grab into the temporary buffer */
953   - cam->frame_tmp.status = F_UNUSED;
954   - cam->frame_tmp.queued = 0;
955   - cam->frame_current = &cam->frame_tmp;
956   -
957   - if (!(cam->vpp_flag & VPP_DECOMPRESSION))
958   - DBG(5, "Isochronous transfer size: %lu bytes/frame",
959   - (unsigned long)t_size*2)
960   -
961   - DBG(5, "Starting the isochronous transfer...")
962   -
963   - cam->streaming = 1;
964   -
965   - /* Submit the URBs */
966   - for (i = 0; i < W9968CF_URBS; i++) {
967   - err = usb_submit_urb(cam->urb[i], GFP_KERNEL);
968   - if (err) {
969   - cam->streaming = 0;
970   - for (j = i-1; j >= 0; j--) {
971   - usb_kill_urb(cam->urb[j]);
972   - usb_free_urb(cam->urb[j]);
973   - }
974   - DBG(1, "Couldn't send a transfer request to the "
975   - "USB core (error #%d, %s)", err,
976   - symbolic(urb_errlist, err))
977   - return err;
978   - }
979   - }
980   -
981   - return 0;
982   -}
983   -
984   -
985   -/*--------------------------------------------------------------------------
986   - Stop the isochronous transfer and set alternate setting to 0 (0Mb/s).
987   - Return 0 on success, a negative number otherwise.
988   - --------------------------------------------------------------------------*/
989   -static int w9968cf_stop_transfer(struct w9968cf_device* cam)
990   -{
991   - struct usb_device *udev = cam->usbdev;
992   - unsigned long lock_flags;
993   - int err = 0;
994   - s8 i;
995   -
996   - if (!cam->streaming)
997   - return 0;
998   -
999   - /* This avoids race conditions with usb_submit_urb()
1000   - in the URB completition handler */
1001   - spin_lock_irqsave(&cam->urb_lock, lock_flags);
1002   - cam->streaming = 0;
1003   - spin_unlock_irqrestore(&cam->urb_lock, lock_flags);
1004   -
1005   - for (i = W9968CF_URBS-1; i >= 0; i--)
1006   - if (cam->urb[i]) {
1007   - usb_kill_urb(cam->urb[i]);
1008   - usb_free_urb(cam->urb[i]);
1009   - cam->urb[i] = NULL;
1010   - }
1011   -
1012   - if (cam->disconnected)
1013   - goto exit;
1014   -
1015   - err = w9968cf_write_reg(cam, 0x0a05, 0x3c); /* stop USB transfer */
1016   - err += usb_set_interface(udev, 0, 0); /* 0 Mb/s */
1017   - err += w9968cf_write_reg(cam, 0x0000, 0x39); /* disable JPEG encoder */
1018   - err += w9968cf_write_reg(cam, 0x0000, 0x16); /* stop video capture */
1019   -
1020   - if (err) {
1021   - DBG(2, "Failed to tell the camera to stop the isochronous "
1022   - "transfer. However this is not a critical error.")
1023   - return -EIO;
1024   - }
1025   -
1026   -exit:
1027   - DBG(5, "Isochronous transfer stopped")
1028   - return 0;
1029   -}
1030   -
1031   -
1032   -/*--------------------------------------------------------------------------
1033   - Write a W9968CF register.
1034   - Return 0 on success, -1 otherwise.
1035   - --------------------------------------------------------------------------*/
1036   -static int w9968cf_write_reg(struct w9968cf_device* cam, u16 value, u16 index)
1037   -{
1038   - struct usb_device* udev = cam->usbdev;
1039   - int res;
1040   -
1041   - res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0,
1042   - USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
1043   - value, index, NULL, 0, W9968CF_USB_CTRL_TIMEOUT);
1044   -
1045   - if (res < 0)
1046   - DBG(4, "Failed to write a register "
1047   - "(value 0x%04X, index 0x%02X, error #%d, %s)",
1048   - value, index, res, symbolic(urb_errlist, res))
1049   -
1050   - return (res >= 0) ? 0 : -1;
1051   -}
1052   -
1053   -
1054   -/*--------------------------------------------------------------------------
1055   - Read a W9968CF register.
1056   - Return the register value on success, -1 otherwise.
1057   - --------------------------------------------------------------------------*/
1058   -static int w9968cf_read_reg(struct w9968cf_device* cam, u16 index)
1059   -{
1060   - struct usb_device* udev = cam->usbdev;
1061   - u16* buff = cam->control_buffer;
1062   - int res;
1063   -
1064   - res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 1,
1065   - USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
1066   - 0, index, buff, 2, W9968CF_USB_CTRL_TIMEOUT);
1067   -
1068   - if (res < 0)
1069   - DBG(4, "Failed to read a register "
1070   - "(index 0x%02X, error #%d, %s)",
1071   - index, res, symbolic(urb_errlist, res))
1072   -
1073   - return (res >= 0) ? (int)(*buff) : -1;
1074   -}
1075   -
1076   -
1077   -/*--------------------------------------------------------------------------
1078   - Write 64-bit data to the fast serial bus registers.
1079   - Return 0 on success, -1 otherwise.
1080   - --------------------------------------------------------------------------*/
1081   -static int w9968cf_write_fsb(struct w9968cf_device* cam, u16* data)
1082   -{
1083   - struct usb_device* udev = cam->usbdev;
1084   - u16 value;
1085   - int res;
1086   -
1087   - value = *data++;
1088   -
1089   - res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0,
1090   - USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE,
1091   - value, 0x06, data, 6, W9968CF_USB_CTRL_TIMEOUT);
1092   -
1093   - if (res < 0)
1094   - DBG(4, "Failed to write the FSB registers "
1095   - "(error #%d, %s)", res, symbolic(urb_errlist, res))
1096   -
1097   - return (res >= 0) ? 0 : -1;
1098   -}
1099   -
1100   -
1101   -/*--------------------------------------------------------------------------
1102   - Write data to the serial bus control register.
1103   - Return 0 on success, a negative number otherwise.
1104   - --------------------------------------------------------------------------*/
1105   -static int w9968cf_write_sb(struct w9968cf_device* cam, u16 value)
1106   -{
1107   - int err = 0;
1108   -
1109   - err = w9968cf_write_reg(cam, value, 0x01);
1110   - udelay(W9968CF_I2C_BUS_DELAY);
1111   -
1112   - return err;
1113   -}
1114   -
1115   -
1116   -/*--------------------------------------------------------------------------
1117   - Read data from the serial bus control register.
1118   - Return 0 on success, a negative number otherwise.
1119   - --------------------------------------------------------------------------*/
1120   -static int w9968cf_read_sb(struct w9968cf_device* cam)
1121   -{
1122   - int v = 0;
1123   -
1124   - v = w9968cf_read_reg(cam, 0x01);
1125   - udelay(W9968CF_I2C_BUS_DELAY);
1126   -
1127   - return v;
1128   -}
1129   -
1130   -
1131   -/*--------------------------------------------------------------------------
1132   - Upload quantization tables for the JPEG compression.
1133   - This function is called by w9968cf_start_transfer().
1134   - Return 0 on success, a negative number otherwise.
1135   - --------------------------------------------------------------------------*/
1136   -static int w9968cf_upload_quantizationtables(struct w9968cf_device* cam)
1137   -{
1138   - u16 a, b;
1139   - int err = 0, i, j;
1140   -
1141   - err += w9968cf_write_reg(cam, 0x0010, 0x39); /* JPEG clock enable */
1142   -
1143   - for (i = 0, j = 0; i < 32; i++, j += 2) {
1144   - a = Y_QUANTABLE[j] | ((unsigned)(Y_QUANTABLE[j+1]) << 8);
1145   - b = UV_QUANTABLE[j] | ((unsigned)(UV_QUANTABLE[j+1]) << 8);
1146   - err += w9968cf_write_reg(cam, a, 0x40+i);
1147   - err += w9968cf_write_reg(cam, b, 0x60+i);
1148   - }
1149   - err += w9968cf_write_reg(cam, 0x0012, 0x39); /* JPEG encoder enable */
1150   -
1151   - return err;
1152   -}
1153   -
1154   -
1155   -
1156   -/****************************************************************************
1157   - * Low-level I2C I/O functions. *
1158   - * The adapter supports the following I2C transfer functions: *
1159   - * i2c_adap_fastwrite_byte_data() (at 400 kHz bit frequency only) *
1160   - * i2c_adap_read_byte_data() *
1161   - * i2c_adap_read_byte() *
1162   - ****************************************************************************/
1163   -
1164   -static int w9968cf_smbus_start(struct w9968cf_device* cam)
1165   -{
1166   - int err = 0;
1167   -
1168   - err += w9968cf_write_sb(cam, 0x0011); /* SDE=1, SDA=0, SCL=1 */
1169   - err += w9968cf_write_sb(cam, 0x0010); /* SDE=1, SDA=0, SCL=0 */
1170   -
1171   - return err;
1172   -}
1173   -
1174   -
1175   -static int w9968cf_smbus_stop(struct w9968cf_device* cam)
1176   -{
1177   - int err = 0;
1178   -
1179   - err += w9968cf_write_sb(cam, 0x0011); /* SDE=1, SDA=0, SCL=1 */
1180   - err += w9968cf_write_sb(cam, 0x0013); /* SDE=1, SDA=1, SCL=1 */
1181   -
1182   - return err;
1183   -}
1184   -
1185   -
1186   -static int w9968cf_smbus_write_byte(struct w9968cf_device* cam, u8 v)
1187   -{
1188   - u8 bit;
1189   - int err = 0, sda;
1190   -
1191   - for (bit = 0 ; bit < 8 ; bit++) {
1192   - sda = (v & 0x80) ? 2 : 0;
1193   - v <<= 1;
1194   - /* SDE=1, SDA=sda, SCL=0 */
1195   - err += w9968cf_write_sb(cam, 0x10 | sda);
1196   - /* SDE=1, SDA=sda, SCL=1 */
1197   - err += w9968cf_write_sb(cam, 0x11 | sda);
1198   - /* SDE=1, SDA=sda, SCL=0 */
1199   - err += w9968cf_write_sb(cam, 0x10 | sda);
1200   - }
1201   -
1202   - return err;
1203   -}
1204   -
1205   -
1206   -static int w9968cf_smbus_read_byte(struct w9968cf_device* cam, u8* v)
1207   -{
1208   - u8 bit;
1209   - int err = 0;
1210   -
1211   - *v = 0;
1212   - for (bit = 0 ; bit < 8 ; bit++) {
1213   - *v <<= 1;
1214   - err += w9968cf_write_sb(cam, 0x0013);
1215   - *v |= (w9968cf_read_sb(cam) & 0x0008) ? 1 : 0;
1216   - err += w9968cf_write_sb(cam, 0x0012);
1217   - }
1218   -
1219   - return err;
1220   -}
1221   -
1222   -
1223   -static int w9968cf_smbus_write_ack(struct w9968cf_device* cam)
1224   -{
1225   - int err = 0;
1226   -
1227   - err += w9968cf_write_sb(cam, 0x0010); /* SDE=1, SDA=0, SCL=0 */
1228   - err += w9968cf_write_sb(cam, 0x0011); /* SDE=1, SDA=0, SCL=1 */
1229   - err += w9968cf_write_sb(cam, 0x0010); /* SDE=1, SDA=0, SCL=0 */
1230   -
1231   - return err;
1232   -}
1233   -
1234   -
1235   -static int w9968cf_smbus_read_ack(struct w9968cf_device* cam)
1236   -{
1237   - int err = 0, sda;
1238   -
1239   - err += w9968cf_write_sb(cam, 0x0013); /* SDE=1, SDA=1, SCL=1 */
1240   - sda = (w9968cf_read_sb(cam) & 0x08) ? 1 : 0; /* sda = SDA */
1241   - err += w9968cf_write_sb(cam, 0x0012); /* SDE=1, SDA=1, SCL=0 */
1242   - if (sda < 0)
1243   - err += sda;
1244   - if (sda == 1) {
1245   - DBG(6, "Couldn't receive the ACK")
1246   - err += -1;
1247   - }
1248   -
1249   - return err;
1250   -}
1251   -
1252   -
1253   -/* This seems to refresh the communication through the serial bus */
1254   -static int w9968cf_smbus_refresh_bus(struct w9968cf_device* cam)
1255   -{
1256   - int err = 0, j;
1257   -
1258   - for (j = 1; j <= 10; j++) {
1259   - err = w9968cf_write_reg(cam, 0x0020, 0x01);
1260   - err += w9968cf_write_reg(cam, 0x0000, 0x01);
1261   - if (err)
1262   - break;
1263   - }
1264   -
1265   - return err;
1266   -}
1267   -
1268   -
1269   -/* SMBus protocol: S Addr Wr [A] Subaddr [A] Value [A] P */
1270   -static int
1271   -w9968cf_i2c_adap_fastwrite_byte_data(struct w9968cf_device* cam,
1272   - u16 address, u8 subaddress,u8 value)
1273   -{
1274   - u16* data = cam->data_buffer;
1275   - int err = 0;
1276   -
1277   - err += w9968cf_smbus_refresh_bus(cam);
1278   -
1279   - /* Enable SBUS outputs */
1280   - err += w9968cf_write_sb(cam, 0x0020);
1281   -
1282   - data[0] = 0x082f | ((address & 0x80) ? 0x1500 : 0x0);
1283   - data[0] |= (address & 0x40) ? 0x4000 : 0x0;
1284   - data[1] = 0x2082 | ((address & 0x40) ? 0x0005 : 0x0);
1285   - data[1] |= (address & 0x20) ? 0x0150 : 0x0;
1286   - data[1] |= (address & 0x10) ? 0x5400 : 0x0;
1287   - data[2] = 0x8208 | ((address & 0x08) ? 0x0015 : 0x0);
1288   - data[2] |= (address & 0x04) ? 0x0540 : 0x0;
1289   - data[2] |= (address & 0x02) ? 0x5000 : 0x0;
1290   - data[3] = 0x1d20 | ((address & 0x02) ? 0x0001 : 0x0);
1291   - data[3] |= (address & 0x01) ? 0x0054 : 0x0;
1292   -
1293   - err += w9968cf_write_fsb(cam, data);
1294   -
1295   - data[0] = 0x8208 | ((subaddress & 0x80) ? 0x0015 : 0x0);
1296   - data[0] |= (subaddress & 0x40) ? 0x0540 : 0x0;
1297   - data[0] |= (subaddress & 0x20) ? 0x5000 : 0x0;
1298   - data[1] = 0x0820 | ((subaddress & 0x20) ? 0x0001 : 0x0);
1299   - data[1] |= (subaddress & 0x10) ? 0x0054 : 0x0;
1300   - data[1] |= (subaddress & 0x08) ? 0x1500 : 0x0;
1301   - data[1] |= (subaddress & 0x04) ? 0x4000 : 0x0;
1302   - data[2] = 0x2082 | ((subaddress & 0x04) ? 0x0005 : 0x0);
1303   - data[2] |= (subaddress & 0x02) ? 0x0150 : 0x0;
1304   - data[2] |= (subaddress & 0x01) ? 0x5400 : 0x0;
1305   - data[3] = 0x001d;
1306   -
1307   - err += w9968cf_write_fsb(cam, data);
1308   -
1309   - data[0] = 0x8208 | ((value & 0x80) ? 0x0015 : 0x0);
1310   - data[0] |= (value & 0x40) ? 0x0540 : 0x0;
1311   - data[0] |= (value & 0x20) ? 0x5000 : 0x0;
1312   - data[1] = 0x0820 | ((value & 0x20) ? 0x0001 : 0x0);
1313   - data[1] |= (value & 0x10) ? 0x0054 : 0x0;
1314   - data[1] |= (value & 0x08) ? 0x1500 : 0x0;
1315   - data[1] |= (value & 0x04) ? 0x4000 : 0x0;
1316   - data[2] = 0x2082 | ((value & 0x04) ? 0x0005 : 0x0);
1317   - data[2] |= (value & 0x02) ? 0x0150 : 0x0;
1318   - data[2] |= (value & 0x01) ? 0x5400 : 0x0;
1319   - data[3] = 0xfe1d;
1320   -
1321   - err += w9968cf_write_fsb(cam, data);
1322   -
1323   - /* Disable SBUS outputs */
1324   - err += w9968cf_write_sb(cam, 0x0000);
1325   -
1326   - if (!err)
1327   - DBG(5, "I2C write byte data done, addr.0x%04X, subaddr.0x%02X "
1328   - "value 0x%02X", address, subaddress, value)
1329   - else
1330   - DBG(5, "I2C write byte data failed, addr.0x%04X, "
1331   - "subaddr.0x%02X, value 0x%02X",
1332   - address, subaddress, value)
1333   -
1334   - return err;
1335   -}
1336   -
1337   -
1338   -/* SMBus protocol: S Addr Wr [A] Subaddr [A] P S Addr+1 Rd [A] [Value] NA P */
1339   -static int
1340   -w9968cf_i2c_adap_read_byte_data(struct w9968cf_device* cam,
1341   - u16 address, u8 subaddress,
1342   - u8* value)
1343   -{
1344   - int err = 0;
1345   -
1346   - /* Serial data enable */
1347   - err += w9968cf_write_sb(cam, 0x0013); /* don't change ! */
1348   -
1349   - err += w9968cf_smbus_start(cam);
1350   - err += w9968cf_smbus_write_byte(cam, address);
1351   - err += w9968cf_smbus_read_ack(cam);
1352   - err += w9968cf_smbus_write_byte(cam, subaddress);
1353   - err += w9968cf_smbus_read_ack(cam);
1354   - err += w9968cf_smbus_stop(cam);
1355   - err += w9968cf_smbus_start(cam);
1356   - err += w9968cf_smbus_write_byte(cam, address + 1);
1357   - err += w9968cf_smbus_read_ack(cam);
1358   - err += w9968cf_smbus_read_byte(cam, value);
1359   - err += w9968cf_smbus_write_ack(cam);
1360   - err += w9968cf_smbus_stop(cam);
1361   -
1362   - /* Serial data disable */
1363   - err += w9968cf_write_sb(cam, 0x0000);
1364   -
1365   - if (!err)
1366   - DBG(5, "I2C read byte data done, addr.0x%04X, "
1367   - "subaddr.0x%02X, value 0x%02X",
1368   - address, subaddress, *value)
1369   - else
1370   - DBG(5, "I2C read byte data failed, addr.0x%04X, "
1371   - "subaddr.0x%02X, wrong value 0x%02X",
1372   - address, subaddress, *value)
1373   -
1374   - return err;
1375   -}
1376   -
1377   -
1378   -/* SMBus protocol: S Addr+1 Rd [A] [Value] NA P */
1379   -static int
1380   -w9968cf_i2c_adap_read_byte(struct w9968cf_device* cam,
1381   - u16 address, u8* value)
1382   -{
1383   - int err = 0;
1384   -
1385   - /* Serial data enable */
1386   - err += w9968cf_write_sb(cam, 0x0013);
1387   -
1388   - err += w9968cf_smbus_start(cam);
1389   - err += w9968cf_smbus_write_byte(cam, address + 1);
1390   - err += w9968cf_smbus_read_ack(cam);
1391   - err += w9968cf_smbus_read_byte(cam, value);
1392   - err += w9968cf_smbus_write_ack(cam);
1393   - err += w9968cf_smbus_stop(cam);
1394   -
1395   - /* Serial data disable */
1396   - err += w9968cf_write_sb(cam, 0x0000);
1397   -
1398   - if (!err)
1399   - DBG(5, "I2C read byte done, addr.0x%04X, "
1400   - "value 0x%02X", address, *value)
1401   - else
1402   - DBG(5, "I2C read byte failed, addr.0x%04X, "
1403   - "wrong value 0x%02X", address, *value)
1404   -
1405   - return err;
1406   -}
1407   -
1408   -
1409   -/* SMBus protocol: S Addr Wr [A] Value [A] P */
1410   -static int
1411   -w9968cf_i2c_adap_write_byte(struct w9968cf_device* cam,
1412   - u16 address, u8 value)
1413   -{
1414   - DBG(4, "i2c_write_byte() is an unsupported transfer mode")
1415   - return -EINVAL;
1416   -}
1417   -
1418   -
1419   -
1420   -/****************************************************************************
1421   - * I2C interface to kernel *
1422   - ****************************************************************************/
1423   -
1424   -static int
1425   -w9968cf_i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
1426   - unsigned short flags, char read_write, u8 command,
1427   - int size, union i2c_smbus_data *data)
1428   -{
1429   - struct v4l2_device *v4l2_dev = i2c_get_adapdata(adapter);
1430   - struct w9968cf_device *cam = to_cam(v4l2_dev);
1431   - u8 i;
1432   - int err = 0;
1433   -
1434   - if (size == I2C_SMBUS_BYTE) {
1435   - /* Why addr <<= 1? See OVXXX0_SID defines in ovcamchip.h */
1436   - addr <<= 1;
1437   -
1438   - if (read_write == I2C_SMBUS_WRITE)
1439   - err = w9968cf_i2c_adap_write_byte(cam, addr, command);
1440   - else if (read_write == I2C_SMBUS_READ)
1441   - for (i = 1; i <= W9968CF_I2C_RW_RETRIES; i++) {
1442   - err = w9968cf_i2c_adap_read_byte(cam, addr,
1443   - &data->byte);
1444   - if (err) {
1445   - if (w9968cf_smbus_refresh_bus(cam)) {
1446   - err = -EIO;
1447   - break;
1448   - }
1449   - } else
1450   - break;
1451   - }
1452   - } else if (size == I2C_SMBUS_BYTE_DATA) {
1453   - addr <<= 1;
1454   -
1455   - if (read_write == I2C_SMBUS_WRITE)
1456   - err = w9968cf_i2c_adap_fastwrite_byte_data(cam, addr,
1457   - command, data->byte);
1458   - else if (read_write == I2C_SMBUS_READ) {
1459   - for (i = 1; i <= W9968CF_I2C_RW_RETRIES; i++) {
1460   - err = w9968cf_i2c_adap_read_byte_data(cam,addr,
1461   - command, &data->byte);
1462   - if (err) {
1463   - if (w9968cf_smbus_refresh_bus(cam)) {
1464   - err = -EIO;
1465   - break;
1466   - }
1467   - } else
1468   - break;
1469   - }
1470   -
1471   - } else
1472   - return -EINVAL;
1473   -
1474   - } else {
1475   - DBG(4, "Unsupported I2C transfer mode (%d)", size)
1476   - return -EINVAL;
1477   - }
1478   - return err;
1479   -}
1480   -
1481   -
1482   -static u32 w9968cf_i2c_func(struct i2c_adapter* adap)
1483   -{
1484   - return I2C_FUNC_SMBUS_READ_BYTE |
1485   - I2C_FUNC_SMBUS_READ_BYTE_DATA |
1486   - I2C_FUNC_SMBUS_WRITE_BYTE_DATA;
1487   -}
1488   -
1489   -
1490   -static int w9968cf_i2c_init(struct w9968cf_device* cam)
1491   -{
1492   - int err = 0;
1493   -
1494   - static struct i2c_algorithm algo = {
1495   - .smbus_xfer = w9968cf_i2c_smbus_xfer,
1496   - .functionality = w9968cf_i2c_func,
1497   - };
1498   -
1499   - static struct i2c_adapter adap = {
1500   - .owner = THIS_MODULE,
1501   - .algo = &algo,
1502   - };
1503   -
1504   - memcpy(&cam->i2c_adapter, &adap, sizeof(struct i2c_adapter));
1505   - strcpy(cam->i2c_adapter.name, "w9968cf");
1506   - cam->i2c_adapter.dev.parent = &cam->usbdev->dev;
1507   - i2c_set_adapdata(&cam->i2c_adapter, &cam->v4l2_dev);
1508   -
1509   - DBG(6, "Registering I2C adapter with kernel...")
1510   -
1511   - err = i2c_add_adapter(&cam->i2c_adapter);
1512   - if (err)
1513   - DBG(1, "Failed to register the I2C adapter")
1514   - else
1515   - DBG(5, "I2C adapter registered")
1516   -
1517   - return err;
1518   -}
1519   -
1520   -
1521   -
1522   -/****************************************************************************
1523   - * Helper functions *
1524   - ****************************************************************************/
1525   -
1526   -/*--------------------------------------------------------------------------
1527   - Turn on the LED on some webcams. A beep should be heard too.
1528   - Return 0 on success, a negative number otherwise.
1529   - --------------------------------------------------------------------------*/
1530   -static int w9968cf_turn_on_led(struct w9968cf_device* cam)
1531   -{
1532   - int err = 0;
1533   -
1534   - err += w9968cf_write_reg(cam, 0xff00, 0x00); /* power-down */
1535   - err += w9968cf_write_reg(cam, 0xbf17, 0x00); /* reset everything */
1536   - err += w9968cf_write_reg(cam, 0xbf10, 0x00); /* normal operation */
1537   - err += w9968cf_write_reg(cam, 0x0010, 0x01); /* serial bus, SDS high */
1538   - err += w9968cf_write_reg(cam, 0x0000, 0x01); /* serial bus, SDS low */
1539   - err += w9968cf_write_reg(cam, 0x0010, 0x01); /* ..high 'beep-beep' */
1540   -
1541   - if (err)
1542   - DBG(2, "Couldn't turn on the LED")
1543   -
1544   - DBG(5, "LED turned on")
1545   -
1546   - return err;
1547   -}
1548   -
1549   -
1550   -/*--------------------------------------------------------------------------
1551   - Write some registers for the device initialization.
1552   - This function is called once on open().
1553   - Return 0 on success, a negative number otherwise.
1554   - --------------------------------------------------------------------------*/
1555   -static int w9968cf_init_chip(struct w9968cf_device* cam)
1556   -{
1557   - unsigned long hw_bufsize = cam->maxwidth*cam->maxheight*2,
1558   - y0 = 0x0000,
1559   - u0 = y0 + hw_bufsize/2,
1560   - v0 = u0 + hw_bufsize/4,
1561   - y1 = v0 + hw_bufsize/4,
1562   - u1 = y1 + hw_bufsize/2,
1563   - v1 = u1 + hw_bufsize/4;
1564   - int err = 0;
1565   -
1566   - err += w9968cf_write_reg(cam, 0xff00, 0x00); /* power off */
1567   - err += w9968cf_write_reg(cam, 0xbf10, 0x00); /* power on */
1568   -
1569   - err += w9968cf_write_reg(cam, 0x405d, 0x03); /* DRAM timings */
1570   - err += w9968cf_write_reg(cam, 0x0030, 0x04); /* SDRAM timings */
1571   -
1572   - err += w9968cf_write_reg(cam, y0 & 0xffff, 0x20); /* Y buf.0, low */
1573   - err += w9968cf_write_reg(cam, y0 >> 16, 0x21); /* Y buf.0, high */
1574   - err += w9968cf_write_reg(cam, u0 & 0xffff, 0x24); /* U buf.0, low */
1575   - err += w9968cf_write_reg(cam, u0 >> 16, 0x25); /* U buf.0, high */
1576   - err += w9968cf_write_reg(cam, v0 & 0xffff, 0x28); /* V buf.0, low */
1577   - err += w9968cf_write_reg(cam, v0 >> 16, 0x29); /* V buf.0, high */
1578   -
1579   - err += w9968cf_write_reg(cam, y1 & 0xffff, 0x22); /* Y buf.1, low */
1580   - err += w9968cf_write_reg(cam, y1 >> 16, 0x23); /* Y buf.1, high */
1581   - err += w9968cf_write_reg(cam, u1 & 0xffff, 0x26); /* U buf.1, low */
1582   - err += w9968cf_write_reg(cam, u1 >> 16, 0x27); /* U buf.1, high */
1583   - err += w9968cf_write_reg(cam, v1 & 0xffff, 0x2a); /* V buf.1, low */
1584   - err += w9968cf_write_reg(cam, v1 >> 16, 0x2b); /* V buf.1, high */
1585   -
1586   - err += w9968cf_write_reg(cam, y1 & 0xffff, 0x32); /* JPEG buf 0 low */
1587   - err += w9968cf_write_reg(cam, y1 >> 16, 0x33); /* JPEG buf 0 high */
1588   -
1589   - err += w9968cf_write_reg(cam, y1 & 0xffff, 0x34); /* JPEG buf 1 low */
1590   - err += w9968cf_write_reg(cam, y1 >> 16, 0x35); /* JPEG bug 1 high */
1591   -
1592   - err += w9968cf_write_reg(cam, 0x0000, 0x36);/* JPEG restart interval */
1593   - err += w9968cf_write_reg(cam, 0x0804, 0x37);/*JPEG VLE FIFO threshold*/
1594   - err += w9968cf_write_reg(cam, 0x0000, 0x38);/* disable hw up-scaling */
1595   - err += w9968cf_write_reg(cam, 0x0000, 0x3f); /* JPEG/MCTL test data */
1596   -
1597   - err += w9968cf_set_picture(cam, cam->picture); /* this before */
1598   - err += w9968cf_set_window(cam, cam->window);
1599   -
1600   - if (err)
1601   - DBG(1, "Chip initialization failed")
1602   - else
1603   - DBG(5, "Chip successfully initialized")
1604   -
1605   - return err;
1606   -}
1607   -
1608   -
1609   -/*--------------------------------------------------------------------------
1610   - Return non-zero if the palette is supported, 0 otherwise.
1611   - --------------------------------------------------------------------------*/
1612   -static inline u16 w9968cf_valid_palette(u16 palette)
1613   -{
1614   - u8 i = 0;
1615   - while (w9968cf_formatlist[i].palette != 0) {
1616   - if (palette == w9968cf_formatlist[i].palette)
1617   - return palette;
1618   - i++;
1619   - }
1620   - return 0;
1621   -}
1622   -
1623   -
1624   -/*--------------------------------------------------------------------------
1625   - Return the depth corresponding to the given palette.
1626   - Palette _must_ be supported !
1627   - --------------------------------------------------------------------------*/
1628   -static inline u16 w9968cf_valid_depth(u16 palette)
1629   -{
1630   - u8 i=0;
1631   - while (w9968cf_formatlist[i].palette != palette)
1632   - i++;
1633   -
1634   - return w9968cf_formatlist[i].depth;
1635   -}
1636   -
1637   -
1638   -/*--------------------------------------------------------------------------
1639   - Return non-zero if the format requires decompression, 0 otherwise.
1640   - --------------------------------------------------------------------------*/
1641   -static inline u8 w9968cf_need_decompression(u16 palette)
1642   -{
1643   - u8 i = 0;
1644   - while (w9968cf_formatlist[i].palette != 0) {
1645   - if (palette == w9968cf_formatlist[i].palette)
1646   - return w9968cf_formatlist[i].compression;
1647   - i++;
1648   - }
1649   - return 0;
1650   -}
1651   -
1652   -
1653   -/*--------------------------------------------------------------------------
1654   - Change the picture settings of the camera.
1655   - Return 0 on success, a negative number otherwise.
1656   - --------------------------------------------------------------------------*/
1657   -static int
1658   -w9968cf_set_picture(struct w9968cf_device* cam, struct video_picture pict)
1659   -{
1660   - u16 fmt, hw_depth, hw_palette, reg_v = 0x0000;
1661   - int err = 0;
1662   -
1663   - /* Make sure we are using a valid depth */
1664   - pict.depth = w9968cf_valid_depth(pict.palette);
1665   -
1666   - fmt = pict.palette;
1667   -
1668   - hw_depth = pict.depth; /* depth used by the winbond chip */
1669   - hw_palette = pict.palette; /* palette used by the winbond chip */
1670   -
1671   - /* VS & HS polarities */
1672   - reg_v = (cam->vs_polarity << 12) | (cam->hs_polarity << 11);
1673   -
1674   - switch (fmt)
1675   - {
1676   - case VIDEO_PALETTE_UYVY:
1677   - reg_v |= 0x0000;
1678   - cam->vpp_flag = VPP_NONE;
1679   - break;
1680   - case VIDEO_PALETTE_YUV422P:
1681   - reg_v |= 0x0002;
1682   - cam->vpp_flag = VPP_DECOMPRESSION;
1683   - break;
1684   - case VIDEO_PALETTE_YUV420:
1685   - case VIDEO_PALETTE_YUV420P:
1686   - reg_v |= 0x0003;
1687   - cam->vpp_flag = VPP_DECOMPRESSION;
1688   - break;
1689   - case VIDEO_PALETTE_YUYV:
1690   - case VIDEO_PALETTE_YUV422:
1691   - reg_v |= 0x0000;
1692   - cam->vpp_flag = VPP_SWAP_YUV_BYTES;
1693   - hw_palette = VIDEO_PALETTE_UYVY;
1694   - break;
1695   - /* Original video is used instead of RGBX palettes.
1696   - Software conversion later. */
1697   - case VIDEO_PALETTE_GREY:
1698   - case VIDEO_PALETTE_RGB555:
1699   - case VIDEO_PALETTE_RGB565:
1700   - case VIDEO_PALETTE_RGB24:
1701   - case VIDEO_PALETTE_RGB32:
1702   - reg_v |= 0x0000; /* UYVY 16 bit is used */
1703   - hw_depth = 16;
1704   - hw_palette = VIDEO_PALETTE_UYVY;
1705   - cam->vpp_flag = VPP_UYVY_TO_RGBX;
1706   - break;
1707   - }
1708   -
1709   - /* NOTE: due to memory issues, it is better to disable the hardware
1710   - double buffering during compression */
1711   - if (cam->double_buffer && !(cam->vpp_flag & VPP_DECOMPRESSION))
1712   - reg_v |= 0x0080;
1713   -
1714   - if (cam->clamping)
1715   - reg_v |= 0x0020;
1716   -
1717   - if (cam->filter_type == 1)
1718   - reg_v |= 0x0008;
1719   - else if (cam->filter_type == 2)
1720   - reg_v |= 0x000c;
1721   -
1722   - if ((err = w9968cf_write_reg(cam, reg_v, 0x16)))
1723   - goto error;
1724   -
1725   - if ((err = w9968cf_sensor_update_picture(cam, pict)))
1726   - goto error;
1727   -
1728   - /* If all went well, update the device data structure */
1729   - memcpy(&cam->picture, &pict, sizeof(pict));
1730   - cam->hw_depth = hw_depth;
1731   - cam->hw_palette = hw_palette;
1732   -
1733   - /* Settings changed, so we clear the frame buffers */
1734   - memset(cam->frame[0].buffer, 0, cam->nbuffers*cam->frame[0].size);
1735   -
1736   - DBG(4, "Palette is %s, depth is %u bpp",
1737   - symbolic(v4l1_plist, pict.palette), pict.depth)
1738   -
1739   - return 0;
1740   -
1741   -error:
1742   - DBG(1, "Failed to change picture settings")
1743   - return err;
1744   -}
1745   -
1746   -
1747   -/*--------------------------------------------------------------------------
1748   - Change the capture area size of the camera.
1749   - This function _must_ be called _after_ w9968cf_set_picture().
1750   - Return 0 on success, a negative number otherwise.
1751   - --------------------------------------------------------------------------*/
1752   -static int
1753   -w9968cf_set_window(struct w9968cf_device* cam, struct video_window win)
1754   -{
1755   - u16 x, y, w, h, scx, scy, cw, ch, ax, ay;
1756   - unsigned long fw, fh;
1757   - struct ovcamchip_window s_win;
1758   - int err = 0;
1759   -
1760   - /* Work around to avoid FP arithmetics */
1761   - #define SC(x) ((x) << 10)
1762   - #define UNSC(x) ((x) >> 10)
1763   -
1764   - /* Make sure we are using a supported resolution */
1765   - if ((err = w9968cf_adjust_window_size(cam, &win.width, &win.height)))
1766   - goto error;
1767   -
1768   - /* Scaling factors */
1769   - fw = SC(win.width) / cam->maxwidth;
1770   - fh = SC(win.height) / cam->maxheight;
1771   -
1772   - /* Set up the width and height values used by the chip */
1773   - if ((win.width > cam->maxwidth) || (win.height > cam->maxheight)) {
1774   - cam->vpp_flag |= VPP_UPSCALE;
1775   - /* Calculate largest w,h mantaining the same w/h ratio */
1776   - w = (fw >= fh) ? cam->maxwidth : SC(win.width)/fh;
1777   - h = (fw >= fh) ? SC(win.height)/fw : cam->maxheight;
1778   - if (w < cam->minwidth) /* just in case */
1779   - w = cam->minwidth;
1780   - if (h < cam->minheight) /* just in case */
1781   - h = cam->minheight;
1782   - } else {
1783   - cam->vpp_flag &= ~VPP_UPSCALE;
1784   - w = win.width;
1785   - h = win.height;
1786   - }
1787   -
1788   - /* x,y offsets of the cropped area */
1789   - scx = cam->start_cropx;
1790   - scy = cam->start_cropy;
1791   -
1792   - /* Calculate cropped area manteining the right w/h ratio */
1793   - if (cam->largeview && !(cam->vpp_flag & VPP_UPSCALE)) {
1794   - cw = (fw >= fh) ? cam->maxwidth : SC(win.width)/fh;
1795   - ch = (fw >= fh) ? SC(win.height)/fw : cam->maxheight;
1796   - } else {
1797   - cw = w;
1798   - ch = h;
1799   - }
1800   -
1801   - /* Setup the window of the sensor */
1802   - s_win.format = VIDEO_PALETTE_UYVY;
1803   - s_win.width = cam->maxwidth;
1804   - s_win.height = cam->maxheight;
1805   - s_win.quarter = 0; /* full progressive video */
1806   -
1807   - /* Center it */
1808   - s_win.x = (s_win.width - cw) / 2;
1809   - s_win.y = (s_win.height - ch) / 2;
1810   -
1811   - /* Clock divisor */
1812   - if (cam->clockdiv >= 0)
1813   - s_win.clockdiv = cam->clockdiv; /* manual override */
1814   - else
1815   - switch (cam->sensor) {
1816   - case CC_OV6620:
1817   - s_win.clockdiv = 0;
1818   - break;
1819   - case CC_OV6630:
1820   - s_win.clockdiv = 0;
1821   - break;
1822   - case CC_OV76BE:
1823   - case CC_OV7610:
1824   - case CC_OV7620:
1825   - s_win.clockdiv = 0;
1826   - break;
1827   - default:
1828   - s_win.clockdiv = W9968CF_DEF_CLOCKDIVISOR;
1829   - }
1830   -
1831   - /* We have to scale win.x and win.y offsets */
1832   - if ( (cam->largeview && !(cam->vpp_flag & VPP_UPSCALE))
1833   - || (cam->vpp_flag & VPP_UPSCALE) ) {
1834   - ax = SC(win.x)/fw;
1835   - ay = SC(win.y)/fh;
1836   - } else {
1837   - ax = win.x;
1838   - ay = win.y;
1839   - }
1840   -
1841   - if ((ax + cw) > cam->maxwidth)
1842   - ax = cam->maxwidth - cw;
1843   -
1844   - if ((ay + ch) > cam->maxheight)
1845   - ay = cam->maxheight - ch;
1846   -
1847   - /* Adjust win.x, win.y */
1848   - if ( (cam->largeview && !(cam->vpp_flag & VPP_UPSCALE))
1849   - || (cam->vpp_flag & VPP_UPSCALE) ) {
1850   - win.x = UNSC(ax*fw);
1851   - win.y = UNSC(ay*fh);
1852   - } else {
1853   - win.x = ax;
1854   - win.y = ay;
1855   - }
1856   -
1857   - /* Offsets used by the chip */
1858   - x = ax + s_win.x;
1859   - y = ay + s_win.y;
1860   -
1861   - /* Go ! */
1862   - if ((err = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_S_MODE, &s_win)))
1863   - goto error;
1864   -
1865   - err += w9968cf_write_reg(cam, scx + x, 0x10);
1866   - err += w9968cf_write_reg(cam, scy + y, 0x11);
1867   - err += w9968cf_write_reg(cam, scx + x + cw, 0x12);
1868   - err += w9968cf_write_reg(cam, scy + y + ch, 0x13);
1869   - err += w9968cf_write_reg(cam, w, 0x14);
1870   - err += w9968cf_write_reg(cam, h, 0x15);
1871   -
1872   - /* JPEG width & height */
1873   - err += w9968cf_write_reg(cam, w, 0x30);
1874   - err += w9968cf_write_reg(cam, h, 0x31);
1875   -
1876   - /* Y & UV frame buffer strides (in WORD) */
1877   - if (cam->vpp_flag & VPP_DECOMPRESSION) {
1878   - err += w9968cf_write_reg(cam, w/2, 0x2c);
1879   - err += w9968cf_write_reg(cam, w/4, 0x2d);
1880   - } else
1881   - err += w9968cf_write_reg(cam, w, 0x2c);
1882   -
1883   - if (err)
1884   - goto error;
1885   -
1886   - /* If all went well, update the device data structure */
1887   - memcpy(&cam->window, &win, sizeof(win));
1888   - cam->hw_width = w;
1889   - cam->hw_height = h;
1890   -
1891   - /* Settings changed, so we clear the frame buffers */
1892   - memset(cam->frame[0].buffer, 0, cam->nbuffers*cam->frame[0].size);
1893   -
1894   - DBG(4, "The capture area is %dx%d, Offset (x,y)=(%u,%u)",
1895   - win.width, win.height, win.x, win.y)
1896   -
1897   - PDBGG("x=%u ,y=%u, w=%u, h=%u, ax=%u, ay=%u, s_win.x=%u, s_win.y=%u, "
1898   - "cw=%u, ch=%u, win.x=%u, win.y=%u, win.width=%u, win.height=%u",
1899   - x, y, w, h, ax, ay, s_win.x, s_win.y, cw, ch, win.x, win.y,
1900   - win.width, win.height)
1901   -
1902   - return 0;
1903   -
1904   -error:
1905   - DBG(1, "Failed to change the capture area size")
1906   - return err;
1907   -}
1908   -
1909   -
1910   -/*--------------------------------------------------------------------------
1911   - Adjust the asked values for window width and height.
1912   - Return 0 on success, -1 otherwise.
1913   - --------------------------------------------------------------------------*/
1914   -static int
1915   -w9968cf_adjust_window_size(struct w9968cf_device *cam, u32 *width, u32 *height)
1916   -{
1917   - unsigned int maxw, maxh, align;
1918   -
1919   - maxw = cam->upscaling && !(cam->vpp_flag & VPP_DECOMPRESSION) &&
1920   - w9968cf_vpp ? max((u16)W9968CF_MAX_WIDTH, cam->maxwidth)
1921   - : cam->maxwidth;
1922   - maxh = cam->upscaling && !(cam->vpp_flag & VPP_DECOMPRESSION) &&
1923   - w9968cf_vpp ? max((u16)W9968CF_MAX_HEIGHT, cam->maxheight)
1924   - : cam->maxheight;
1925   - align = (cam->vpp_flag & VPP_DECOMPRESSION) ? 4 : 0;
1926   -
1927   - v4l_bound_align_image(width, cam->minwidth, maxw, align,
1928   - height, cam->minheight, maxh, align, 0);
1929   -
1930   - PDBGG("Window size adjusted w=%u, h=%u ", *width, *height)
1931   -
1932   - return 0;
1933   -}
1934   -
1935   -
1936   -/*--------------------------------------------------------------------------
1937   - Initialize the FIFO list of requested frames.
1938   - --------------------------------------------------------------------------*/
1939   -static void w9968cf_init_framelist(struct w9968cf_device* cam)
1940   -{
1941   - u8 i;
1942   -
1943   - for (i = 0; i < cam->nbuffers; i++) {
1944   - cam->requested_frame[i] = NULL;
1945   - cam->frame[i].queued = 0;
1946   - cam->frame[i].status = F_UNUSED;
1947   - }
1948   -}
1949   -
1950   -
1951   -/*--------------------------------------------------------------------------
1952   - Add a frame in the FIFO list of requested frames.
1953   - This function is called in process context.
1954   - --------------------------------------------------------------------------*/
1955   -static void w9968cf_push_frame(struct w9968cf_device* cam, u8 f_num)
1956   -{
1957   - u8 f;
1958   - unsigned long lock_flags;
1959   -
1960   - spin_lock_irqsave(&cam->flist_lock, lock_flags);
1961   -
1962   - for (f=0; cam->requested_frame[f] != NULL; f++);
1963   - cam->requested_frame[f] = &cam->frame[f_num];
1964   - cam->frame[f_num].queued = 1;
1965   - cam->frame[f_num].status = F_UNUSED; /* clear the status */
1966   -
1967   - spin_unlock_irqrestore(&cam->flist_lock, lock_flags);
1968   -
1969   - DBG(6, "Frame #%u pushed into the FIFO list. Position %u", f_num, f)
1970   -}
1971   -
1972   -
1973   -/*--------------------------------------------------------------------------
1974   - Read, store and remove the first pointer in the FIFO list of requested
1975   - frames. This function is called in interrupt context.
1976   - --------------------------------------------------------------------------*/
1977   -static void
1978   -w9968cf_pop_frame(struct w9968cf_device* cam, struct w9968cf_frame_t** framep)
1979   -{
1980   - u8 i;
1981   -
1982   - spin_lock(&cam->flist_lock);
1983   -
1984   - *framep = cam->requested_frame[0];
1985   -
1986   - /* Shift the list of pointers */
1987   - for (i = 0; i < cam->nbuffers-1; i++)
1988   - cam->requested_frame[i] = cam->requested_frame[i+1];
1989   - cam->requested_frame[i] = NULL;
1990   -
1991   - spin_unlock(&cam->flist_lock);
1992   -
1993   - DBG(6,"Popped frame #%d from the list", (*framep)->number)
1994   -}
1995   -
1996   -
1997   -/*--------------------------------------------------------------------------
1998   - High-level video post-processing routine on grabbed frames.
1999   - Return 0 on success, a negative number otherwise.
2000   - --------------------------------------------------------------------------*/
2001   -static int
2002   -w9968cf_postprocess_frame(struct w9968cf_device* cam,
2003   - struct w9968cf_frame_t* fr)
2004   -{
2005   - void *pIn = fr->buffer, *pOut = cam->frame_vpp.buffer, *tmp;
2006   - u16 w = cam->window.width,
2007   - h = cam->window.height,
2008   - d = cam->picture.depth,
2009   - fmt = cam->picture.palette,
2010   - rgb = cam->force_rgb,
2011   - hw_w = cam->hw_width,
2012   - hw_h = cam->hw_height,
2013   - hw_d = cam->hw_depth;
2014   - int err = 0;
2015   -
2016   - #define _PSWAP(pIn, pOut) {tmp = (pIn); (pIn) = (pOut); (pOut) = tmp;}
2017   -
2018   - if (cam->vpp_flag & VPP_DECOMPRESSION) {
2019   - memcpy(pOut, pIn, fr->length);
2020   - _PSWAP(pIn, pOut)
2021   - err = w9968cf_vpp->decode(pIn, fr->length, hw_w, hw_h, pOut);
2022   - PDBGG("Compressed frame length: %lu",(unsigned long)fr->length)
2023   - fr->length = (hw_w*hw_h*hw_d)/8;
2024   - _PSWAP(pIn, pOut)
2025   - if (err) {
2026   - DBG(4, "An error occurred while decoding the frame: "
2027   - "%s", symbolic(decoder_errlist, err))
2028   - return err;
2029   - } else
2030   - DBG(6, "Frame decoded")
2031   - }
2032   -
2033   - if (cam->vpp_flag & VPP_SWAP_YUV_BYTES) {
2034   - w9968cf_vpp->swap_yuvbytes(pIn, fr->length);
2035   - DBG(6, "Original UYVY component ordering changed")
2036   - }
2037   -
2038   - if (cam->vpp_flag & VPP_UPSCALE) {
2039   - w9968cf_vpp->scale_up(pIn, pOut, hw_w, hw_h, hw_d, w, h);
2040   - fr->length = (w*h*hw_d)/8;
2041   - _PSWAP(pIn, pOut)
2042   - DBG(6, "Vertical up-scaling done: %u,%u,%ubpp->%u,%u",
2043   - hw_w, hw_h, hw_d, w, h)
2044   - }
2045   -
2046   - if (cam->vpp_flag & VPP_UYVY_TO_RGBX) {
2047   - w9968cf_vpp->uyvy_to_rgbx(pIn, fr->length, pOut, fmt, rgb);
2048   - fr->length = (w*h*d)/8;
2049   - _PSWAP(pIn, pOut)
2050   - DBG(6, "UYVY-16bit to %s conversion done",
2051   - symbolic(v4l1_plist, fmt))
2052   - }
2053   -
2054   - if (pOut == fr->buffer)
2055   - memcpy(fr->buffer, cam->frame_vpp.buffer, fr->length);
2056   -
2057   - return 0;
2058   -}
2059   -
2060   -
2061   -
2062   -/****************************************************************************
2063   - * Image sensor control routines *
2064   - ****************************************************************************/
2065   -
2066   -static int
2067   -w9968cf_sensor_set_control(struct w9968cf_device* cam, int cid, int val)
2068   -{
2069   - struct ovcamchip_control ctl;
2070   - int err;
2071   -
2072   - ctl.id = cid;
2073   - ctl.value = val;
2074   -
2075   - err = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_S_CTRL, &ctl);
2076   -
2077   - return err;
2078   -}
2079   -
2080   -
2081   -static int
2082   -w9968cf_sensor_get_control(struct w9968cf_device* cam, int cid, int* val)
2083   -{
2084   - struct ovcamchip_control ctl;
2085   - int err;
2086   -
2087   - ctl.id = cid;
2088   -
2089   - err = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_G_CTRL, &ctl);
2090   - if (!err)
2091   - *val = ctl.value;
2092   -
2093   - return err;
2094   -}
2095   -
2096   -
2097   -static int
2098   -w9968cf_sensor_cmd(struct w9968cf_device* cam, unsigned int cmd, void* arg)
2099   -{
2100   - int rc;
2101   -
2102   - rc = v4l2_subdev_call(cam->sensor_sd, core, ioctl, cmd, arg);
2103   - /* The I2C driver returns -EPERM on non-supported controls */
2104   - return (rc < 0 && rc != -EPERM) ? rc : 0;
2105   -}
2106   -
2107   -
2108   -/*--------------------------------------------------------------------------
2109   - Update some settings of the image sensor.
2110   - Returns: 0 on success, a negative number otherwise.
2111   - --------------------------------------------------------------------------*/
2112   -static int w9968cf_sensor_update_settings(struct w9968cf_device* cam)
2113   -{
2114   - int err = 0;
2115   -
2116   - /* Auto brightness */
2117   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_AUTOBRIGHT,
2118   - cam->auto_brt);
2119   - if (err)
2120   - return err;
2121   -
2122   - /* Auto exposure */
2123   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_AUTOEXP,
2124   - cam->auto_exp);
2125   - if (err)
2126   - return err;
2127   -
2128   - /* Banding filter */
2129   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_BANDFILT,
2130   - cam->bandfilt);
2131   - if (err)
2132   - return err;
2133   -
2134   - /* Light frequency */
2135   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_FREQ,
2136   - cam->lightfreq);
2137   - if (err)
2138   - return err;
2139   -
2140   - /* Back light */
2141   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_BACKLIGHT,
2142   - cam->backlight);
2143   - if (err)
2144   - return err;
2145   -
2146   - /* Mirror */
2147   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_MIRROR,
2148   - cam->mirror);
2149   - if (err)
2150   - return err;
2151   -
2152   - return 0;
2153   -}
2154   -
2155   -
2156   -/*--------------------------------------------------------------------------
2157   - Get some current picture settings from the image sensor and update the
2158   - internal 'picture' structure of the camera.
2159   - Returns: 0 on success, a negative number otherwise.
2160   - --------------------------------------------------------------------------*/
2161   -static int w9968cf_sensor_get_picture(struct w9968cf_device* cam)
2162   -{
2163   - int err, v;
2164   -
2165   - err = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_CONT, &v);
2166   - if (err)
2167   - return err;
2168   - cam->picture.contrast = v;
2169   -
2170   - err = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_BRIGHT, &v);
2171   - if (err)
2172   - return err;
2173   - cam->picture.brightness = v;
2174   -
2175   - err = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_SAT, &v);
2176   - if (err)
2177   - return err;
2178   - cam->picture.colour = v;
2179   -
2180   - err = w9968cf_sensor_get_control(cam, OVCAMCHIP_CID_HUE, &v);
2181   - if (err)
2182   - return err;
2183   - cam->picture.hue = v;
2184   -
2185   - DBG(5, "Got picture settings from the image sensor")
2186   -
2187   - PDBGG("Brightness, contrast, hue, colour, whiteness are "
2188   - "%u,%u,%u,%u,%u", cam->picture.brightness,cam->picture.contrast,
2189   - cam->picture.hue, cam->picture.colour, cam->picture.whiteness)
2190   -
2191   - return 0;
2192   -}
2193   -
2194   -
2195   -/*--------------------------------------------------------------------------
2196   - Update picture settings of the image sensor.
2197   - Returns: 0 on success, a negative number otherwise.
2198   - --------------------------------------------------------------------------*/
2199   -static int
2200   -w9968cf_sensor_update_picture(struct w9968cf_device* cam,
2201   - struct video_picture pict)
2202   -{
2203   - int err = 0;
2204   -
2205   - if ((!cam->sensor_initialized)
2206   - || pict.contrast != cam->picture.contrast) {
2207   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_CONT,
2208   - pict.contrast);
2209   - if (err)
2210   - goto fail;
2211   - DBG(4, "Contrast changed from %u to %u",
2212   - cam->picture.contrast, pict.contrast)
2213   - cam->picture.contrast = pict.contrast;
2214   - }
2215   -
2216   - if (((!cam->sensor_initialized) ||
2217   - pict.brightness != cam->picture.brightness) && (!cam->auto_brt)) {
2218   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_BRIGHT,
2219   - pict.brightness);
2220   - if (err)
2221   - goto fail;
2222   - DBG(4, "Brightness changed from %u to %u",
2223   - cam->picture.brightness, pict.brightness)
2224   - cam->picture.brightness = pict.brightness;
2225   - }
2226   -
2227   - if ((!cam->sensor_initialized) || pict.colour != cam->picture.colour) {
2228   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_SAT,
2229   - pict.colour);
2230   - if (err)
2231   - goto fail;
2232   - DBG(4, "Colour changed from %u to %u",
2233   - cam->picture.colour, pict.colour)
2234   - cam->picture.colour = pict.colour;
2235   - }
2236   -
2237   - if ((!cam->sensor_initialized) || pict.hue != cam->picture.hue) {
2238   - err = w9968cf_sensor_set_control(cam, OVCAMCHIP_CID_HUE,
2239   - pict.hue);
2240   - if (err)
2241   - goto fail;
2242   - DBG(4, "Hue changed from %u to %u",
2243   - cam->picture.hue, pict.hue)
2244   - cam->picture.hue = pict.hue;
2245   - }
2246   -
2247   - return 0;
2248   -
2249   -fail:
2250   - DBG(4, "Failed to change sensor picture setting")
2251   - return err;
2252   -}
2253   -
2254   -
2255   -
2256   -/****************************************************************************
2257   - * Camera configuration *
2258   - ****************************************************************************/
2259   -
2260   -/*--------------------------------------------------------------------------
2261   - This function is called when a supported image sensor is detected.
2262   - Return 0 if the initialization succeeds, a negative number otherwise.
2263   - --------------------------------------------------------------------------*/
2264   -static int w9968cf_sensor_init(struct w9968cf_device* cam)
2265   -{
2266   - int err = 0;
2267   -
2268   - if ((err = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_INITIALIZE,
2269   - &cam->monochrome)))
2270   - goto error;
2271   -
2272   - if ((err = w9968cf_sensor_cmd(cam, OVCAMCHIP_CMD_Q_SUBTYPE,
2273   - &cam->sensor)))
2274   - goto error;
2275   -
2276   - /* NOTE: Make sure width and height are a multiple of 16 */
2277   - switch (v4l2_i2c_subdev_addr(cam->sensor_sd)) {
2278   - case OV6xx0_SID:
2279   - cam->maxwidth = 352;
2280   - cam->maxheight = 288;
2281   - cam->minwidth = 64;
2282   - cam->minheight = 48;
2283   - break;
2284   - case OV7xx0_SID:
2285   - cam->maxwidth = 640;
2286   - cam->maxheight = 480;
2287   - cam->minwidth = 64;
2288   - cam->minheight = 48;
2289   - break;
2290   - default:
2291   - DBG(1, "Not supported image sensor detected for %s",
2292   - symbolic(camlist, cam->id))
2293   - return -EINVAL;
2294   - }
2295   -
2296   - /* These values depend on the ones in the ovxxx0.c sources */
2297   - switch (cam->sensor) {
2298   - case CC_OV7620:
2299   - cam->start_cropx = 287;
2300   - cam->start_cropy = 35;
2301   - /* Seems to work around a bug in the image sensor */
2302   - cam->vs_polarity = 1;
2303   - cam->hs_polarity = 1;
2304   - break;
2305   - default:
2306   - cam->start_cropx = 320;
2307   - cam->start_cropy = 35;
2308   - cam->vs_polarity = 1;
2309   - cam->hs_polarity = 0;
2310   - }
2311   -
2312   - if ((err = w9968cf_sensor_update_settings(cam)))
2313   - goto error;
2314   -
2315   - if ((err = w9968cf_sensor_update_picture(cam, cam->picture)))
2316   - goto error;
2317   -
2318   - cam->sensor_initialized = 1;
2319   -
2320   - DBG(2, "%s image sensor initialized", symbolic(senlist, cam->sensor))
2321   - return 0;
2322   -
2323   -error:
2324   - cam->sensor_initialized = 0;
2325   - cam->sensor = CC_UNKNOWN;
2326   - DBG(1, "Image sensor initialization failed for %s (%s). "
2327   - "Try to detach and attach this device again",
2328   - symbolic(camlist, cam->id), video_device_node_name(cam->v4ldev))
2329   - return err;
2330   -}
2331   -
2332   -
2333   -/*--------------------------------------------------------------------------
2334   - Fill some basic fields in the main device data structure.
2335   - This function is called once on w9968cf_usb_probe() for each recognized
2336   - camera.
2337   - --------------------------------------------------------------------------*/
2338   -static void
2339   -w9968cf_configure_camera(struct w9968cf_device* cam,
2340   - struct usb_device* udev,
2341   - enum w9968cf_model_id mod_id,
2342   - const unsigned short dev_nr)
2343   -{
2344   - mutex_init(&cam->fileop_mutex);
2345   - init_waitqueue_head(&cam->open);
2346   - spin_lock_init(&cam->urb_lock);
2347   - spin_lock_init(&cam->flist_lock);
2348   -
2349   - cam->users = 0;
2350   - cam->disconnected = 0;
2351   - cam->id = mod_id;
2352   - cam->sensor = CC_UNKNOWN;
2353   - cam->sensor_initialized = 0;
2354   -
2355   - /* Calculate the alternate setting number (from 1 to 16)
2356   - according to the 'packet_size' module parameter */
2357   - if (packet_size[dev_nr] < W9968CF_MIN_PACKET_SIZE)
2358   - packet_size[dev_nr] = W9968CF_MIN_PACKET_SIZE;
2359   - for (cam->altsetting = 1;
2360   - packet_size[dev_nr] < wMaxPacketSize[cam->altsetting-1];
2361   - cam->altsetting++);
2362   -
2363   - cam->max_buffers = (max_buffers[dev_nr] < 2 ||
2364   - max_buffers[dev_nr] > W9968CF_MAX_BUFFERS)
2365   - ? W9968CF_BUFFERS : (u8)max_buffers[dev_nr];
2366   -
2367   - cam->double_buffer = (double_buffer[dev_nr] == 0 ||
2368   - double_buffer[dev_nr] == 1)
2369   - ? (u8)double_buffer[dev_nr]:W9968CF_DOUBLE_BUFFER;
2370   -
2371   - cam->clamping = (clamping[dev_nr] == 0 || clamping[dev_nr] == 1)
2372   - ? (u8)clamping[dev_nr] : W9968CF_CLAMPING;
2373   -
2374   - cam->filter_type = (filter_type[dev_nr] == 0 ||
2375   - filter_type[dev_nr] == 1 ||
2376   - filter_type[dev_nr] == 2)
2377   - ? (u8)filter_type[dev_nr] : W9968CF_FILTER_TYPE;
2378   -
2379   - cam->capture = 1;
2380   -
2381   - cam->largeview = (largeview[dev_nr] == 0 || largeview[dev_nr] == 1)
2382   - ? (u8)largeview[dev_nr] : W9968CF_LARGEVIEW;
2383   -
2384   - cam->decompression = (decompression[dev_nr] == 0 ||
2385   - decompression[dev_nr] == 1 ||
2386   - decompression[dev_nr] == 2)
2387   - ? (u8)decompression[dev_nr]:W9968CF_DECOMPRESSION;
2388   -
2389   - cam->upscaling = (upscaling[dev_nr] == 0 ||
2390   - upscaling[dev_nr] == 1)
2391   - ? (u8)upscaling[dev_nr] : W9968CF_UPSCALING;
2392   -
2393   - cam->auto_brt = (autobright[dev_nr] == 0 || autobright[dev_nr] == 1)
2394   - ? (u8)autobright[dev_nr] : W9968CF_AUTOBRIGHT;
2395   -
2396   - cam->auto_exp = (autoexp[dev_nr] == 0 || autoexp[dev_nr] == 1)
2397   - ? (u8)autoexp[dev_nr] : W9968CF_AUTOEXP;
2398   -
2399   - cam->lightfreq = (lightfreq[dev_nr] == 50 || lightfreq[dev_nr] == 60)
2400   - ? (u8)lightfreq[dev_nr] : W9968CF_LIGHTFREQ;
2401   -
2402   - cam->bandfilt = (bandingfilter[dev_nr] == 0 ||
2403   - bandingfilter[dev_nr] == 1)
2404   - ? (u8)bandingfilter[dev_nr] : W9968CF_BANDINGFILTER;
2405   -
2406   - cam->backlight = (backlight[dev_nr] == 0 || backlight[dev_nr] == 1)
2407   - ? (u8)backlight[dev_nr] : W9968CF_BACKLIGHT;
2408   -
2409   - cam->clockdiv = (clockdiv[dev_nr] == -1 || clockdiv[dev_nr] >= 0)
2410   - ? (s8)clockdiv[dev_nr] : W9968CF_CLOCKDIV;
2411   -
2412   - cam->mirror = (mirror[dev_nr] == 0 || mirror[dev_nr] == 1)
2413   - ? (u8)mirror[dev_nr] : W9968CF_MIRROR;
2414   -
2415   - cam->monochrome = (monochrome[dev_nr] == 0 || monochrome[dev_nr] == 1)
2416   - ? monochrome[dev_nr] : W9968CF_MONOCHROME;
2417   -
2418   - cam->picture.brightness = (u16)brightness[dev_nr];
2419   - cam->picture.hue = (u16)hue[dev_nr];
2420   - cam->picture.colour = (u16)colour[dev_nr];
2421   - cam->picture.contrast = (u16)contrast[dev_nr];
2422   - cam->picture.whiteness = (u16)whiteness[dev_nr];
2423   - if (w9968cf_valid_palette((u16)force_palette[dev_nr])) {
2424   - cam->picture.palette = (u16)force_palette[dev_nr];
2425   - cam->force_palette = 1;
2426   - } else {
2427   - cam->force_palette = 0;
2428   - if (cam->decompression == 0)
2429   - cam->picture.palette = W9968CF_PALETTE_DECOMP_OFF;
2430   - else if (cam->decompression == 1)
2431   - cam->picture.palette = W9968CF_PALETTE_DECOMP_FORCE;
2432   - else
2433   - cam->picture.palette = W9968CF_PALETTE_DECOMP_ON;
2434   - }
2435   - cam->picture.depth = w9968cf_valid_depth(cam->picture.palette);
2436   -
2437   - cam->force_rgb = (force_rgb[dev_nr] == 0 || force_rgb[dev_nr] == 1)
2438   - ? (u8)force_rgb[dev_nr] : W9968CF_FORCE_RGB;
2439   -
2440   - cam->window.x = 0;
2441   - cam->window.y = 0;
2442   - cam->window.width = W9968CF_WIDTH;
2443   - cam->window.height = W9968CF_HEIGHT;
2444   - cam->window.chromakey = 0;
2445   - cam->window.clipcount = 0;
2446   - cam->window.flags = 0;
2447   -
2448   - DBG(3, "%s configured with settings #%u:",
2449   - symbolic(camlist, cam->id), dev_nr)
2450   -
2451   - DBG(3, "- Data packet size for USB isochrnous transfer: %u bytes",
2452   - wMaxPacketSize[cam->altsetting-1])
2453   -
2454   - DBG(3, "- Number of requested video frame buffers: %u",
2455   - cam->max_buffers)
2456   -
2457   - if (cam->double_buffer)
2458   - DBG(3, "- Hardware double buffering enabled")
2459   - else
2460   - DBG(3, "- Hardware double buffering disabled")
2461   -
2462   - if (cam->filter_type == 0)
2463   - DBG(3, "- Video filtering disabled")
2464   - else if (cam->filter_type == 1)
2465   - DBG(3, "- Video filtering enabled: type 1-2-1")
2466   - else if (cam->filter_type == 2)
2467   - DBG(3, "- Video filtering enabled: type 2-3-6-3-2")
2468   -
2469   - if (cam->clamping)
2470   - DBG(3, "- Video data clamping (CCIR-601 format) enabled")
2471   - else
2472   - DBG(3, "- Video data clamping (CCIR-601 format) disabled")
2473   -
2474   - if (cam->largeview)
2475   - DBG(3, "- Large view enabled")
2476   - else
2477   - DBG(3, "- Large view disabled")
2478   -
2479   - if ((cam->decompression) == 0 && (!cam->force_palette))
2480   - DBG(3, "- Decompression disabled")
2481   - else if ((cam->decompression) == 1 && (!cam->force_palette))
2482   - DBG(3, "- Decompression forced")
2483   - else if ((cam->decompression) == 2 && (!cam->force_palette))
2484   - DBG(3, "- Decompression allowed")
2485   -
2486   - if (cam->upscaling)
2487   - DBG(3, "- Software image scaling enabled")
2488   - else
2489   - DBG(3, "- Software image scaling disabled")
2490   -
2491   - if (cam->force_palette)
2492   - DBG(3, "- Image palette forced to %s",
2493   - symbolic(v4l1_plist, cam->picture.palette))
2494   -
2495   - if (cam->force_rgb)
2496   - DBG(3, "- RGB component ordering will be used instead of BGR")
2497   -
2498   - if (cam->auto_brt)
2499   - DBG(3, "- Auto brightness enabled")
2500   - else
2501   - DBG(3, "- Auto brightness disabled")
2502   -
2503   - if (cam->auto_exp)
2504   - DBG(3, "- Auto exposure enabled")
2505   - else
2506   - DBG(3, "- Auto exposure disabled")
2507   -
2508   - if (cam->backlight)
2509   - DBG(3, "- Backlight exposure algorithm enabled")
2510   - else
2511   - DBG(3, "- Backlight exposure algorithm disabled")
2512   -
2513   - if (cam->mirror)
2514   - DBG(3, "- Mirror enabled")
2515   - else
2516   - DBG(3, "- Mirror disabled")
2517   -
2518   - if (cam->bandfilt)
2519   - DBG(3, "- Banding filter enabled")
2520   - else
2521   - DBG(3, "- Banding filter disabled")
2522   -
2523   - DBG(3, "- Power lighting frequency: %u", cam->lightfreq)
2524   -
2525   - if (cam->clockdiv == -1)
2526   - DBG(3, "- Automatic clock divisor enabled")
2527   - else
2528   - DBG(3, "- Clock divisor: %d", cam->clockdiv)
2529   -
2530   - if (cam->monochrome)
2531   - DBG(3, "- Image sensor used as monochrome")
2532   - else
2533   - DBG(3, "- Image sensor not used as monochrome")
2534   -}
2535   -
2536   -
2537   -/*--------------------------------------------------------------------------
2538   - If the video post-processing module is not loaded, some parameters
2539   - must be overridden.
2540   - --------------------------------------------------------------------------*/
2541   -static void w9968cf_adjust_configuration(struct w9968cf_device* cam)
2542   -{
2543   - if (!w9968cf_vpp) {
2544   - if (cam->decompression == 1) {
2545   - cam->decompression = 2;
2546   - DBG(2, "Video post-processing module not found: "
2547   - "'decompression' parameter forced to 2")
2548   - }
2549   - if (cam->upscaling) {
2550   - cam->upscaling = 0;
2551   - DBG(2, "Video post-processing module not found: "
2552   - "'upscaling' parameter forced to 0")
2553   - }
2554   - if (cam->picture.palette != VIDEO_PALETTE_UYVY) {
2555   - cam->force_palette = 0;
2556   - DBG(2, "Video post-processing module not found: "
2557   - "'force_palette' parameter forced to 0")
2558   - }
2559   - cam->picture.palette = VIDEO_PALETTE_UYVY;
2560   - cam->picture.depth = w9968cf_valid_depth(cam->picture.palette);
2561   - }
2562   -}
2563   -
2564   -
2565   -/*--------------------------------------------------------------------------
2566   - Release the resources used by the driver.
2567   - This function is called on disconnect
2568   - (or on close if deallocation has been deferred)
2569   - --------------------------------------------------------------------------*/
2570   -static void w9968cf_release_resources(struct w9968cf_device* cam)
2571   -{
2572   - mutex_lock(&w9968cf_devlist_mutex);
2573   -
2574   - DBG(2, "V4L device deregistered: %s",
2575   - video_device_node_name(cam->v4ldev))
2576   -
2577   - video_unregister_device(cam->v4ldev);
2578   - list_del(&cam->v4llist);
2579   - i2c_del_adapter(&cam->i2c_adapter);
2580   - w9968cf_deallocate_memory(cam);
2581   - kfree(cam->control_buffer);
2582   - kfree(cam->data_buffer);
2583   - v4l2_device_unregister(&cam->v4l2_dev);
2584   -
2585   - mutex_unlock(&w9968cf_devlist_mutex);
2586   -}
2587   -
2588   -
2589   -
2590   -/****************************************************************************
2591   - * Video4Linux interface *
2592   - ****************************************************************************/
2593   -
2594   -static int w9968cf_open(struct file *filp)
2595   -{
2596   - struct w9968cf_device* cam;
2597   - int err;
2598   -
2599   - /* This the only safe way to prevent race conditions with disconnect */
2600   - if (!down_read_trylock(&w9968cf_disconnect))
2601   - return -EAGAIN;
2602   -
2603   - cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
2604   -
2605   - mutex_lock(&cam->dev_mutex);
2606   -
2607   - if (cam->sensor == CC_UNKNOWN) {
2608   - DBG(2, "No supported image sensor has been detected by the "
2609   - "'ovcamchip' module for the %s (%s). Make sure "
2610   - "it is loaded *before* (re)connecting the camera.",
2611   - symbolic(camlist, cam->id),
2612   - video_device_node_name(cam->v4ldev))
2613   - mutex_unlock(&cam->dev_mutex);
2614   - up_read(&w9968cf_disconnect);
2615   - return -ENODEV;
2616   - }
2617   -
2618   - if (cam->users) {
2619   - DBG(2, "%s (%s) has been already occupied by '%s'",
2620   - symbolic(camlist, cam->id),
2621   - video_device_node_name(cam->v4ldev), cam->command)
2622   - if ((filp->f_flags & O_NONBLOCK)||(filp->f_flags & O_NDELAY)) {
2623   - mutex_unlock(&cam->dev_mutex);
2624   - up_read(&w9968cf_disconnect);
2625   - return -EWOULDBLOCK;
2626   - }
2627   - mutex_unlock(&cam->dev_mutex);
2628   - err = wait_event_interruptible_exclusive(cam->open,
2629   - cam->disconnected ||
2630   - !cam->users);
2631   - if (err) {
2632   - up_read(&w9968cf_disconnect);
2633   - return err;
2634   - }
2635   - if (cam->disconnected) {
2636   - up_read(&w9968cf_disconnect);
2637   - return -ENODEV;
2638   - }
2639   - mutex_lock(&cam->dev_mutex);
2640   - }
2641   -
2642   - DBG(5, "Opening '%s', %s ...",
2643   - symbolic(camlist, cam->id), video_device_node_name(cam->v4ldev))
2644   -
2645   - cam->streaming = 0;
2646   - cam->misconfigured = 0;
2647   -
2648   - w9968cf_adjust_configuration(cam);
2649   -
2650   - if ((err = w9968cf_allocate_memory(cam)))
2651   - goto deallocate_memory;
2652   -
2653   - if ((err = w9968cf_init_chip(cam)))
2654   - goto deallocate_memory;
2655   -
2656   - if ((err = w9968cf_start_transfer(cam)))
2657   - goto deallocate_memory;
2658   -
2659   - filp->private_data = cam;
2660   -
2661   - cam->users++;
2662   - strcpy(cam->command, current->comm);
2663   -
2664   - init_waitqueue_head(&cam->wait_queue);
2665   -
2666   - DBG(5, "Video device is open")
2667   -
2668   - mutex_unlock(&cam->dev_mutex);
2669   - up_read(&w9968cf_disconnect);
2670   -
2671   - return 0;
2672   -
2673   -deallocate_memory:
2674   - w9968cf_deallocate_memory(cam);
2675   - DBG(2, "Failed to open the video device")
2676   - mutex_unlock(&cam->dev_mutex);
2677   - up_read(&w9968cf_disconnect);
2678   - return err;
2679   -}
2680   -
2681   -
2682   -static int w9968cf_release(struct file *filp)
2683   -{
2684   - struct w9968cf_device* cam;
2685   -
2686   - cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
2687   -
2688   - mutex_lock(&cam->dev_mutex); /* prevent disconnect() to be called */
2689   -
2690   - w9968cf_stop_transfer(cam);
2691   -
2692   - if (cam->disconnected) {
2693   - w9968cf_release_resources(cam);
2694   - mutex_unlock(&cam->dev_mutex);
2695   - kfree(cam);
2696   - return 0;
2697   - }
2698   -
2699   - cam->users--;
2700   - w9968cf_deallocate_memory(cam);
2701   - wake_up_interruptible_nr(&cam->open, 1);
2702   -
2703   - DBG(5, "Video device closed")
2704   - mutex_unlock(&cam->dev_mutex);
2705   - return 0;
2706   -}
2707   -
2708   -
2709   -static ssize_t
2710   -w9968cf_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
2711   -{
2712   - struct w9968cf_device* cam;
2713   - struct w9968cf_frame_t* fr;
2714   - int err = 0;
2715   -
2716   - cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
2717   -
2718   - if (filp->f_flags & O_NONBLOCK)
2719   - return -EWOULDBLOCK;
2720   -
2721   - if (mutex_lock_interruptible(&cam->fileop_mutex))
2722   - return -ERESTARTSYS;
2723   -
2724   - if (cam->disconnected) {
2725   - DBG(2, "Device not present")
2726   - mutex_unlock(&cam->fileop_mutex);
2727   - return -ENODEV;
2728   - }
2729   -
2730   - if (cam->misconfigured) {
2731   - DBG(2, "The camera is misconfigured. Close and open it again.")
2732   - mutex_unlock(&cam->fileop_mutex);
2733   - return -EIO;
2734   - }
2735   -
2736   - if (!cam->frame[0].queued)
2737   - w9968cf_push_frame(cam, 0);
2738   -
2739   - if (!cam->frame[1].queued)
2740   - w9968cf_push_frame(cam, 1);
2741   -
2742   - err = wait_event_interruptible(cam->wait_queue,
2743   - cam->frame[0].status == F_READY ||
2744   - cam->frame[1].status == F_READY ||
2745   - cam->disconnected);
2746   - if (err) {
2747   - mutex_unlock(&cam->fileop_mutex);
2748   - return err;
2749   - }
2750   - if (cam->disconnected) {
2751   - mutex_unlock(&cam->fileop_mutex);
2752   - return -ENODEV;
2753   - }
2754   -
2755   - fr = (cam->frame[0].status == F_READY) ? &cam->frame[0]:&cam->frame[1];
2756   -
2757   - if (w9968cf_vpp)
2758   - w9968cf_postprocess_frame(cam, fr);
2759   -
2760   - if (count > fr->length)
2761   - count = fr->length;
2762   -
2763   - if (copy_to_user(buf, fr->buffer, count)) {
2764   - fr->status = F_UNUSED;
2765   - mutex_unlock(&cam->fileop_mutex);
2766   - return -EFAULT;
2767   - }
2768   - *f_pos += count;
2769   -
2770   - fr->status = F_UNUSED;
2771   -
2772   - DBG(5, "%zu bytes read", count)
2773   -
2774   - mutex_unlock(&cam->fileop_mutex);
2775   - return count;
2776   -}
2777   -
2778   -
2779   -static int w9968cf_mmap(struct file* filp, struct vm_area_struct *vma)
2780   -{
2781   - struct w9968cf_device* cam = (struct w9968cf_device*)
2782   - video_get_drvdata(video_devdata(filp));
2783   - unsigned long vsize = vma->vm_end - vma->vm_start,
2784   - psize = cam->nbuffers * cam->frame[0].size,
2785   - start = vma->vm_start,
2786   - pos = (unsigned long)cam->frame[0].buffer,
2787   - page;
2788   -
2789   - if (cam->disconnected) {
2790   - DBG(2, "Device not present")
2791   - return -ENODEV;
2792   - }
2793   -
2794   - if (cam->misconfigured) {
2795   - DBG(2, "The camera is misconfigured. Close and open it again")
2796   - return -EIO;
2797   - }
2798   -
2799   - PDBGG("mmapping %lu bytes...", vsize)
2800   -
2801   - if (vsize > psize - (vma->vm_pgoff << PAGE_SHIFT))
2802   - return -EINVAL;
2803   -
2804   - while (vsize > 0) {
2805   - page = vmalloc_to_pfn((void *)pos);
2806   - if (remap_pfn_range(vma, start, page + vma->vm_pgoff,
2807   - PAGE_SIZE, vma->vm_page_prot))
2808   - return -EAGAIN;
2809   - start += PAGE_SIZE;
2810   - pos += PAGE_SIZE;
2811   - vsize -= PAGE_SIZE;
2812   - }
2813   -
2814   - DBG(5, "mmap method successfully called")
2815   - return 0;
2816   -}
2817   -
2818   -
2819   -static long
2820   -w9968cf_ioctl(struct file *filp,
2821   - unsigned int cmd, unsigned long arg)
2822   -{
2823   - struct w9968cf_device* cam;
2824   - long err;
2825   -
2826   - cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
2827   -
2828   - if (mutex_lock_interruptible(&cam->fileop_mutex))
2829   - return -ERESTARTSYS;
2830   -
2831   - if (cam->disconnected) {
2832   - DBG(2, "Device not present")
2833   - mutex_unlock(&cam->fileop_mutex);
2834   - return -ENODEV;
2835   - }
2836   -
2837   - if (cam->misconfigured) {
2838   - DBG(2, "The camera is misconfigured. Close and open it again.")
2839   - mutex_unlock(&cam->fileop_mutex);
2840   - return -EIO;
2841   - }
2842   -
2843   - err = w9968cf_v4l_ioctl(filp, cmd, (void __user *)arg);
2844   -
2845   - mutex_unlock(&cam->fileop_mutex);
2846   - return err;
2847   -}
2848   -
2849   -
2850   -static long w9968cf_v4l_ioctl(struct file *filp,
2851   - unsigned int cmd, void __user *arg)
2852   -{
2853   - struct w9968cf_device* cam;
2854   - const char* v4l1_ioctls[] = {
2855   - "?", "CGAP", "GCHAN", "SCHAN", "GTUNER", "STUNER",
2856   - "GPICT", "SPICT", "CCAPTURE", "GWIN", "SWIN", "GFBUF",
2857   - "SFBUF", "KEY", "GFREQ", "SFREQ", "GAUDIO", "SAUDIO",
2858   - "SYNC", "MCAPTURE", "GMBUF", "GUNIT", "GCAPTURE", "SCAPTURE",
2859   - "SPLAYMODE", "SWRITEMODE", "GPLAYINFO", "SMICROCODE",
2860   - "GVBIFMT", "SVBIFMT"
2861   - };
2862   -
2863   - #define V4L1_IOCTL(cmd) \
2864   - ((_IOC_NR((cmd)) < ARRAY_SIZE(v4l1_ioctls)) ? \
2865   - v4l1_ioctls[_IOC_NR((cmd))] : "?")
2866   -
2867   - cam = (struct w9968cf_device*)video_get_drvdata(video_devdata(filp));
2868   -
2869   - switch (cmd) {
2870   -
2871   - case VIDIOCGCAP: /* get video capability */
2872   - {
2873   - struct video_capability cap = {
2874   - .type = VID_TYPE_CAPTURE | VID_TYPE_SCALES,
2875   - .channels = 1,
2876   - .audios = 0,
2877   - .minwidth = cam->minwidth,
2878   - .minheight = cam->minheight,
2879   - };
2880   - sprintf(cap.name, "W996[87]CF USB Camera");
2881   - cap.maxwidth = (cam->upscaling && w9968cf_vpp)
2882   - ? max((u16)W9968CF_MAX_WIDTH, cam->maxwidth)
2883   - : cam->maxwidth;
2884   - cap.maxheight = (cam->upscaling && w9968cf_vpp)
2885   - ? max((u16)W9968CF_MAX_HEIGHT, cam->maxheight)
2886   - : cam->maxheight;
2887   -
2888   - if (copy_to_user(arg, &cap, sizeof(cap)))
2889   - return -EFAULT;
2890   -
2891   - DBG(5, "VIDIOCGCAP successfully called")
2892   - return 0;
2893   - }
2894   -
2895   - case VIDIOCGCHAN: /* get video channel informations */
2896   - {
2897   - struct video_channel chan;
2898   - if (copy_from_user(&chan, arg, sizeof(chan)))
2899   - return -EFAULT;
2900   -
2901   - if (chan.channel != 0)
2902   - return -EINVAL;
2903   -
2904   - strcpy(chan.name, "Camera");
2905   - chan.tuners = 0;
2906   - chan.flags = 0;
2907   - chan.type = VIDEO_TYPE_CAMERA;
2908   - chan.norm = VIDEO_MODE_AUTO;
2909   -
2910   - if (copy_to_user(arg, &chan, sizeof(chan)))
2911   - return -EFAULT;
2912   -
2913   - DBG(5, "VIDIOCGCHAN successfully called")
2914   - return 0;
2915   - }
2916   -
2917   - case VIDIOCSCHAN: /* set active channel */
2918   - {
2919   - struct video_channel chan;
2920   -
2921   - if (copy_from_user(&chan, arg, sizeof(chan)))
2922   - return -EFAULT;
2923   -
2924   - if (chan.channel != 0)
2925   - return -EINVAL;
2926   -
2927   - DBG(5, "VIDIOCSCHAN successfully called")
2928   - return 0;
2929   - }
2930   -
2931   - case VIDIOCGPICT: /* get image properties of the picture */
2932   - {
2933   - if (w9968cf_sensor_get_picture(cam))
2934   - return -EIO;
2935   -
2936   - if (copy_to_user(arg, &cam->picture, sizeof(cam->picture)))
2937   - return -EFAULT;
2938   -
2939   - DBG(5, "VIDIOCGPICT successfully called")
2940   - return 0;
2941   - }
2942   -
2943   - case VIDIOCSPICT: /* change picture settings */
2944   - {
2945   - struct video_picture pict;
2946   - int err = 0;
2947   -
2948   - if (copy_from_user(&pict, arg, sizeof(pict)))
2949   - return -EFAULT;
2950   -
2951   - if ( (cam->force_palette || !w9968cf_vpp)
2952   - && pict.palette != cam->picture.palette ) {
2953   - DBG(4, "Palette %s rejected: only %s is allowed",
2954   - symbolic(v4l1_plist, pict.palette),
2955   - symbolic(v4l1_plist, cam->picture.palette))
2956   - return -EINVAL;
2957   - }
2958   -
2959   - if (!w9968cf_valid_palette(pict.palette)) {
2960   - DBG(4, "Palette %s not supported. VIDIOCSPICT failed",
2961   - symbolic(v4l1_plist, pict.palette))
2962   - return -EINVAL;
2963   - }
2964   -
2965   - if (!cam->force_palette) {
2966   - if (cam->decompression == 0) {
2967   - if (w9968cf_need_decompression(pict.palette)) {
2968   - DBG(4, "Decompression disabled: palette %s is not "
2969   - "allowed. VIDIOCSPICT failed",
2970   - symbolic(v4l1_plist, pict.palette))
2971   - return -EINVAL;
2972   - }
2973   - } else if (cam->decompression == 1) {
2974   - if (!w9968cf_need_decompression(pict.palette)) {
2975   - DBG(4, "Decompression forced: palette %s is not "
2976   - "allowed. VIDIOCSPICT failed",
2977   - symbolic(v4l1_plist, pict.palette))
2978   - return -EINVAL;
2979   - }
2980   - }
2981   - }
2982   -
2983   - if (pict.depth != w9968cf_valid_depth(pict.palette)) {
2984   - DBG(4, "Requested depth %u bpp is not valid for %s "
2985   - "palette: ignored and changed to %u bpp",
2986   - pict.depth, symbolic(v4l1_plist, pict.palette),
2987   - w9968cf_valid_depth(pict.palette))
2988   - pict.depth = w9968cf_valid_depth(pict.palette);
2989   - }
2990   -
2991   - if (pict.palette != cam->picture.palette) {
2992   - if(*cam->requested_frame
2993   - || cam->frame_current->queued) {
2994   - err = wait_event_interruptible
2995   - ( cam->wait_queue,
2996   - cam->disconnected ||
2997   - (!*cam->requested_frame &&
2998   - !cam->frame_current->queued) );
2999   - if (err)
3000   - return err;
3001   - if (cam->disconnected)
3002   - return -ENODEV;
3003   - }
3004   -
3005   - if (w9968cf_stop_transfer(cam))
3006   - goto ioctl_fail;
3007   -
3008   - if (w9968cf_set_picture(cam, pict))
3009   - goto ioctl_fail;
3010   -
3011   - if (w9968cf_start_transfer(cam))
3012   - goto ioctl_fail;
3013   -
3014   - } else if (w9968cf_sensor_update_picture(cam, pict))
3015   - return -EIO;
3016   -
3017   -
3018   - DBG(5, "VIDIOCSPICT successfully called")
3019   - return 0;
3020   - }
3021   -
3022   - case VIDIOCSWIN: /* set capture area */
3023   - {
3024   - struct video_window win;
3025   - int err = 0;
3026   -
3027   - if (copy_from_user(&win, arg, sizeof(win)))
3028   - return -EFAULT;
3029   -
3030   - DBG(6, "VIDIOCSWIN called: clipcount=%d, flags=%u, "
3031   - "x=%u, y=%u, %ux%u", win.clipcount, win.flags,
3032   - win.x, win.y, win.width, win.height)
3033   -
3034   - if (win.clipcount != 0 || win.flags != 0)
3035   - return -EINVAL;
3036   -
3037   - if ((err = w9968cf_adjust_window_size(cam, &win.width,
3038   - &win.height))) {
3039   - DBG(4, "Resolution not supported (%ux%u). "
3040   - "VIDIOCSWIN failed", win.width, win.height)
3041   - return err;
3042   - }
3043   -
3044   - if (win.x != cam->window.x ||
3045   - win.y != cam->window.y ||
3046   - win.width != cam->window.width ||
3047   - win.height != cam->window.height) {
3048   - if(*cam->requested_frame
3049   - || cam->frame_current->queued) {
3050   - err = wait_event_interruptible
3051   - ( cam->wait_queue,
3052   - cam->disconnected ||
3053   - (!*cam->requested_frame &&
3054   - !cam->frame_current->queued) );
3055   - if (err)
3056   - return err;
3057   - if (cam->disconnected)
3058   - return -ENODEV;
3059   - }
3060   -
3061   - if (w9968cf_stop_transfer(cam))
3062   - goto ioctl_fail;
3063   -
3064   - /* This _must_ be called before set_window() */
3065   - if (w9968cf_set_picture(cam, cam->picture))
3066   - goto ioctl_fail;
3067   -
3068   - if (w9968cf_set_window(cam, win))
3069   - goto ioctl_fail;
3070   -
3071   - if (w9968cf_start_transfer(cam))
3072   - goto ioctl_fail;
3073   - }
3074   -
3075   - DBG(5, "VIDIOCSWIN successfully called. ")
3076   - return 0;
3077   - }
3078   -
3079   - case VIDIOCGWIN: /* get current window properties */
3080   - {
3081   - if (copy_to_user(arg,&cam->window,sizeof(struct video_window)))
3082   - return -EFAULT;
3083   -
3084   - DBG(5, "VIDIOCGWIN successfully called")
3085   - return 0;
3086   - }
3087   -
3088   - case VIDIOCGMBUF: /* request for memory (mapped) buffer */
3089   - {
3090   - struct video_mbuf mbuf;
3091   - u8 i;
3092   -
3093   - mbuf.size = cam->nbuffers * cam->frame[0].size;
3094   - mbuf.frames = cam->nbuffers;
3095   - for (i = 0; i < cam->nbuffers; i++)
3096   - mbuf.offsets[i] = (unsigned long)cam->frame[i].buffer -
3097   - (unsigned long)cam->frame[0].buffer;
3098   -
3099   - if (copy_to_user(arg, &mbuf, sizeof(mbuf)))
3100   - return -EFAULT;
3101   -
3102   - DBG(5, "VIDIOCGMBUF successfully called")
3103   - return 0;
3104   - }
3105   -
3106   - case VIDIOCMCAPTURE: /* start the capture to a frame */
3107   - {
3108   - struct video_mmap mmap;
3109   - struct w9968cf_frame_t* fr;
3110   - u32 w, h;
3111   - int err = 0;
3112   -
3113   - if (copy_from_user(&mmap, arg, sizeof(mmap)))
3114   - return -EFAULT;
3115   -
3116   - DBG(6, "VIDIOCMCAPTURE called: frame #%u, format=%s, %dx%d",
3117   - mmap.frame, symbolic(v4l1_plist, mmap.format),
3118   - mmap.width, mmap.height)
3119   -
3120   - if (mmap.frame >= cam->nbuffers) {
3121   - DBG(4, "Invalid frame number (%u). "
3122   - "VIDIOCMCAPTURE failed", mmap.frame)
3123   - return -EINVAL;
3124   - }
3125   -
3126   - if (mmap.format!=cam->picture.palette &&
3127   - (cam->force_palette || !w9968cf_vpp)) {
3128   - DBG(4, "Palette %s rejected: only %s is allowed",
3129   - symbolic(v4l1_plist, mmap.format),
3130   - symbolic(v4l1_plist, cam->picture.palette))
3131   - return -EINVAL;
3132   - }
3133   -
3134   - if (!w9968cf_valid_palette(mmap.format)) {
3135   - DBG(4, "Palette %s not supported. "
3136   - "VIDIOCMCAPTURE failed",
3137   - symbolic(v4l1_plist, mmap.format))
3138   - return -EINVAL;
3139   - }
3140   -
3141   - if (!cam->force_palette) {
3142   - if (cam->decompression == 0) {
3143   - if (w9968cf_need_decompression(mmap.format)) {
3144   - DBG(4, "Decompression disabled: palette %s is not "
3145   - "allowed. VIDIOCSPICT failed",
3146   - symbolic(v4l1_plist, mmap.format))
3147   - return -EINVAL;
3148   - }
3149   - } else if (cam->decompression == 1) {
3150   - if (!w9968cf_need_decompression(mmap.format)) {
3151   - DBG(4, "Decompression forced: palette %s is not "
3152   - "allowed. VIDIOCSPICT failed",
3153   - symbolic(v4l1_plist, mmap.format))
3154   - return -EINVAL;
3155   - }
3156   - }
3157   - }
3158   -
3159   - w = mmap.width; h = mmap.height;
3160   - err = w9968cf_adjust_window_size(cam, &w, &h);
3161   - mmap.width = w; mmap.height = h;
3162   - if (err) {
3163   - DBG(4, "Resolution not supported (%dx%d). "
3164   - "VIDIOCMCAPTURE failed",
3165   - mmap.width, mmap.height)
3166   - return err;
3167   - }
3168   -
3169   - fr = &cam->frame[mmap.frame];
3170   -
3171   - if (mmap.width != cam->window.width ||
3172   - mmap.height != cam->window.height ||
3173   - mmap.format != cam->picture.palette) {
3174   -
3175   - struct video_window win;
3176   - struct video_picture pict;
3177   -
3178   - if(*cam->requested_frame
3179   - || cam->frame_current->queued) {
3180   - DBG(6, "VIDIOCMCAPTURE. Change settings for "
3181   - "frame #%u: %dx%d, format %s. Wait...",
3182   - mmap.frame, mmap.width, mmap.height,
3183   - symbolic(v4l1_plist, mmap.format))
3184   - err = wait_event_interruptible
3185   - ( cam->wait_queue,
3186   - cam->disconnected ||
3187   - (!*cam->requested_frame &&
3188   - !cam->frame_current->queued) );
3189   - if (err)
3190   - return err;
3191   - if (cam->disconnected)
3192   - return -ENODEV;
3193   - }
3194   -
3195   - memcpy(&win, &cam->window, sizeof(win));
3196   - memcpy(&pict, &cam->picture, sizeof(pict));
3197   - win.width = mmap.width;
3198   - win.height = mmap.height;
3199   - pict.palette = mmap.format;
3200   -
3201   - if (w9968cf_stop_transfer(cam))
3202   - goto ioctl_fail;
3203   -
3204   - /* This before set_window */
3205   - if (w9968cf_set_picture(cam, pict))
3206   - goto ioctl_fail;
3207   -
3208   - if (w9968cf_set_window(cam, win))
3209   - goto ioctl_fail;
3210   -
3211   - if (w9968cf_start_transfer(cam))
3212   - goto ioctl_fail;
3213   -
3214   - } else if (fr->queued) {
3215   -
3216   - DBG(6, "Wait until frame #%u is free", mmap.frame)
3217   -
3218   - err = wait_event_interruptible(cam->wait_queue,
3219   - cam->disconnected ||
3220   - (!fr->queued));
3221   - if (err)
3222   - return err;
3223   - if (cam->disconnected)
3224   - return -ENODEV;
3225   - }
3226   -
3227   - w9968cf_push_frame(cam, mmap.frame);
3228   - DBG(5, "VIDIOCMCAPTURE(%u): successfully called", mmap.frame)
3229   - return 0;
3230   - }
3231   -
3232   - case VIDIOCSYNC: /* wait until the capture of a frame is finished */
3233   - {
3234   - unsigned int f_num;
3235   - struct w9968cf_frame_t* fr;
3236   - int err = 0;
3237   -
3238   - if (copy_from_user(&f_num, arg, sizeof(f_num)))
3239   - return -EFAULT;
3240   -
3241   - if (f_num >= cam->nbuffers) {
3242   - DBG(4, "Invalid frame number (%u). "
3243   - "VIDIOCMCAPTURE failed", f_num)
3244   - return -EINVAL;
3245   - }
3246   -
3247   - DBG(6, "VIDIOCSYNC called for frame #%u", f_num)
3248   -
3249   - fr = &cam->frame[f_num];
3250   -
3251   - switch (fr->status) {
3252   - case F_UNUSED:
3253   - if (!fr->queued) {
3254   - DBG(4, "VIDIOSYNC: Frame #%u not requested!",
3255   - f_num)
3256   - return -EFAULT;
3257   - }
3258   - case F_ERROR:
3259   - case F_GRABBING:
3260   - err = wait_event_interruptible(cam->wait_queue,
3261   - (fr->status == F_READY)
3262   - || cam->disconnected);
3263   - if (err)
3264   - return err;
3265   - if (cam->disconnected)
3266   - return -ENODEV;
3267   - break;
3268   - case F_READY:
3269   - break;
3270   - }
3271   -
3272   - if (w9968cf_vpp)
3273   - w9968cf_postprocess_frame(cam, fr);
3274   -
3275   - fr->status = F_UNUSED;
3276   -
3277   - DBG(5, "VIDIOCSYNC(%u) successfully called", f_num)
3278   - return 0;
3279   - }
3280   -
3281   - case VIDIOCGUNIT:/* report the unit numbers of the associated devices*/
3282   - {
3283   - struct video_unit unit = {
3284   - .video = cam->v4ldev->minor,
3285   - .vbi = VIDEO_NO_UNIT,
3286   - .radio = VIDEO_NO_UNIT,
3287   - .audio = VIDEO_NO_UNIT,
3288   - .teletext = VIDEO_NO_UNIT,
3289   - };
3290   -
3291   - if (copy_to_user(arg, &unit, sizeof(unit)))
3292   - return -EFAULT;
3293   -
3294   - DBG(5, "VIDIOCGUNIT successfully called")
3295   - return 0;
3296   - }
3297   -
3298   - case VIDIOCKEY:
3299   - return 0;
3300   -
3301   - case VIDIOCGFBUF:
3302   - {
3303   - if (clear_user(arg, sizeof(struct video_buffer)))
3304   - return -EFAULT;
3305   -
3306   - DBG(5, "VIDIOCGFBUF successfully called")
3307   - return 0;
3308   - }
3309   -
3310   - case VIDIOCGTUNER:
3311   - {
3312   - struct video_tuner tuner;
3313   - if (copy_from_user(&tuner, arg, sizeof(tuner)))
3314   - return -EFAULT;
3315   -
3316   - if (tuner.tuner != 0)
3317   - return -EINVAL;
3318   -
3319   - strcpy(tuner.name, "no_tuner");
3320   - tuner.rangelow = 0;
3321   - tuner.rangehigh = 0;
3322   - tuner.flags = VIDEO_TUNER_NORM;
3323   - tuner.mode = VIDEO_MODE_AUTO;
3324   - tuner.signal = 0xffff;
3325   -
3326   - if (copy_to_user(arg, &tuner, sizeof(tuner)))
3327   - return -EFAULT;
3328   -
3329   - DBG(5, "VIDIOCGTUNER successfully called")
3330   - return 0;
3331   - }
3332   -
3333   - case VIDIOCSTUNER:
3334   - {
3335   - struct video_tuner tuner;
3336   - if (copy_from_user(&tuner, arg, sizeof(tuner)))
3337   - return -EFAULT;
3338   -
3339   - if (tuner.tuner != 0)
3340   - return -EINVAL;
3341   -
3342   - if (tuner.mode != VIDEO_MODE_AUTO)
3343   - return -EINVAL;
3344   -
3345   - DBG(5, "VIDIOCSTUNER successfully called")
3346   - return 0;
3347   - }
3348   -
3349   - case VIDIOCSFBUF:
3350   - case VIDIOCCAPTURE:
3351   - case VIDIOCGFREQ:
3352   - case VIDIOCSFREQ:
3353   - case VIDIOCGAUDIO:
3354   - case VIDIOCSAUDIO:
3355   - case VIDIOCSPLAYMODE:
3356   - case VIDIOCSWRITEMODE:
3357   - case VIDIOCGPLAYINFO:
3358   - case VIDIOCSMICROCODE:
3359   - case VIDIOCGVBIFMT:
3360   - case VIDIOCSVBIFMT:
3361   - DBG(4, "Unsupported V4L1 IOCtl: VIDIOC%s "
3362   - "(type 0x%01X, "
3363   - "n. 0x%01X, "
3364   - "dir. 0x%01X, "
3365   - "size 0x%02X)",
3366   - V4L1_IOCTL(cmd),
3367   - _IOC_TYPE(cmd),_IOC_NR(cmd),_IOC_DIR(cmd),_IOC_SIZE(cmd))
3368   -
3369   - return -EINVAL;
3370   -
3371   - default:
3372   - DBG(4, "Invalid V4L1 IOCtl: VIDIOC%s "
3373   - "type 0x%01X, "
3374   - "n. 0x%01X, "
3375   - "dir. 0x%01X, "
3376   - "size 0x%02X",
3377   - V4L1_IOCTL(cmd),
3378   - _IOC_TYPE(cmd),_IOC_NR(cmd),_IOC_DIR(cmd),_IOC_SIZE(cmd))
3379   -
3380   - return -ENOIOCTLCMD;
3381   -
3382   - } /* end of switch */
3383   -
3384   -ioctl_fail:
3385   - cam->misconfigured = 1;
3386   - DBG(1, "VIDIOC%s failed because of hardware problems. "
3387   - "To use the camera, close and open it again.", V4L1_IOCTL(cmd))
3388   - return -EFAULT;
3389   -}
3390   -
3391   -
3392   -static const struct v4l2_file_operations w9968cf_fops = {
3393   - .owner = THIS_MODULE,
3394   - .open = w9968cf_open,
3395   - .release = w9968cf_release,
3396   - .read = w9968cf_read,
3397   - .ioctl = w9968cf_ioctl,
3398   - .mmap = w9968cf_mmap,
3399   -};
3400   -
3401   -
3402   -
3403   -/****************************************************************************
3404   - * USB probe and V4L registration, disconnect and id_table[] definition *
3405   - ****************************************************************************/
3406   -
3407   -static int
3408   -w9968cf_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
3409   -{
3410   - struct usb_device *udev = interface_to_usbdev(intf);
3411   - struct w9968cf_device* cam;
3412   - int err = 0;
3413   - enum w9968cf_model_id mod_id;
3414   - struct list_head* ptr;
3415   - u8 sc = 0; /* number of simultaneous cameras */
3416   - static unsigned short dev_nr; /* 0 - we are handling device number n */
3417   - static unsigned short addrs[] = {
3418   - OV7xx0_SID,
3419   - OV6xx0_SID,
3420   - I2C_CLIENT_END
3421   - };
3422   -
3423   - if (le16_to_cpu(udev->descriptor.idVendor) == winbond_id_table[0].idVendor &&
3424   - le16_to_cpu(udev->descriptor.idProduct) == winbond_id_table[0].idProduct)
3425   - mod_id = W9968CF_MOD_CLVBWGP; /* see camlist[] table */
3426   - else if (le16_to_cpu(udev->descriptor.idVendor) == winbond_id_table[1].idVendor &&
3427   - le16_to_cpu(udev->descriptor.idProduct) == winbond_id_table[1].idProduct)
3428   - mod_id = W9968CF_MOD_GENERIC; /* see camlist[] table */
3429   - else
3430   - return -ENODEV;
3431   -
3432   - cam = kzalloc(sizeof(struct w9968cf_device), GFP_KERNEL);
3433   - if (!cam)
3434   - return -ENOMEM;
3435   -
3436   - err = v4l2_device_register(&intf->dev, &cam->v4l2_dev);
3437   - if (err)
3438   - goto fail0;
3439   -
3440   - mutex_init(&cam->dev_mutex);
3441   - mutex_lock(&cam->dev_mutex);
3442   -
3443   - cam->usbdev = udev;
3444   -
3445   - DBG(2, "%s detected", symbolic(camlist, mod_id))
3446   -
3447   - if (simcams > W9968CF_MAX_DEVICES)
3448   - simcams = W9968CF_SIMCAMS;
3449   -
3450   - /* How many cameras are connected ? */
3451   - mutex_lock(&w9968cf_devlist_mutex);
3452   - list_for_each(ptr, &w9968cf_dev_list)
3453   - sc++;
3454   - mutex_unlock(&w9968cf_devlist_mutex);
3455   -
3456   - if (sc >= simcams) {
3457   - DBG(2, "Device rejected: too many connected cameras "
3458   - "(max. %u)", simcams)
3459   - err = -EPERM;
3460   - goto fail;
3461   - }
3462   -
3463   -
3464   - /* Allocate 2 bytes of memory for camera control USB transfers */
3465   - if (!(cam->control_buffer = kzalloc(2, GFP_KERNEL))) {
3466   - DBG(1,"Couldn't allocate memory for camera control transfers")
3467   - err = -ENOMEM;
3468   - goto fail;
3469   - }
3470   -
3471   - /* Allocate 8 bytes of memory for USB data transfers to the FSB */
3472   - if (!(cam->data_buffer = kzalloc(8, GFP_KERNEL))) {
3473   - DBG(1, "Couldn't allocate memory for data "
3474   - "transfers to the FSB")
3475   - err = -ENOMEM;
3476   - goto fail;
3477   - }
3478   -
3479   - /* Register the V4L device */
3480   - cam->v4ldev = video_device_alloc();
3481   - if (!cam->v4ldev) {
3482   - DBG(1, "Could not allocate memory for a V4L structure")
3483   - err = -ENOMEM;
3484   - goto fail;
3485   - }
3486   -
3487   - strcpy(cam->v4ldev->name, symbolic(camlist, mod_id));
3488   - cam->v4ldev->fops = &w9968cf_fops;
3489   - cam->v4ldev->release = video_device_release;
3490   - video_set_drvdata(cam->v4ldev, cam);
3491   - cam->v4ldev->v4l2_dev = &cam->v4l2_dev;
3492   -
3493   - err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
3494   - video_nr[dev_nr]);
3495   - if (err) {
3496   - DBG(1, "V4L device registration failed")
3497   - if (err == -ENFILE && video_nr[dev_nr] == -1)
3498   - DBG(2, "Couldn't find a free /dev/videoX node")
3499   - video_nr[dev_nr] = -1;
3500   - dev_nr = (dev_nr < W9968CF_MAX_DEVICES-1) ? dev_nr+1 : 0;
3501   - goto fail;
3502   - }
3503   -
3504   - DBG(2, "V4L device registered as %s",
3505   - video_device_node_name(cam->v4ldev))
3506   -
3507   - /* Set some basic constants */
3508   - w9968cf_configure_camera(cam, udev, mod_id, dev_nr);
3509   -
3510   - /* Add a new entry into the list of V4L registered devices */
3511   - mutex_lock(&w9968cf_devlist_mutex);
3512   - list_add(&cam->v4llist, &w9968cf_dev_list);
3513   - mutex_unlock(&w9968cf_devlist_mutex);
3514   - dev_nr = (dev_nr < W9968CF_MAX_DEVICES-1) ? dev_nr+1 : 0;
3515   -
3516   - w9968cf_turn_on_led(cam);
3517   -
3518   - w9968cf_i2c_init(cam);
3519   - cam->sensor_sd = v4l2_i2c_new_subdev(&cam->v4l2_dev,
3520   - &cam->i2c_adapter,
3521   - "ovcamchip", "ovcamchip", 0, addrs);
3522   -
3523   - usb_set_intfdata(intf, cam);
3524   - mutex_unlock(&cam->dev_mutex);
3525   -
3526   - err = w9968cf_sensor_init(cam);
3527   - return 0;
3528   -
3529   -fail: /* Free unused memory */
3530   - kfree(cam->control_buffer);
3531   - kfree(cam->data_buffer);
3532   - if (cam->v4ldev)
3533   - video_device_release(cam->v4ldev);
3534   - mutex_unlock(&cam->dev_mutex);
3535   - v4l2_device_unregister(&cam->v4l2_dev);
3536   -fail0:
3537   - kfree(cam);
3538   - return err;
3539   -}
3540   -
3541   -
3542   -static void w9968cf_usb_disconnect(struct usb_interface* intf)
3543   -{
3544   - struct w9968cf_device* cam =
3545   - (struct w9968cf_device*)usb_get_intfdata(intf);
3546   -
3547   - if (cam) {
3548   - down_write(&w9968cf_disconnect);
3549   - /* Prevent concurrent accesses to data */
3550   - mutex_lock(&cam->dev_mutex);
3551   -
3552   - cam->disconnected = 1;
3553   -
3554   - DBG(2, "Disconnecting %s...", symbolic(camlist, cam->id));
3555   -
3556   - v4l2_device_disconnect(&cam->v4l2_dev);
3557   -
3558   - wake_up_interruptible_all(&cam->open);
3559   -
3560   - if (cam->users) {
3561   - DBG(2, "The device is open (%s)! "
3562   - "Process name: %s. Deregistration and memory "
3563   - "deallocation are deferred on close.",
3564   - video_device_node_name(cam->v4ldev), cam->command)
3565   - cam->misconfigured = 1;
3566   - w9968cf_stop_transfer(cam);
3567   - wake_up_interruptible(&cam->wait_queue);
3568   - } else
3569   - w9968cf_release_resources(cam);
3570   -
3571   - mutex_unlock(&cam->dev_mutex);
3572   - up_write(&w9968cf_disconnect);
3573   -
3574   - if (!cam->users) {
3575   - kfree(cam);
3576   - }
3577   - }
3578   -}
3579   -
3580   -
3581   -static struct usb_driver w9968cf_usb_driver = {
3582   - .name = "w9968cf",
3583   - .id_table = winbond_id_table,
3584   - .probe = w9968cf_usb_probe,
3585   - .disconnect = w9968cf_usb_disconnect,
3586   -};
3587   -
3588   -
3589   -
3590   -/****************************************************************************
3591   - * Module init, exit and intermodule communication *
3592   - ****************************************************************************/
3593   -
3594   -static int __init w9968cf_module_init(void)
3595   -{
3596   - int err;
3597   -
3598   - KDBG(2, W9968CF_MODULE_NAME" "W9968CF_MODULE_VERSION)
3599   - KDBG(3, W9968CF_MODULE_AUTHOR)
3600   -
3601   - if ((err = usb_register(&w9968cf_usb_driver)))
3602   - return err;
3603   -
3604   - return 0;
3605   -}
3606   -
3607   -
3608   -static void __exit w9968cf_module_exit(void)
3609   -{
3610   - /* w9968cf_usb_disconnect() will be called */
3611   - usb_deregister(&w9968cf_usb_driver);
3612   -
3613   - KDBG(2, W9968CF_MODULE_NAME" deregistered")
3614   -}
3615   -
3616   -
3617   -module_init(w9968cf_module_init);
3618   -module_exit(w9968cf_module_exit);
drivers/media/video/w9968cf.h
1   -/***************************************************************************
2   - * Video4Linux driver for W996[87]CF JPEG USB Dual Mode Camera Chip. *
3   - * *
4   - * Copyright (C) 2002-2004 by Luca Risolia <luca.risolia@studio.unibo.it> *
5   - * *
6   - * This program is free software; you can redistribute it and/or modify *
7   - * it under the terms of the GNU General Public License as published by *
8   - * the Free Software Foundation; either version 2 of the License, or *
9   - * (at your option) any later version. *
10   - * *
11   - * This program is distributed in the hope that it will be useful, *
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14   - * GNU General Public License for more details. *
15   - * *
16   - * You should have received a copy of the GNU General Public License *
17   - * along with this program; if not, write to the Free Software *
18   - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
19   - ***************************************************************************/
20   -
21   -#ifndef _W9968CF_H_
22   -#define _W9968CF_H_
23   -
24   -#include <linux/videodev2.h>
25   -#include <linux/usb.h>
26   -#include <linux/i2c.h>
27   -#include <linux/device.h>
28   -#include <linux/spinlock.h>
29   -#include <linux/list.h>
30   -#include <linux/wait.h>
31   -#include <linux/param.h>
32   -#include <linux/types.h>
33   -#include <linux/rwsem.h>
34   -#include <linux/mutex.h>
35   -
36   -#include <media/v4l2-device.h>
37   -#include <media/ovcamchip.h>
38   -
39   -#include "w9968cf_vpp.h"
40   -
41   -
42   -/****************************************************************************
43   - * Default values *
44   - ****************************************************************************/
45   -
46   -#define W9968CF_VPPMOD_LOAD 1 /* automatic 'w9968cf-vpp' module loading */
47   -
48   -/* Comment/uncomment the following line to enable/disable debugging messages */
49   -#define W9968CF_DEBUG
50   -
51   -/* These have effect only if W9968CF_DEBUG is defined */
52   -#define W9968CF_DEBUG_LEVEL 2 /* from 0 to 6. 0 for no debug informations */
53   -#define W9968CF_SPECIFIC_DEBUG 0 /* 0 or 1 */
54   -
55   -#define W9968CF_MAX_DEVICES 32
56   -#define W9968CF_SIMCAMS W9968CF_MAX_DEVICES /* simultaneous cameras */
57   -
58   -#define W9968CF_MAX_BUFFERS 32
59   -#define W9968CF_BUFFERS 2 /* n. of frame buffers from 2 to MAX_BUFFERS */
60   -
61   -/* Maximum data payload sizes in bytes for alternate settings */
62   -static const u16 wMaxPacketSize[] = {1023, 959, 895, 831, 767, 703, 639, 575,
63   - 511, 447, 383, 319, 255, 191, 127, 63};
64   -#define W9968CF_PACKET_SIZE 1023 /* according to wMaxPacketSizes[] */
65   -#define W9968CF_MIN_PACKET_SIZE 63 /* minimum value */
66   -#define W9968CF_ISO_PACKETS 5 /* n.of packets for isochronous transfers */
67   -#define W9968CF_USB_CTRL_TIMEOUT 1000 /* timeout (ms) for usb control commands */
68   -#define W9968CF_URBS 2 /* n. of scheduled URBs for ISO transfer */
69   -
70   -#define W9968CF_I2C_BUS_DELAY 4 /* delay in us for I2C bit r/w operations */
71   -#define W9968CF_I2C_RW_RETRIES 15 /* number of max I2C r/w retries */
72   -
73   -/* Available video formats */
74   -struct w9968cf_format {
75   - const u16 palette;
76   - const u16 depth;
77   - const u8 compression;
78   -};
79   -
80   -static const struct w9968cf_format w9968cf_formatlist[] = {
81   - { VIDEO_PALETTE_UYVY, 16, 0 }, /* original video */
82   - { VIDEO_PALETTE_YUV422P, 16, 1 }, /* with JPEG compression */
83   - { VIDEO_PALETTE_YUV420P, 12, 1 }, /* with JPEG compression */
84   - { VIDEO_PALETTE_YUV420, 12, 1 }, /* same as YUV420P */
85   - { VIDEO_PALETTE_YUYV, 16, 0 }, /* software conversion */
86   - { VIDEO_PALETTE_YUV422, 16, 0 }, /* software conversion */
87   - { VIDEO_PALETTE_GREY, 8, 0 }, /* software conversion */
88   - { VIDEO_PALETTE_RGB555, 16, 0 }, /* software conversion */
89   - { VIDEO_PALETTE_RGB565, 16, 0 }, /* software conversion */
90   - { VIDEO_PALETTE_RGB24, 24, 0 }, /* software conversion */
91   - { VIDEO_PALETTE_RGB32, 32, 0 }, /* software conversion */
92   - { 0, 0, 0 } /* 0 is a terminating entry */
93   -};
94   -
95   -#define W9968CF_DECOMPRESSION 2 /* decomp:0=disable,1=force,2=any formats */
96   -#define W9968CF_PALETTE_DECOMP_OFF VIDEO_PALETTE_UYVY /* when decomp=0 */
97   -#define W9968CF_PALETTE_DECOMP_FORCE VIDEO_PALETTE_YUV420P /* when decomp=1 */
98   -#define W9968CF_PALETTE_DECOMP_ON VIDEO_PALETTE_UYVY /* when decomp=2 */
99   -
100   -#define W9968CF_FORCE_RGB 0 /* read RGB instead of BGR, yes=1/no=0 */
101   -
102   -#define W9968CF_MAX_WIDTH 800 /* Has effect if up-scaling is on */
103   -#define W9968CF_MAX_HEIGHT 600 /* Has effect if up-scaling is on */
104   -#define W9968CF_WIDTH 320 /* from 128 to 352, multiple of 16 */
105   -#define W9968CF_HEIGHT 240 /* from 96 to 288, multiple of 16 */
106   -
107   -#define W9968CF_CLAMPING 0 /* 0 disable, 1 enable video data clamping */
108   -#define W9968CF_FILTER_TYPE 0 /* 0 disable 1 (1-2-1), 2 (2-3-6-3-2) */
109   -#define W9968CF_DOUBLE_BUFFER 1 /* 0 disable, 1 enable double buffer */
110   -#define W9968CF_LARGEVIEW 1 /* 0 disable, 1 enable */
111   -#define W9968CF_UPSCALING 0 /* 0 disable, 1 enable */
112   -
113   -#define W9968CF_MONOCHROME 0 /* 0 not monochrome, 1 monochrome sensor */
114   -#define W9968CF_BRIGHTNESS 31000 /* from 0 to 65535 */
115   -#define W9968CF_HUE 32768 /* from 0 to 65535 */
116   -#define W9968CF_COLOUR 32768 /* from 0 to 65535 */
117   -#define W9968CF_CONTRAST 50000 /* from 0 to 65535 */
118   -#define W9968CF_WHITENESS 32768 /* from 0 to 65535 */
119   -
120   -#define W9968CF_AUTOBRIGHT 0 /* 0 disable, 1 enable automatic brightness */
121   -#define W9968CF_AUTOEXP 1 /* 0 disable, 1 enable automatic exposure */
122   -#define W9968CF_LIGHTFREQ 50 /* light frequency. 50Hz (Europe) or 60Hz */
123   -#define W9968CF_BANDINGFILTER 0 /* 0 disable, 1 enable banding filter */
124   -#define W9968CF_BACKLIGHT 0 /* 0 or 1, 1=object is lit from behind */
125   -#define W9968CF_MIRROR 0 /* 0 or 1 [don't] reverse image horizontally*/
126   -
127   -#define W9968CF_CLOCKDIV -1 /* -1 = automatic clock divisor */
128   -#define W9968CF_DEF_CLOCKDIVISOR 0 /* default sensor clock divisor value */
129   -
130   -
131   -/****************************************************************************
132   - * Globals *
133   - ****************************************************************************/
134   -
135   -#define W9968CF_MODULE_NAME "V4L driver for W996[87]CF JPEG USB " \
136   - "Dual Mode Camera Chip"
137   -#define W9968CF_MODULE_VERSION "1:1.34-basic"
138   -#define W9968CF_MODULE_AUTHOR "(C) 2002-2004 Luca Risolia"
139   -#define W9968CF_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>"
140   -#define W9968CF_MODULE_LICENSE "GPL"
141   -
142   -static const struct usb_device_id winbond_id_table[] = {
143   - {
144   - /* Creative Labs Video Blaster WebCam Go Plus */
145   - USB_DEVICE(0x041e, 0x4003),
146   - .driver_info = (unsigned long)"w9968cf",
147   - },
148   - {
149   - /* Generic W996[87]CF JPEG USB Dual Mode Camera */
150   - USB_DEVICE(0x1046, 0x9967),
151   - .driver_info = (unsigned long)"w9968cf",
152   - },
153   - { } /* terminating entry */
154   -};
155   -
156   -/* W996[87]CF camera models, internal ids: */
157   -enum w9968cf_model_id {
158   - W9968CF_MOD_GENERIC = 1, /* Generic W996[87]CF based device */
159   - W9968CF_MOD_CLVBWGP = 11,/*Creative Labs Video Blaster WebCam Go Plus*/
160   - W9968CF_MOD_ADPVDMA = 21, /* Aroma Digi Pen VGA Dual Mode ADG-5000 */
161   - W9986CF_MOD_AAU = 31, /* AVerMedia AVerTV USB */
162   - W9968CF_MOD_CLVBWG = 34, /* Creative Labs Video Blaster WebCam Go */
163   - W9968CF_MOD_LL = 37, /* Lebon LDC-035A */
164   - W9968CF_MOD_EEEMC = 40, /* Ezonics EZ-802 EZMega Cam */
165   - W9968CF_MOD_OOE = 42, /* OmniVision OV8610-EDE */
166   - W9968CF_MOD_ODPVDMPC = 43,/* OPCOM Digi Pen VGA Dual Mode Pen Camera */
167   - W9968CF_MOD_PDPII = 46, /* Pretec Digi Pen-II */
168   - W9968CF_MOD_PDP480 = 49, /* Pretec DigiPen-480 */
169   -};
170   -
171   -enum w9968cf_frame_status {
172   - F_READY, /* finished grabbing & ready to be read/synced */
173   - F_GRABBING, /* in the process of being grabbed into */
174   - F_ERROR, /* something bad happened while processing */
175   - F_UNUSED /* unused (no VIDIOCMCAPTURE) */
176   -};
177   -
178   -struct w9968cf_frame_t {
179   - void* buffer;
180   - unsigned long size;
181   - u32 length;
182   - int number;
183   - enum w9968cf_frame_status status;
184   - struct w9968cf_frame_t* next;
185   - u8 queued;
186   -};
187   -
188   -enum w9968cf_vpp_flag {
189   - VPP_NONE = 0x00,
190   - VPP_UPSCALE = 0x01,
191   - VPP_SWAP_YUV_BYTES = 0x02,
192   - VPP_DECOMPRESSION = 0x04,
193   - VPP_UYVY_TO_RGBX = 0x08,
194   -};
195   -
196   -/* Main device driver structure */
197   -struct w9968cf_device {
198   - enum w9968cf_model_id id; /* private device identifier */
199   -
200   - struct v4l2_device v4l2_dev;
201   - struct video_device* v4ldev; /* -> V4L structure */
202   - struct list_head v4llist; /* entry of the list of V4L cameras */
203   -
204   - struct usb_device* usbdev; /* -> main USB structure */
205   - struct urb* urb[W9968CF_URBS]; /* -> USB request block structs */
206   - void* transfer_buffer[W9968CF_URBS]; /* -> ISO transfer buffers */
207   - u16* control_buffer; /* -> buffer for control req.*/
208   - u16* data_buffer; /* -> data to send to the FSB */
209   -
210   - struct w9968cf_frame_t frame[W9968CF_MAX_BUFFERS];
211   - struct w9968cf_frame_t frame_tmp; /* temporary frame */
212   - struct w9968cf_frame_t frame_vpp; /* helper frame.*/
213   - struct w9968cf_frame_t* frame_current; /* -> frame being grabbed */
214   - struct w9968cf_frame_t* requested_frame[W9968CF_MAX_BUFFERS];
215   -
216   - u8 max_buffers, /* number of requested buffers */
217   - force_palette, /* yes=1/no=0 */
218   - force_rgb, /* read RGB instead of BGR, yes=1, no=0 */
219   - double_buffer, /* hardware double buffering yes=1/no=0 */
220   - clamping, /* video data clamping yes=1/no=0 */
221   - filter_type, /* 0=disabled, 1=3 tap, 2=5 tap filter */
222   - capture, /* 0=disabled, 1=enabled */
223   - largeview, /* 0=disabled, 1=enabled */
224   - decompression, /* 0=disabled, 1=forced, 2=allowed */
225   - upscaling; /* software image scaling, 0=enabled, 1=disabled */
226   -
227   - struct video_picture picture; /* current picture settings */
228   - struct video_window window; /* current window settings */
229   -
230   - u16 hw_depth, /* depth (used by the chip) */
231   - hw_palette, /* palette (used by the chip) */
232   - hw_width, /* width (used by the chip) */
233   - hw_height, /* height (used by the chip) */
234   - hs_polarity, /* 0=negative sync pulse, 1=positive sync pulse */
235   - vs_polarity, /* 0=negative sync pulse, 1=positive sync pulse */
236   - start_cropx, /* pixels from HS inactive edge to 1st cropped pixel*/
237   - start_cropy; /* pixels from VS inactive edge to 1st cropped pixel*/
238   -
239   - enum w9968cf_vpp_flag vpp_flag; /* post-processing routines in use */
240   -
241   - u8 nbuffers, /* number of allocated frame buffers */
242   - altsetting, /* camera alternate setting */
243   - disconnected, /* flag: yes=1, no=0 */
244   - misconfigured, /* flag: yes=1, no=0 */
245   - users, /* flag: number of users holding the device */
246   - streaming; /* flag: yes=1, no=0 */
247   -
248   - u8 sensor_initialized; /* flag: yes=1, no=0 */
249   -
250   - /* Determined by the image sensor type: */
251   - int sensor, /* type of image sensor chip (CC_*) */
252   - monochrome; /* image sensor is (probably) monochrome */
253   - u16 maxwidth, /* maximum width supported by the image sensor */
254   - maxheight, /* maximum height supported by the image sensor */
255   - minwidth, /* minimum width supported by the image sensor */
256   - minheight; /* minimum height supported by the image sensor */
257   - u8 auto_brt, /* auto brightness enabled flag */
258   - auto_exp, /* auto exposure enabled flag */
259   - backlight, /* backlight exposure algorithm flag */
260   - mirror, /* image is reversed horizontally */
261   - lightfreq, /* power (lighting) frequency */
262   - bandfilt; /* banding filter enabled flag */
263   - s8 clockdiv; /* clock divisor */
264   -
265   - /* I2C interface to kernel */
266   - struct i2c_adapter i2c_adapter;
267   - struct v4l2_subdev *sensor_sd;
268   -
269   - /* Locks */
270   - struct mutex dev_mutex, /* for probe, disconnect,open and close */
271   - fileop_mutex; /* for read and ioctl */
272   - spinlock_t urb_lock, /* for submit_urb() and unlink_urb() */
273   - flist_lock; /* for requested frame list accesses */
274   - wait_queue_head_t open, wait_queue;
275   -
276   - char command[16]; /* name of the program holding the device */
277   -};
278   -
279   -static inline struct w9968cf_device *to_cam(struct v4l2_device *v4l2_dev)
280   -{
281   - return container_of(v4l2_dev, struct w9968cf_device, v4l2_dev);
282   -}
283   -
284   -
285   -/****************************************************************************
286   - * Macros for debugging *
287   - ****************************************************************************/
288   -
289   -#undef DBG
290   -#undef KDBG
291   -#ifdef W9968CF_DEBUG
292   -/* For device specific debugging messages */
293   -# define DBG(level, fmt, args...) \
294   -{ \
295   - if ( ((specific_debug) && (debug == (level))) || \
296   - ((!specific_debug) && (debug >= (level))) ) { \
297   - if ((level) == 1) \
298   - v4l2_err(&cam->v4l2_dev, fmt "\n", ## args); \
299   - else if ((level) == 2 || (level) == 3) \
300   - v4l2_info(&cam->v4l2_dev, fmt "\n", ## args); \
301   - else if ((level) == 4) \
302   - v4l2_warn(&cam->v4l2_dev, fmt "\n", ## args); \
303   - else if ((level) >= 5) \
304   - v4l2_info(&cam->v4l2_dev, "[%s:%d] " fmt "\n", \
305   - __func__, __LINE__ , ## args); \
306   - } \
307   -}
308   -/* For generic kernel (not device specific) messages */
309   -# define KDBG(level, fmt, args...) \
310   -{ \
311   - if ( ((specific_debug) && (debug == (level))) || \
312   - ((!specific_debug) && (debug >= (level))) ) { \
313   - if ((level) >= 1 && (level) <= 4) \
314   - pr_info("w9968cf: " fmt "\n", ## args); \
315   - else if ((level) >= 5) \
316   - pr_debug("w9968cf: [%s:%d] " fmt "\n", __func__, \
317   - __LINE__ , ## args); \
318   - } \
319   -}
320   -#else
321   - /* Not debugging: nothing */
322   -# define DBG(level, fmt, args...) do {;} while(0);
323   -# define KDBG(level, fmt, args...) do {;} while(0);
324   -#endif
325   -
326   -#undef PDBG
327   -#define PDBG(fmt, args...) \
328   -v4l2_info(&cam->v4l2_dev, "[%s:%d] " fmt "\n", __func__, __LINE__ , ## args);
329   -
330   -#undef PDBGG
331   -#define PDBGG(fmt, args...) do {;} while(0); /* nothing: it's a placeholder */
332   -
333   -#endif /* _W9968CF_H_ */
drivers/media/video/w9968cf_decoder.h
1   -/***************************************************************************
2   - * Video decoder for the W996[87]CF driver for Linux. *
3   - * *
4   - * Copyright (C) 2003 2004 by Luca Risolia <luca.risolia@studio.unibo.it> *
5   - * *
6   - * This program is free software; you can redistribute it and/or modify *
7   - * it under the terms of the GNU General Public License as published by *
8   - * the Free Software Foundation; either version 2 of the License, or *
9   - * (at your option) any later version. *
10   - * *
11   - * This program is distributed in the hope that it will be useful, *
12   - * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14   - * GNU General Public License for more details. *
15   - * *
16   - * You should have received a copy of the GNU General Public License *
17   - * along with this program; if not, write to the Free Software *
18   - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
19   - ***************************************************************************/
20   -
21   -#ifndef _W9968CF_DECODER_H_
22   -#define _W9968CF_DECODER_H_
23   -
24   -/* Comment/uncomment this for high/low quality of compressed video */
25   -#define W9968CF_DEC_FAST_LOWQUALITY_VIDEO
26   -
27   -#ifdef W9968CF_DEC_FAST_LOWQUALITY_VIDEO
28   -static const unsigned char Y_QUANTABLE[64] = {
29   - 16, 11, 10, 16, 24, 40, 51, 61,
30   - 12, 12, 14, 19, 26, 58, 60, 55,
31   - 14, 13, 16, 24, 40, 57, 69, 56,
32   - 14, 17, 22, 29, 51, 87, 80, 62,
33   - 18, 22, 37, 56, 68, 109, 103, 77,
34   - 24, 35, 55, 64, 81, 104, 113, 92,
35   - 49, 64, 78, 87, 103, 121, 120, 101,
36   - 72, 92, 95, 98, 112, 100, 103, 99
37   -};
38   -
39   -static const unsigned char UV_QUANTABLE[64] = {
40   - 17, 18, 24, 47, 99, 99, 99, 99,
41   - 18, 21, 26, 66, 99, 99, 99, 99,
42   - 24, 26, 56, 99, 99, 99, 99, 99,
43   - 47, 66, 99, 99, 99, 99, 99, 99,
44   - 99, 99, 99, 99, 99, 99, 99, 99,
45   - 99, 99, 99, 99, 99, 99, 99, 99,
46   - 99, 99, 99, 99, 99, 99, 99, 99,
47   - 99, 99, 99, 99, 99, 99, 99, 99
48   -};
49   -#else
50   -static const unsigned char Y_QUANTABLE[64] = {
51   - 8, 5, 5, 8, 12, 20, 25, 30,
52   - 6, 6, 7, 9, 13, 29, 30, 27,
53   - 7, 6, 8, 12, 20, 28, 34, 28,
54   - 7, 8, 11, 14, 25, 43, 40, 31,
55   - 9, 11, 18, 28, 34, 54, 51, 38,
56   - 12, 17, 27, 32, 40, 52, 56, 46,
57   - 24, 32, 39, 43, 51, 60, 60, 50,
58   - 36, 46, 47, 49, 56, 50, 51, 49
59   -};
60   -
61   -static const unsigned char UV_QUANTABLE[64] = {
62   - 8, 9, 12, 23, 49, 49, 49, 49,
63   - 9, 10, 13, 33, 49, 49, 49, 49,
64   - 12, 13, 28, 49, 49, 49, 49, 49,
65   - 23, 33, 49, 49, 49, 49, 49, 49,
66   - 49, 49, 49, 49, 49, 49, 49, 49,
67   - 49, 49, 49, 49, 49, 49, 49, 49,
68   - 49, 49, 49, 49, 49, 49, 49, 49,
69   - 49, 49, 49, 49, 49, 49, 49, 49
70   -};
71   -#endif
72   -
73   -#define W9968CF_DEC_ERR_CORRUPTED_DATA -1
74   -#define W9968CF_DEC_ERR_BUF_OVERFLOW -2
75   -#define W9968CF_DEC_ERR_NO_SOI -3
76   -#define W9968CF_DEC_ERR_NO_SOF0 -4
77   -#define W9968CF_DEC_ERR_NO_SOS -5
78   -#define W9968CF_DEC_ERR_NO_EOI -6
79   -
80   -extern void w9968cf_init_decoder(void);
81   -extern int w9968cf_check_headers(const unsigned char* Pin,
82   - const unsigned long BUF_SIZE);
83   -extern int w9968cf_decode(const char* Pin, const unsigned long BUF_SIZE,
84   - const unsigned W, const unsigned H, char* Pout);
85   -
86   -#endif /* _W9968CF_DECODER_H_ */
drivers/media/video/w9968cf_vpp.h
1   -/***************************************************************************
2   - * Interface for video post-processing functions for the W996[87]CF driver *
3   - * for Linux. *
4   - * *
5   - * Copyright (C) 2002-2004 by Luca Risolia <luca.risolia@studio.unibo.it> *
6   - * *
7   - * This program is free software; you can redistribute it and/or modify *
8   - * it under the terms of the GNU General Public License as published by *
9   - * the Free Software Foundation; either version 2 of the License, or *
10   - * (at your option) any later version. *
11   - * *
12   - * This program is distributed in the hope that it will be useful, *
13   - * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14   - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15   - * GNU General Public License for more details. *
16   - * *
17   - * You should have received a copy of the GNU General Public License *
18   - * along with this program; if not, write to the Free Software *
19   - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
20   - ***************************************************************************/
21   -
22   -#ifndef _W9968CF_VPP_H_
23   -#define _W9968CF_VPP_H_
24   -
25   -#include <linux/module.h>
26   -#include <asm/types.h>
27   -
28   -struct w9968cf_vpp_t {
29   - struct module* owner;
30   - int (*check_headers)(const unsigned char*, const unsigned long);
31   - int (*decode)(const char*, const unsigned long, const unsigned,
32   - const unsigned, char*);
33   - void (*swap_yuvbytes)(void*, unsigned long);
34   - void (*uyvy_to_rgbx)(u8*, unsigned long, u8*, u16, u8);
35   - void (*scale_up)(u8*, u8*, u16, u16, u16, u16, u16);
36   -
37   - u8 busy; /* read-only flag: module is/is not in use */
38   -};
39   -
40   -#endif /* _W9968CF_VPP_H_ */