|
@@ -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] =
|
|
@@ -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, ¶m_nv[0], 0444);
|
|
@@ -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."
|
|
@@ -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*);
|
|
|
-
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
@@ -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;
|
|
@@ -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);
|
|
@@ -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);
|
|
@@ -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;
|
|
@@ -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);
|