Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 19230
b: refs/heads/master
c: 7f2c01a
h: refs/heads/master
v: v3
  • Loading branch information
Adrian Bunk authored and Greg Kroah-Hartman committed Feb 1, 2006
1 parent c166a6e commit 38528ab
Show file tree
Hide file tree
Showing 5 changed files with 7 additions and 157 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: bf8b2b5345145d41d39035b80f36c8e17342d833
refs/heads/master: 7f2c01ab8ad50c74d174acdd814ddb53383bee93
30 changes: 5 additions & 25 deletions trunk/Documentation/usb/w9968cf.txt
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,12 @@ based cameras should be supported as well.
The driver is divided into two modules: the basic one, "w9968cf", is needed for
the supported devices to work; the second one, "w9968cf-vpp", is an optional
module, which provides some useful video post-processing functions like video
decoding, up-scaling and colour conversions. Once the driver is installed,
every time an application tries to open a recognized device, "w9968cf" checks
the presence of the "w9968cf-vpp" module and loads it automatically by default.
decoding, up-scaling and colour conversions.

Please keep in mind that official kernels do not include the second module for
performance purposes. However it is always recommended to download and install
the latest and complete release of the driver, replacing the existing one, if
present: it will be still even possible not to load the "w9968cf-vpp" module at
all, if you ever want to. Another important missing feature of the version in
the official Linux 2.4 kernels is the writeable /proc filesystem interface.
Note that the official kernels do neither include nor support the second
module for performance purposes. Therefore, it is always recommended to
download and install the latest and complete release of the driver,
replacing the existing one, if present.

The latest and full-featured version of the W996[87]CF driver can be found at:
http://www.linux-projects.org. Please refer to the documentation included in
Expand Down Expand Up @@ -201,22 +197,6 @@ Note: The kernel must be compiled with the CONFIG_KMOD option
enabled for the 'ovcamchip' module to be loaded and for
this parameter to be present.
-------------------------------------------------------------------------------
Name: vppmod_load
Type: bool
Syntax: <0|1>
Description: Automatic 'w9968cf-vpp' module loading: 0 disabled, 1 enabled.
If enabled, every time an application attempts to open a
camera, 'insmod' searches for the video post-processing module
in the system and loads it automatically (if present).
The optional 'w9968cf-vpp' module adds extra image manipulation
capabilities to the 'w9968cf' module,like software up-scaling,
colour conversions and video decompression for very high frame
rates.
Default: 1
Note: The kernel must be compiled with the CONFIG_KMOD option
enabled for the 'w9968cf-vpp' module to be loaded and for
this parameter to be present.
-------------------------------------------------------------------------------
Name: simcams
Type: int
Syntax: <n>
Expand Down
128 changes: 1 addition & 127 deletions trunk/drivers/usb/media/w9968cf.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ MODULE_LICENSE(W9968CF_MODULE_LICENSE);
MODULE_SUPPORTED_DEVICE("Video");

static int ovmod_load = W9968CF_OVMOD_LOAD;
static int vppmod_load = W9968CF_VPPMOD_LOAD;
static unsigned short simcams = W9968CF_SIMCAMS;
static short video_nr[]={[0 ... W9968CF_MAX_DEVICES-1] = -1}; /*-1=first free*/
static unsigned int packet_size[] = {[0 ... W9968CF_MAX_DEVICES-1] =
Expand Down Expand Up @@ -107,7 +106,6 @@ static unsigned int param_nv[24]; /* number of values per parameter */

#ifdef CONFIG_KMOD
module_param(ovmod_load, bool, 0644);
module_param(vppmod_load, bool, 0444);
#endif
module_param(simcams, ushort, 0644);
module_param_array(video_nr, short, &param_nv[0], 0444);
Expand Down Expand Up @@ -150,18 +148,6 @@ MODULE_PARM_DESC(ovmod_load,
"\ninto memory."
"\nDefault value is "__MODULE_STRING(W9968CF_OVMOD_LOAD)"."
"\n");
MODULE_PARM_DESC(vppmod_load,
"\n<0|1> Automatic 'w9968cf-vpp' module loading."
"\n0 disabled, 1 enabled."
"\nIf enabled, every time an application attempts to open a"
"\ncamera, 'insmod' searches for the video post-processing"
"\nmodule in the system and loads it automatically (if"
"\npresent). The optional 'w9968cf-vpp' module adds extra"
"\n image manipulation functions to the 'w9968cf' module,like"
"\nsoftware up-scaling,colour conversions and video decoding"
"\nfor very high frame rates."
"\nDefault value is "__MODULE_STRING(W9968CF_VPPMOD_LOAD)"."
"\n");
#endif
MODULE_PARM_DESC(simcams,
"\n<n> Number of cameras allowed to stream simultaneously."
Expand Down Expand Up @@ -492,10 +478,6 @@ static void w9968cf_push_frame(struct w9968cf_device*, u8 f_num);
static void w9968cf_pop_frame(struct w9968cf_device*,struct w9968cf_frame_t**);
static void w9968cf_release_resources(struct w9968cf_device*);

/* Intermodule communication */
static int w9968cf_vppmod_detect(struct w9968cf_device*);
static void w9968cf_vppmod_release(struct w9968cf_device*);



/****************************************************************************
Expand Down Expand Up @@ -2737,9 +2719,7 @@ static int w9968cf_open(struct inode* inode, struct file* filp)
cam->streaming = 0;
cam->misconfigured = 0;

if (!w9968cf_vpp)
if ((err = w9968cf_vppmod_detect(cam)))
goto out;
w9968cf_adjust_configuration(cam);

if ((err = w9968cf_allocate_memory(cam)))
goto deallocate_memory;
Expand All @@ -2766,7 +2746,6 @@ static int w9968cf_open(struct inode* inode, struct file* filp)

deallocate_memory:
w9968cf_deallocate_memory(cam);
out:
DBG(2, "Failed to open the video device")
up(&cam->dev_sem);
up_read(&w9968cf_disconnect);
Expand All @@ -2784,8 +2763,6 @@ static int w9968cf_release(struct inode* inode, struct file* filp)

w9968cf_stop_transfer(cam);

w9968cf_vppmod_release(cam);

if (cam->disconnected) {
w9968cf_release_resources(cam);
up(&cam->dev_sem);
Expand Down Expand Up @@ -3681,106 +3658,6 @@ static struct usb_driver w9968cf_usb_driver = {
* Module init, exit and intermodule communication *
****************************************************************************/

static int w9968cf_vppmod_detect(struct w9968cf_device* cam)
{
if (!w9968cf_vpp)
if (vppmod_load)
request_module("w9968cf-vpp");

down(&w9968cf_vppmod_lock);

if (!w9968cf_vpp) {
DBG(4, "Video post-processing module not detected")
w9968cf_adjust_configuration(cam);
goto out;
}

if (!try_module_get(w9968cf_vpp->owner)) {
DBG(1, "Couldn't increment the reference count of "
"the video post-processing module")
up(&w9968cf_vppmod_lock);
return -ENOSYS;
}

w9968cf_vpp->busy++;

DBG(5, "Video post-processing module detected")

out:
up(&w9968cf_vppmod_lock);
return 0;
}


static void w9968cf_vppmod_release(struct w9968cf_device* cam)
{
down(&w9968cf_vppmod_lock);

if (w9968cf_vpp && w9968cf_vpp->busy) {
module_put(w9968cf_vpp->owner);
w9968cf_vpp->busy--;
wake_up(&w9968cf_vppmod_wait);
DBG(5, "Video post-processing module released")
}

up(&w9968cf_vppmod_lock);
}


int w9968cf_vppmod_register(struct w9968cf_vpp_t* vpp)
{
down(&w9968cf_vppmod_lock);

if (w9968cf_vpp) {
KDBG(1, "Video post-processing module already registered")
up(&w9968cf_vppmod_lock);
return -EINVAL;
}

w9968cf_vpp = vpp;
w9968cf_vpp->busy = 0;

KDBG(2, "Video post-processing module registered")
up(&w9968cf_vppmod_lock);
return 0;
}


int w9968cf_vppmod_deregister(struct w9968cf_vpp_t* vpp)
{
down(&w9968cf_vppmod_lock);

if (!w9968cf_vpp) {
up(&w9968cf_vppmod_lock);
return -EINVAL;
}

if (w9968cf_vpp != vpp) {
KDBG(1, "Only the owner can unregister the video "
"post-processing module")
up(&w9968cf_vppmod_lock);
return -EINVAL;
}

if (w9968cf_vpp->busy) {
KDBG(2, "Video post-processing module busy. Wait for it to be "
"released...")
up(&w9968cf_vppmod_lock);
wait_event(w9968cf_vppmod_wait, !w9968cf_vpp->busy);
w9968cf_vpp = NULL;
goto out;
}

w9968cf_vpp = NULL;

up(&w9968cf_vppmod_lock);

out:
KDBG(2, "Video post-processing module unregistered")
return 0;
}


static int __init w9968cf_module_init(void)
{
int err;
Expand Down Expand Up @@ -3810,6 +3687,3 @@ static void __exit w9968cf_module_exit(void)
module_init(w9968cf_module_init);
module_exit(w9968cf_module_exit);


EXPORT_SYMBOL(w9968cf_vppmod_register);
EXPORT_SYMBOL(w9968cf_vppmod_deregister);
1 change: 0 additions & 1 deletion trunk/drivers/usb/media/w9968cf.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,6 @@ enum w9968cf_vpp_flag {
};

static struct w9968cf_vpp_t* w9968cf_vpp;
static DECLARE_MUTEX(w9968cf_vppmod_lock);
static DECLARE_WAIT_QUEUE_HEAD(w9968cf_vppmod_wait);

static LIST_HEAD(w9968cf_dev_list); /* head of V4L registered cameras list */
Expand Down
3 changes: 0 additions & 3 deletions trunk/drivers/usb/media/w9968cf_vpp.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,4 @@ struct w9968cf_vpp_t {
u8 busy; /* read-only flag: module is/is not in use */
};

extern int w9968cf_vppmod_register(struct w9968cf_vpp_t*);
extern int w9968cf_vppmod_deregister(struct w9968cf_vpp_t*);

#endif /* _W9968CF_VPP_H_ */

0 comments on commit 38528ab

Please sign in to comment.