Commit c7506658 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman

staging/easycap: add first level indentation to easycap_main

Add first level indentation to easayca_main.c
This created around 300 lines over 80 characters.
Around 100 of straight forward once were fixed in this patch.
The another 200 require more code movement and need to be fixed
later

Cc: Mike Thomas <rmthomas@sciolus.org>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 6653eb31
...@@ -125,89 +125,87 @@ const char *strerror(int err) ...@@ -125,89 +125,87 @@ const char *strerror(int err)
* THIS ROUTINE DOES NOT DETECT DUPLICATE OCCURRENCES OF POINTER peasycap * THIS ROUTINE DOES NOT DETECT DUPLICATE OCCURRENCES OF POINTER peasycap
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int isdongle(struct easycap *peasycap)
isdongle(struct easycap *peasycap)
{ {
int k; int k;
if (NULL == peasycap) if (NULL == peasycap)
return -2; return -2;
for (k = 0; k < DONGLE_MANY; k++) { for (k = 0; k < DONGLE_MANY; k++) {
if (easycapdc60_dongle[k].peasycap == peasycap) { if (easycapdc60_dongle[k].peasycap == peasycap) {
peasycap->isdongle = k; peasycap->isdongle = k;
return k; return k;
} }
} }
return -1; return -1;
} }
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
static int easycap_open(struct inode *inode, struct file *file) static int easycap_open(struct inode *inode, struct file *file)
{ {
#ifndef EASYCAP_IS_VIDEODEV_CLIENT #ifndef EASYCAP_IS_VIDEODEV_CLIENT
struct usb_interface *pusb_interface; struct usb_interface *pusb_interface;
#else #else
struct video_device *pvideo_device; struct video_device *pvideo_device;
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/ #endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
struct easycap *peasycap; struct easycap *peasycap;
int rc; int rc;
JOT(4, "\n"); JOT(4, "\n");
SAY("==========OPEN=========\n"); SAY("==========OPEN=========\n");
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#ifndef EASYCAP_IS_VIDEODEV_CLIENT #ifndef EASYCAP_IS_VIDEODEV_CLIENT
if (NULL == inode) { if (NULL == inode) {
SAY("ERROR: inode is NULL.\n"); SAY("ERROR: inode is NULL.\n");
return -EFAULT; return -EFAULT;
} }
pusb_interface = usb_find_interface(&easycap_usb_driver, iminor(inode)); pusb_interface = usb_find_interface(&easycap_usb_driver, iminor(inode));
if (!pusb_interface) { if (!pusb_interface) {
SAY("ERROR: pusb_interface is NULL.\n"); SAY("ERROR: pusb_interface is NULL.\n");
return -EFAULT; return -EFAULT;
} }
peasycap = usb_get_intfdata(pusb_interface); peasycap = usb_get_intfdata(pusb_interface);
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
#else #else
pvideo_device = video_devdata(file); pvideo_device = video_devdata(file);
if (NULL == pvideo_device) { if (NULL == pvideo_device) {
SAY("ERROR: pvideo_device is NULL.\n"); SAY("ERROR: pvideo_device is NULL.\n");
return -EFAULT; return -EFAULT;
} }
peasycap = (struct easycap *)video_get_drvdata(pvideo_device); peasycap = (struct easycap *)video_get_drvdata(pvideo_device);
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/ #endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ if (NULL == peasycap) {
if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return -EFAULT; return -EFAULT;
} }
if (NULL == peasycap->pusb_device) { if (NULL == peasycap->pusb_device) {
SAM("ERROR: peasycap->pusb_device is NULL\n"); SAM("ERROR: peasycap->pusb_device is NULL\n");
return -EFAULT; return -EFAULT;
} else { } else {
JOM(16, "peasycap->pusb_device=%p\n", peasycap->pusb_device); JOM(16, "peasycap->pusb_device=%p\n", peasycap->pusb_device);
} }
file->private_data = peasycap; file->private_data = peasycap;
rc = wakeup_device(peasycap->pusb_device); rc = wakeup_device(peasycap->pusb_device);
if (0 == rc) if (0 == rc)
JOM(8, "wakeup_device() OK\n"); JOM(8, "wakeup_device() OK\n");
else { else {
SAM("ERROR: wakeup_device() returned %i\n", rc); SAM("ERROR: wakeup_device() rc = %i\n", rc);
if (-ENODEV == rc) if (-ENODEV == rc)
SAM("ERROR: wakeup_device() returned -ENODEV\n"); SAM("ERROR: wakeup_device() returned -ENODEV\n");
else else
SAM("ERROR: wakeup_device() returned %i\n", rc); SAM("ERROR: wakeup_device() rc = %i\n", rc);
return rc; return rc;
} }
peasycap->input = 0; peasycap->input = 0;
rc = reset(peasycap); rc = reset(peasycap);
if (rc) { if (rc) {
SAM("ERROR: reset() returned %i\n", rc); SAM("ERROR: reset() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -221,15 +219,16 @@ return 0; ...@@ -221,15 +219,16 @@ return 0;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int reset(struct easycap *peasycap) static int reset(struct easycap *peasycap)
{ {
struct easycap_standard const *peasycap_standard; struct easycap_standard const *peasycap_standard;
int i, rc, input, rate; int i, rc, input, rate;
bool ntsc, other; bool ntsc, other;
int fmtidx;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
input = peasycap->input; input = peasycap->input;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
...@@ -242,35 +241,33 @@ input = peasycap->input; ...@@ -242,35 +241,33 @@ input = peasycap->input;
* COMPLETE, SO SHOULD NOT BE INVOKED WITHOUT GOOD REASON. * COMPLETE, SO SHOULD NOT BE INVOKED WITHOUT GOOD REASON.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
other = false; other = false;
if (true == peasycap->ntsc) JOM(8, "peasycap->ntsc=%d\n", peasycap->ntsc);
JOM(8, "true=peasycap->ntsc\n");
else rate = ready_saa(peasycap->pusb_device);
JOM(8, "false=peasycap->ntsc\n"); if (0 > rate) {
rate = ready_saa(peasycap->pusb_device);
if (0 > rate) {
JOM(8, "not ready to capture after %i ms ...\n", PATIENCE); JOM(8, "not ready to capture after %i ms ...\n", PATIENCE);
if (true == peasycap->ntsc) { if (true == peasycap->ntsc) {
JOM(8, "... trying PAL ...\n"); ntsc = false; JOM(8, "... trying PAL ...\n"); ntsc = false;
} else { } else {
JOM(8, "... trying NTSC ...\n"); ntsc = true; JOM(8, "... trying NTSC ...\n"); ntsc = true;
} }
rc = setup_stk(peasycap->pusb_device, ntsc); rc = setup_stk(peasycap->pusb_device, ntsc);
if (0 == rc) if (0 == rc)
JOM(4, "setup_stk() OK\n"); JOM(4, "setup_stk() OK\n");
else { else {
SAM("ERROR: setup_stk() returned %i\n", rc); SAM("ERROR: setup_stk() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
rc = setup_saa(peasycap->pusb_device, ntsc); rc = setup_saa(peasycap->pusb_device, ntsc);
if (0 == rc) if (0 == rc)
JOM(4, "setup_saa() OK\n"); JOM(4, "setup_saa() OK\n");
else { else {
SAM("ERROR: setup_saa() returned %i\n", rc); SAM("ERROR: setup_saa() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
rate = ready_saa(peasycap->pusb_device); rate = ready_saa(peasycap->pusb_device);
if (0 > rate) { if (0 > rate) {
JOM(8, "not ready to capture after %i ms ...\n", PATIENCE); JOM(8, "not ready to capture after %i ms ...\n", PATIENCE);
JOM(8, "... saa register 0x1F has 0x%02X\n", JOM(8, "... saa register 0x1F has 0x%02X\n",
read_saa(peasycap->pusb_device, 0x1F)); read_saa(peasycap->pusb_device, 0x1F));
...@@ -280,36 +277,34 @@ if (0 > rate) { ...@@ -280,36 +277,34 @@ if (0 > rate) {
ntsc = (0 < (rate/2)) ? true : false ; ntsc = (0 < (rate/2)) ? true : false ;
other = true; other = true;
} }
} else { } else {
JOM(8, "... success at first try: %i=rate\n", rate); JOM(8, "... success at first try: %i=rate\n", rate);
ntsc = (0 < rate/2) ? true : false ; ntsc = (0 < rate/2) ? true : false ;
} }
if (true == ntsc) JOM(8, "ntsc=%d\n", ntsc);
JOM(8, "true=ntsc\n");
else
JOM(8, "false=ntsc\n");
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
rc = setup_stk(peasycap->pusb_device, ntsc); rc = setup_stk(peasycap->pusb_device, ntsc);
if (0 == rc) if (0 == rc)
JOM(4, "setup_stk() OK\n"); JOM(4, "setup_stk() OK\n");
else { else {
SAM("ERROR: setup_stk() returned %i\n", rc); SAM("ERROR: setup_stk() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
rc = setup_saa(peasycap->pusb_device, ntsc); rc = setup_saa(peasycap->pusb_device, ntsc);
if (0 == rc) if (0 == rc)
JOM(4, "setup_saa() OK\n"); JOM(4, "setup_saa() OK\n");
else { else {
SAM("ERROR: setup_saa() returned %i\n", rc); SAM("ERROR: setup_saa() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
for (i = 0; i < 180; i++) for (i = 0; i < 180; i++)
peasycap->merit[i] = 0; peasycap->merit[i] = 0;
peasycap->video_eof = 0;
peasycap->audio_eof = 0; peasycap->video_eof = 0;
do_gettimeofday(&peasycap->timeval7); peasycap->audio_eof = 0;
do_gettimeofday(&peasycap->timeval7);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* RESTORE INPUT AND FORCE REFRESH OF STANDARD, FORMAT, ETC. * RESTORE INPUT AND FORCE REFRESH OF STANDARD, FORMAT, ETC.
...@@ -317,86 +312,75 @@ do_gettimeofday(&peasycap->timeval7); ...@@ -317,86 +312,75 @@ do_gettimeofday(&peasycap->timeval7);
* WHILE THIS PROCEDURE IS IN PROGRESS, SOME IOCTL COMMANDS WILL RETURN -EBUSY. * WHILE THIS PROCEDURE IS IN PROGRESS, SOME IOCTL COMMANDS WILL RETURN -EBUSY.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
peasycap->input = -8192; peasycap->input = -8192;
peasycap->standard_offset = -8192; peasycap->standard_offset = -8192;
if (true == other) { fmtidx = ntsc ? NTSC_M : PAL_BGHIN;
if (other) {
peasycap_standard = &easycap_standard[0]; peasycap_standard = &easycap_standard[0];
while (0xFFFF != peasycap_standard->mask) { while (0xFFFF != peasycap_standard->mask) {
if (true == ntsc) { if (fmtidx == peasycap_standard->v4l2_standard.index) {
if (NTSC_M == peasycap_standard->v4l2_standard.index) {
peasycap->inputset[input].standard_offset =
peasycap_standard -
&easycap_standard[0];
break;
}
} else {
if (PAL_BGHIN ==
peasycap_standard->v4l2_standard.index) {
peasycap->inputset[input].standard_offset = peasycap->inputset[input].standard_offset =
peasycap_standard - peasycap_standard - easycap_standard;
&easycap_standard[0];
break; break;
} }
}
peasycap_standard++; peasycap_standard++;
} }
if (0xFFFF == peasycap_standard->mask) { if (0xFFFF == peasycap_standard->mask) {
SAM("ERROR: standard not found\n"); SAM("ERROR: standard not found\n");
return -EINVAL; return -EINVAL;
} }
JOM(8, "%i=peasycap->inputset[%i].standard_offset\n", JOM(8, "%i=peasycap->inputset[%i].standard_offset\n",
peasycap->inputset[input].standard_offset, input); peasycap->inputset[input].standard_offset, input);
} }
peasycap->format_offset = -8192; peasycap->format_offset = -8192;
peasycap->brightness = -8192; peasycap->brightness = -8192;
peasycap->contrast = -8192; peasycap->contrast = -8192;
peasycap->saturation = -8192; peasycap->saturation = -8192;
peasycap->hue = -8192; peasycap->hue = -8192;
rc = newinput(peasycap, input); rc = newinput(peasycap, input);
if (0 == rc) if (rc) {
JOM(4, "restored input, standard and format\n"); SAM("ERROR: newinput(.,%i) rc = %i\n", rc, input);
else {
SAM("ERROR: newinput(.,%i) returned %i\n", rc, input);
return -EFAULT; return -EFAULT;
} }
if (true == peasycap->ntsc) JOM(4, "restored input, standard and format\n");
JOM(8, "true=peasycap->ntsc\n");
else
JOM(8, "false=peasycap->ntsc\n");
if (0 > peasycap->input) { JOM(8, "true=peasycap->ntsc %d\n", peasycap->ntsc);
if (0 > peasycap->input) {
SAM("MISTAKE: %i=peasycap->input\n", peasycap->input); SAM("MISTAKE: %i=peasycap->input\n", peasycap->input);
return -ENOENT; return -ENOENT;
} }
if (0 > peasycap->standard_offset) { if (0 > peasycap->standard_offset) {
SAM("MISTAKE: %i=peasycap->standard_offset\n", SAM("MISTAKE: %i=peasycap->standard_offset\n",
peasycap->standard_offset); peasycap->standard_offset);
return -ENOENT; return -ENOENT;
} }
if (0 > peasycap->format_offset) { if (0 > peasycap->format_offset) {
SAM("MISTAKE: %i=peasycap->format_offset\n", SAM("MISTAKE: %i=peasycap->format_offset\n",
peasycap->format_offset); peasycap->format_offset);
return -ENOENT; return -ENOENT;
} }
if (0 > peasycap->brightness) { if (0 > peasycap->brightness) {
SAM("MISTAKE: %i=peasycap->brightness\n", peasycap->brightness); SAM("MISTAKE: %i=peasycap->brightness\n",
peasycap->brightness);
return -ENOENT; return -ENOENT;
} }
if (0 > peasycap->contrast) { if (0 > peasycap->contrast) {
SAM("MISTAKE: %i=peasycap->contrast\n", peasycap->contrast); SAM("MISTAKE: %i=peasycap->contrast\n", peasycap->contrast);
return -ENOENT; return -ENOENT;
} }
if (0 > peasycap->saturation) { if (0 > peasycap->saturation) {
SAM("MISTAKE: %i=peasycap->saturation\n", peasycap->saturation); SAM("MISTAKE: %i=peasycap->saturation\n",
peasycap->saturation);
return -ENOENT; return -ENOENT;
} }
if (0 > peasycap->hue) { if (0 > peasycap->hue) {
SAM("MISTAKE: %i=peasycap->hue\n", peasycap->hue); SAM("MISTAKE: %i=peasycap->hue\n", peasycap->hue);
return -ENOENT; return -ENOENT;
} }
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
...@@ -418,20 +402,20 @@ return 0; ...@@ -418,20 +402,20 @@ return 0;
int int
newinput(struct easycap *peasycap, int input) newinput(struct easycap *peasycap, int input)
{ {
int rc, k, m, mood, off; int rc, k, m, mood, off;
int inputnow, video_idlenow, audio_idlenow; int inputnow, video_idlenow, audio_idlenow;
bool resubmit; bool resubmit;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=input sought\n", input); JOM(8, "%i=input sought\n", input);
if (0 > input && INPUT_MANY <= input) if (0 > input && INPUT_MANY <= input)
return -ENOENT; return -ENOENT;
inputnow = peasycap->input; inputnow = peasycap->input;
if (input == inputnow) if (input == inputnow)
return 0; return 0;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
...@@ -441,62 +425,63 @@ if (input == inputnow) ...@@ -441,62 +425,63 @@ if (input == inputnow)
* ROUTINE. * ROUTINE.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
video_idlenow = peasycap->video_idle; video_idlenow = peasycap->video_idle;
audio_idlenow = peasycap->audio_idle; audio_idlenow = peasycap->audio_idle;
peasycap->video_idle = 1; peasycap->video_idle = 1;
peasycap->audio_idle = 1; peasycap->audio_idle = 1;
if (peasycap->video_isoc_streaming) { if (peasycap->video_isoc_streaming) {
resubmit = true; resubmit = true;
kill_video_urbs(peasycap); kill_video_urbs(peasycap);
} else } else {
resubmit = false; resubmit = false;
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (NULL == peasycap->pusb_device) { if (NULL == peasycap->pusb_device) {
SAM("ERROR: peasycap->pusb_device is NULL\n"); SAM("ERROR: peasycap->pusb_device is NULL\n");
return -ENODEV; return -ENODEV;
} }
rc = usb_set_interface(peasycap->pusb_device, rc = usb_set_interface(peasycap->pusb_device,
peasycap->video_interface, peasycap->video_interface,
peasycap->video_altsetting_off); peasycap->video_altsetting_off);
if (rc) { if (rc) {
SAM("ERROR: usb_set_interface() returned %i\n", rc); SAM("ERROR: usb_set_interface() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
rc = stop_100(peasycap->pusb_device); rc = stop_100(peasycap->pusb_device);
if (rc) { if (rc) {
SAM("ERROR: stop_100() returned %i\n", rc); SAM("ERROR: stop_100() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
for (k = 0; k < FIELD_BUFFER_MANY; k++) { for (k = 0; k < FIELD_BUFFER_MANY; k++) {
for (m = 0; m < FIELD_BUFFER_SIZE/PAGE_SIZE; m++) for (m = 0; m < FIELD_BUFFER_SIZE/PAGE_SIZE; m++)
memset(peasycap->field_buffer[k][m].pgo, 0, PAGE_SIZE); memset(peasycap->field_buffer[k][m].pgo, 0, PAGE_SIZE);
} }
for (k = 0; k < FRAME_BUFFER_MANY; k++) { for (k = 0; k < FRAME_BUFFER_MANY; k++) {
for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++) for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++)
memset(peasycap->frame_buffer[k][m].pgo, 0, PAGE_SIZE); memset(peasycap->frame_buffer[k][m].pgo, 0, PAGE_SIZE);
} }
peasycap->field_page = 0; peasycap->field_page = 0;
peasycap->field_read = 0; peasycap->field_read = 0;
peasycap->field_fill = 0; peasycap->field_fill = 0;
peasycap->frame_read = 0; peasycap->frame_read = 0;
peasycap->frame_fill = 0; peasycap->frame_fill = 0;
for (k = 0; k < peasycap->input; k++) { for (k = 0; k < peasycap->input; k++) {
(peasycap->frame_fill)++; (peasycap->frame_fill)++;
if (peasycap->frame_buffer_many <= peasycap->frame_fill) if (peasycap->frame_buffer_many <= peasycap->frame_fill)
peasycap->frame_fill = 0; peasycap->frame_fill = 0;
} }
peasycap->input = input; peasycap->input = input;
select_input(peasycap->pusb_device, peasycap->input, 9); select_input(peasycap->pusb_device, peasycap->input, 9);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (input == peasycap->inputset[input].input) { if (input == peasycap->inputset[input].input) {
off = peasycap->inputset[input].standard_offset; off = peasycap->inputset[input].standard_offset;
if (off != peasycap->standard_offset) { if (off != peasycap->standard_offset) {
rc = adjust_standard(peasycap, rc = adjust_standard(peasycap,
easycap_standard[off].v4l2_standard.id); easycap_standard[off].v4l2_standard.id);
if (rc) { if (rc) {
SAM("ERROR: adjust_standard() returned %i\n", rc); SAM("ERROR: adjust_standard() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=peasycap->standard_offset\n", JOM(8, "%i=peasycap->standard_offset\n",
...@@ -507,16 +492,17 @@ if (input == peasycap->inputset[input].input) { ...@@ -507,16 +492,17 @@ if (input == peasycap->inputset[input].input) {
} }
off = peasycap->inputset[input].format_offset; off = peasycap->inputset[input].format_offset;
if (off != peasycap->format_offset) { if (off != peasycap->format_offset) {
struct v4l2_pix_format *pix =
&easycap_format[off].v4l2_format.fmt.pix;
rc = adjust_format(peasycap, rc = adjust_format(peasycap,
easycap_format[off].v4l2_format.fmt.pix.width, pix->width, pix->height,
easycap_format[off].v4l2_format.fmt.pix.height, pix->pixelformat, pix->field, false);
easycap_format[off].v4l2_format.fmt.pix.pixelformat,
easycap_format[off].v4l2_format.fmt.pix.field, false);
if (0 > rc) { if (0 > rc) {
SAM("ERROR: adjust_format() returned %i\n", rc); SAM("ERROR: adjust_format() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=peasycap->format_offset\n", peasycap->format_offset); JOM(8, "%i=peasycap->format_offset\n",
peasycap->format_offset);
} else { } else {
JOM(8, "%i=peasycap->format_offset unchanged\n", JOM(8, "%i=peasycap->format_offset unchanged\n",
peasycap->format_offset); peasycap->format_offset);
...@@ -525,16 +511,17 @@ if (input == peasycap->inputset[input].input) { ...@@ -525,16 +511,17 @@ if (input == peasycap->inputset[input].input) {
if (mood != peasycap->brightness) { if (mood != peasycap->brightness) {
rc = adjust_brightness(peasycap, mood); rc = adjust_brightness(peasycap, mood);
if (rc) { if (rc) {
SAM("ERROR: adjust_brightness returned %i\n", rc); SAM("ERROR: adjust_brightness rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=peasycap->brightness\n", peasycap->brightness); JOM(8, "%i=peasycap->brightness\n",
peasycap->brightness);
} }
mood = peasycap->inputset[input].contrast; mood = peasycap->inputset[input].contrast;
if (mood != peasycap->contrast) { if (mood != peasycap->contrast) {
rc = adjust_contrast(peasycap, mood); rc = adjust_contrast(peasycap, mood);
if (rc) { if (rc) {
SAM("ERROR: adjust_contrast returned %i\n", rc); SAM("ERROR: adjust_contrast rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=peasycap->contrast\n", peasycap->contrast); JOM(8, "%i=peasycap->contrast\n", peasycap->contrast);
...@@ -543,81 +530,82 @@ if (input == peasycap->inputset[input].input) { ...@@ -543,81 +530,82 @@ if (input == peasycap->inputset[input].input) {
if (mood != peasycap->saturation) { if (mood != peasycap->saturation) {
rc = adjust_saturation(peasycap, mood); rc = adjust_saturation(peasycap, mood);
if (rc) { if (rc) {
SAM("ERROR: adjust_saturation returned %i\n", rc); SAM("ERROR: adjust_saturation rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=peasycap->saturation\n", peasycap->saturation); JOM(8, "%i=peasycap->saturation\n",
peasycap->saturation);
} }
mood = peasycap->inputset[input].hue; mood = peasycap->inputset[input].hue;
if (mood != peasycap->hue) { if (mood != peasycap->hue) {
rc = adjust_hue(peasycap, mood); rc = adjust_hue(peasycap, mood);
if (rc) { if (rc) {
SAM("ERROR: adjust_hue returned %i\n", rc); SAM("ERROR: adjust_hue rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(8, "%i=peasycap->hue\n", peasycap->hue); JOM(8, "%i=peasycap->hue\n", peasycap->hue);
} }
} else { } else {
SAM("MISTAKE: easycap.inputset[%i] unpopulated\n", input); SAM("MISTAKE: easycap.inputset[%i] unpopulated\n", input);
return -ENOENT; return -ENOENT;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (NULL == peasycap->pusb_device) { if (NULL == peasycap->pusb_device) {
SAM("ERROR: peasycap->pusb_device is NULL\n"); SAM("ERROR: peasycap->pusb_device is NULL\n");
return -ENODEV; return -ENODEV;
} }
rc = usb_set_interface(peasycap->pusb_device, rc = usb_set_interface(peasycap->pusb_device,
peasycap->video_interface, peasycap->video_interface,
peasycap->video_altsetting_on); peasycap->video_altsetting_on);
if (rc) { if (rc) {
SAM("ERROR: usb_set_interface() returned %i\n", rc); SAM("ERROR: usb_set_interface() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
rc = start_100(peasycap->pusb_device); rc = start_100(peasycap->pusb_device);
if (rc) { if (rc) {
SAM("ERROR: start_100() returned %i\n", rc); SAM("ERROR: start_100() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
if (true == resubmit) if (true == resubmit)
submit_video_urbs(peasycap); submit_video_urbs(peasycap);
peasycap->video_isoc_sequence = VIDEO_ISOC_BUFFER_MANY - 1; peasycap->video_isoc_sequence = VIDEO_ISOC_BUFFER_MANY - 1;
peasycap->video_idle = video_idlenow; peasycap->video_idle = video_idlenow;
peasycap->audio_idle = audio_idlenow; peasycap->audio_idle = audio_idlenow;
peasycap->video_junk = 0; peasycap->video_junk = 0;
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
int submit_video_urbs(struct easycap *peasycap) int submit_video_urbs(struct easycap *peasycap)
{ {
struct data_urb *pdata_urb; struct data_urb *pdata_urb;
struct urb *purb; struct urb *purb;
struct list_head *plist_head; struct list_head *plist_head;
int j, isbad, nospc, m, rc; int j, isbad, nospc, m, rc;
int isbuf; int isbuf;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
if (NULL == peasycap->purb_video_head) { if (NULL == peasycap->purb_video_head) {
SAY("ERROR: peasycap->urb_video_head uninitialized\n"); SAY("ERROR: peasycap->urb_video_head uninitialized\n");
return -EFAULT; return -EFAULT;
} }
if (NULL == peasycap->pusb_device) { if (NULL == peasycap->pusb_device) {
SAY("ERROR: peasycap->pusb_device is NULL\n"); SAY("ERROR: peasycap->pusb_device is NULL\n");
return -ENODEV; return -ENODEV;
} }
if (!peasycap->video_isoc_streaming) { if (!peasycap->video_isoc_streaming) {
JOM(4, "submission of all video urbs\n"); JOM(4, "submission of all video urbs\n");
isbad = 0; nospc = 0; m = 0; isbad = 0; nospc = 0; m = 0;
list_for_each(plist_head, (peasycap->purb_video_head)) { list_for_each(plist_head, (peasycap->purb_video_head)) {
pdata_urb = list_entry(plist_head, struct data_urb, list_head); pdata_urb = list_entry(plist_head,
if (NULL != pdata_urb) { struct data_urb, list_head);
if (pdata_urb && pdata_urb->purb) {
purb = pdata_urb->purb; purb = pdata_urb->purb;
if (NULL != purb) {
isbuf = pdata_urb->isbuf; isbuf = pdata_urb->isbuf;
purb->interval = 1; purb->interval = 1;
purb->dev = peasycap->pusb_device; purb->dev = peasycap->pusb_device;
...@@ -635,15 +623,11 @@ if (!peasycap->video_isoc_streaming) { ...@@ -635,15 +623,11 @@ if (!peasycap->video_isoc_streaming) {
purb->number_of_packets = purb->number_of_packets =
peasycap->video_isoc_framesperdesc; peasycap->video_isoc_framesperdesc;
for (j = 0; j < peasycap-> for (j = 0; j < peasycap->video_isoc_framesperdesc; j++) {
video_isoc_framesperdesc; j++) { purb->iso_frame_desc[j]. offset =
purb->iso_frame_desc[j]. j * peasycap->video_isoc_maxframesize;
offset = j * purb->iso_frame_desc[j]. length =
peasycap-> peasycap->video_isoc_maxframesize;
video_isoc_maxframesize;
purb->iso_frame_desc[j].
length = peasycap->
video_isoc_maxframesize;
} }
rc = usb_submit_urb(purb, GFP_KERNEL); rc = usb_submit_urb(purb, GFP_KERNEL);
...@@ -660,9 +644,6 @@ if (!peasycap->video_isoc_streaming) { ...@@ -660,9 +644,6 @@ if (!peasycap->video_isoc_streaming) {
} else { } else {
isbad++; isbad++;
} }
} else {
isbad++;
}
} }
if (nospc) { if (nospc) {
SAM("-ENOSPC=usb_submit_urb() for %i urbs\n", nospc); SAM("-ENOSPC=usb_submit_urb() for %i urbs\n", nospc);
...@@ -673,8 +654,8 @@ if (!peasycap->video_isoc_streaming) { ...@@ -673,8 +654,8 @@ if (!peasycap->video_isoc_streaming) {
if (isbad) { if (isbad) {
JOM(4, "attempting cleanup instead of submitting\n"); JOM(4, "attempting cleanup instead of submitting\n");
list_for_each(plist_head, (peasycap->purb_video_head)) { list_for_each(plist_head, (peasycap->purb_video_head)) {
pdata_urb = list_entry(plist_head, struct data_urb, pdata_urb = list_entry(plist_head,
list_head); struct data_urb, list_head);
if (NULL != pdata_urb) { if (NULL != pdata_urb) {
purb = pdata_urb->purb; purb = pdata_urb->purb;
if (NULL != purb) if (NULL != purb)
...@@ -686,48 +667,45 @@ if (!peasycap->video_isoc_streaming) { ...@@ -686,48 +667,45 @@ if (!peasycap->video_isoc_streaming) {
peasycap->video_isoc_streaming = 1; peasycap->video_isoc_streaming = 1;
JOM(4, "submitted %i video urbs\n", m); JOM(4, "submitted %i video urbs\n", m);
} }
} else { } else {
JOM(4, "already streaming video urbs\n"); JOM(4, "already streaming video urbs\n");
} }
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
int int kill_video_urbs(struct easycap *peasycap)
kill_video_urbs(struct easycap *peasycap)
{ {
int m; int m;
struct list_head *plist_head; struct list_head *plist_head;
struct data_urb *pdata_urb; struct data_urb *pdata_urb;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
if (peasycap->video_isoc_streaming) { if (!peasycap->video_isoc_streaming) {
if (NULL != peasycap->purb_video_head) { JOM(8, "%i=video_isoc_streaming, no video urbs killed\n",
peasycap->video_isoc_streaming);
return 0;
}
if (!peasycap->purb_video_head) {
SAM("ERROR: peasycap->purb_video_head is NULL\n");
return -EFAULT;
}
peasycap->video_isoc_streaming = 0; peasycap->video_isoc_streaming = 0;
JOM(4, "killing video urbs\n"); JOM(4, "killing video urbs\n");
m = 0; m = 0;
list_for_each(plist_head, (peasycap->purb_video_head)) { list_for_each(plist_head, (peasycap->purb_video_head)) {
pdata_urb = list_entry(plist_head, struct data_urb, pdata_urb = list_entry(plist_head, struct data_urb, list_head);
list_head); if (pdata_urb && pdata_urb->purb) {
if (NULL != pdata_urb) {
if (NULL != pdata_urb->purb) {
usb_kill_urb(pdata_urb->purb); usb_kill_urb(pdata_urb->purb);
m++; m++;
} }
} }
}
JOM(4, "%i video urbs killed\n", m); JOM(4, "%i video urbs killed\n", m);
} else {
SAM("ERROR: peasycap->purb_video_head is NULL\n"); return 0;
return -EFAULT;
}
} else {
JOM(8, "%i=video_isoc_streaming, no video urbs killed\n",
peasycap->video_isoc_streaming);
}
return 0;
} }
/****************************************************************************/ /****************************************************************************/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
...@@ -735,32 +713,27 @@ return 0; ...@@ -735,32 +713,27 @@ return 0;
static int easycap_release(struct inode *inode, struct file *file) static int easycap_release(struct inode *inode, struct file *file)
{ {
#ifndef EASYCAP_IS_VIDEODEV_CLIENT #ifndef EASYCAP_IS_VIDEODEV_CLIENT
struct easycap *peasycap; struct easycap *peasycap;
JOT(4, "\n");
peasycap = file->private_data; peasycap = file->private_data;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL.\n"); SAY("ERROR: peasycap is NULL.\n");
SAY("ending unsuccessfully\n"); SAY("ending unsuccessfully\n");
return -EFAULT; return -EFAULT;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return -EFAULT; return -EFAULT;
} }
if (0 != kill_video_urbs(peasycap)) { if (0 != kill_video_urbs(peasycap)) {
SAM("ERROR: kill_video_urbs() failed\n"); SAM("ERROR: kill_video_urbs() failed\n");
return -EFAULT; return -EFAULT;
} }
JOM(4, "ending successfully\n"); JOM(4, "ending successfully\n");
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
#else
#
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/ #endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
return 0; return 0;
} }
#ifdef EASYCAP_IS_VIDEODEV_CLIENT #ifdef EASYCAP_IS_VIDEODEV_CLIENT
static int easycap_open_noinode(struct file *file) static int easycap_open_noinode(struct file *file)
...@@ -774,26 +747,24 @@ static int easycap_release_noinode(struct file *file) ...@@ -774,26 +747,24 @@ static int easycap_release_noinode(struct file *file)
} }
static int videodev_release(struct video_device *pvideo_device) static int videodev_release(struct video_device *pvideo_device)
{ {
struct easycap *peasycap; struct easycap *peasycap;
JOT(4, "\n");
peasycap = video_get_drvdata(pvideo_device); peasycap = video_get_drvdata(pvideo_device);
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
SAY("ending unsuccessfully\n"); SAY("ending unsuccessfully\n");
return -EFAULT; return -EFAULT;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return -EFAULT; return -EFAULT;
} }
if (0 != kill_video_urbs(peasycap)) { if (0 != kill_video_urbs(peasycap)) {
SAM("ERROR: kill_video_urbs() failed\n"); SAM("ERROR: kill_video_urbs() failed\n");
return -EFAULT; return -EFAULT;
} }
JOM(4, "ending successfully\n"); JOM(4, "ending successfully\n");
return 0; return 0;
} }
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/ #endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
...@@ -809,39 +780,42 @@ return 0; ...@@ -809,39 +780,42 @@ return 0;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void easycap_delete(struct kref *pkref) static void easycap_delete(struct kref *pkref)
{ {
int k, m, gone, kd; struct easycap *peasycap;
int allocation_video_urb, allocation_video_page, allocation_video_struct; struct data_urb *pdata_urb;
int allocation_audio_urb, allocation_audio_page, allocation_audio_struct; struct list_head *plist_head, *plist_next;
int registered_video, registered_audio; int k, m, gone, kd;
struct easycap *peasycap; int allocation_video_urb;
struct data_urb *pdata_urb; int allocation_video_page;
struct list_head *plist_head, *plist_next; int allocation_video_struct;
int allocation_audio_urb;
JOT(4, "\n"); int allocation_audio_page;
int allocation_audio_struct;
peasycap = container_of(pkref, struct easycap, kref); int registered_video, registered_audio;
if (NULL == peasycap) {
peasycap = container_of(pkref, struct easycap, kref);
if (NULL == peasycap) {
SAM("ERROR: peasycap is NULL: cannot perform deletions\n"); SAM("ERROR: peasycap is NULL: cannot perform deletions\n");
return; return;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return; return;
} }
kd = isdongle(peasycap); kd = isdongle(peasycap);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* FREE VIDEO. * FREE VIDEO.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (NULL != peasycap->purb_video_head) { if (NULL != peasycap->purb_video_head) {
JOM(4, "freeing video urbs\n"); JOM(4, "freeing video urbs\n");
m = 0; m = 0;
list_for_each(plist_head, (peasycap->purb_video_head)) { list_for_each(plist_head, (peasycap->purb_video_head)) {
pdata_urb = list_entry(plist_head, struct data_urb, list_head); pdata_urb = list_entry(plist_head,
if (NULL == pdata_urb) struct data_urb, list_head);
if (NULL == pdata_urb) {
JOM(4, "ERROR: pdata_urb is NULL\n"); JOM(4, "ERROR: pdata_urb is NULL\n");
else { } else {
if (NULL != pdata_urb->purb) { if (NULL != pdata_urb->purb) {
usb_free_urb(pdata_urb->purb); usb_free_urb(pdata_urb->purb);
pdata_urb->purb = NULL; pdata_urb->purb = NULL;
...@@ -855,74 +829,79 @@ if (NULL != peasycap->purb_video_head) { ...@@ -855,74 +829,79 @@ if (NULL != peasycap->purb_video_head) {
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing video data_urb structures.\n"); JOM(4, "freeing video data_urb structures.\n");
m = 0; m = 0;
list_for_each_safe(plist_head, plist_next, peasycap->purb_video_head) { list_for_each_safe(plist_head, plist_next,
pdata_urb = list_entry(plist_head, struct data_urb, list_head); peasycap->purb_video_head) {
if (NULL != pdata_urb) { pdata_urb = list_entry(plist_head,
kfree(pdata_urb); pdata_urb = NULL; struct data_urb, list_head);
if (pdata_urb) {
peasycap->allocation_video_struct -= peasycap->allocation_video_struct -=
sizeof(struct data_urb); sizeof(struct data_urb);
kfree(pdata_urb);
pdata_urb = NULL;
m++; m++;
} }
} }
JOM(4, "%i video data_urb structures freed\n", m); JOM(4, "%i video data_urb structures freed\n", m);
JOM(4, "setting peasycap->purb_video_head=NULL\n"); JOM(4, "setting peasycap->purb_video_head=NULL\n");
peasycap->purb_video_head = NULL; peasycap->purb_video_head = NULL;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing video isoc buffers.\n"); JOM(4, "freeing video isoc buffers.\n");
m = 0; m = 0;
for (k = 0; k < VIDEO_ISOC_BUFFER_MANY; k++) { for (k = 0; k < VIDEO_ISOC_BUFFER_MANY; k++) {
if (NULL != peasycap->video_isoc_buffer[k].pgo) { if (peasycap->video_isoc_buffer[k].pgo) {
free_pages((unsigned long) free_pages((unsigned long)
(peasycap->video_isoc_buffer[k].pgo), peasycap->video_isoc_buffer[k].pgo,
VIDEO_ISOC_ORDER); VIDEO_ISOC_ORDER);
peasycap->video_isoc_buffer[k].pgo = NULL; peasycap->video_isoc_buffer[k].pgo = NULL;
peasycap->allocation_video_page -= peasycap->allocation_video_page -=
((unsigned int)(0x01 << VIDEO_ISOC_ORDER)); BIT(VIDEO_ISOC_ORDER);
m++; m++;
} }
} }
JOM(4, "isoc video buffers freed: %i pages\n", m * (0x01 << VIDEO_ISOC_ORDER)); JOM(4, "isoc video buffers freed: %i pages\n",
m * (0x01 << VIDEO_ISOC_ORDER));
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing video field buffers.\n"); JOM(4, "freeing video field buffers.\n");
gone = 0; gone = 0;
for (k = 0; k < FIELD_BUFFER_MANY; k++) { for (k = 0; k < FIELD_BUFFER_MANY; k++) {
for (m = 0; m < FIELD_BUFFER_SIZE/PAGE_SIZE; m++) { for (m = 0; m < FIELD_BUFFER_SIZE/PAGE_SIZE; m++) {
if (NULL != peasycap->field_buffer[k][m].pgo) { if (NULL != peasycap->field_buffer[k][m].pgo) {
free_page((unsigned long) free_page((unsigned long)
(peasycap->field_buffer[k][m].pgo)); peasycap->field_buffer[k][m].pgo);
peasycap->field_buffer[k][m].pgo = NULL; peasycap->field_buffer[k][m].pgo = NULL;
peasycap->allocation_video_page -= 1; peasycap->allocation_video_page -= 1;
gone++; gone++;
} }
} }
} }
JOM(4, "video field buffers freed: %i pages\n", gone); JOM(4, "video field buffers freed: %i pages\n", gone);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing video frame buffers.\n"); JOM(4, "freeing video frame buffers.\n");
gone = 0; gone = 0;
for (k = 0; k < FRAME_BUFFER_MANY; k++) { for (k = 0; k < FRAME_BUFFER_MANY; k++) {
for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++) { for (m = 0; m < FRAME_BUFFER_SIZE/PAGE_SIZE; m++) {
if (NULL != peasycap->frame_buffer[k][m].pgo) { if (NULL != peasycap->frame_buffer[k][m].pgo) {
free_page((unsigned long) free_page((unsigned long)
(peasycap->frame_buffer[k][m].pgo)); peasycap->frame_buffer[k][m].pgo);
peasycap->frame_buffer[k][m].pgo = NULL; peasycap->frame_buffer[k][m].pgo = NULL;
peasycap->allocation_video_page -= 1; peasycap->allocation_video_page -= 1;
gone++; gone++;
} }
} }
} }
JOM(4, "video frame buffers freed: %i pages\n", gone); JOM(4, "video frame buffers freed: %i pages\n", gone);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* FREE AUDIO. * FREE AUDIO.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (NULL != peasycap->purb_audio_head) { if (NULL != peasycap->purb_audio_head) {
JOM(4, "freeing audio urbs\n"); JOM(4, "freeing audio urbs\n");
m = 0; m = 0;
list_for_each(plist_head, (peasycap->purb_audio_head)) { list_for_each(plist_head, (peasycap->purb_audio_head)) {
pdata_urb = list_entry(plist_head, struct data_urb, list_head); pdata_urb = list_entry(plist_head,
struct data_urb, list_head);
if (NULL == pdata_urb) if (NULL == pdata_urb)
JOM(4, "ERROR: pdata_urb is NULL\n"); JOM(4, "ERROR: pdata_urb is NULL\n");
else { else {
...@@ -938,63 +917,66 @@ if (NULL != peasycap->purb_audio_head) { ...@@ -938,63 +917,66 @@ if (NULL != peasycap->purb_audio_head) {
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing audio data_urb structures.\n"); JOM(4, "freeing audio data_urb structures.\n");
m = 0; m = 0;
list_for_each_safe(plist_head, plist_next, peasycap->purb_audio_head) { list_for_each_safe(plist_head, plist_next,
pdata_urb = list_entry(plist_head, struct data_urb, list_head); peasycap->purb_audio_head) {
if (NULL != pdata_urb) { pdata_urb = list_entry(plist_head,
kfree(pdata_urb); pdata_urb = NULL; struct data_urb, list_head);
if (pdata_urb) {
peasycap->allocation_audio_struct -= peasycap->allocation_audio_struct -=
sizeof(struct data_urb); sizeof(struct data_urb);
kfree(pdata_urb);
pdata_urb = NULL;
m++; m++;
} }
} }
JOM(4, "%i audio data_urb structures freed\n", m); JOM(4, "%i audio data_urb structures freed\n", m);
JOM(4, "setting peasycap->purb_audio_head=NULL\n"); JOM(4, "setting peasycap->purb_audio_head=NULL\n");
peasycap->purb_audio_head = NULL; peasycap->purb_audio_head = NULL;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing audio isoc buffers.\n"); JOM(4, "freeing audio isoc buffers.\n");
m = 0; m = 0;
for (k = 0; k < AUDIO_ISOC_BUFFER_MANY; k++) { for (k = 0; k < AUDIO_ISOC_BUFFER_MANY; k++) {
if (NULL != peasycap->audio_isoc_buffer[k].pgo) { if (NULL != peasycap->audio_isoc_buffer[k].pgo) {
free_pages((unsigned long) free_pages((unsigned long)
(peasycap->audio_isoc_buffer[k].pgo), (peasycap->audio_isoc_buffer[k].pgo),
AUDIO_ISOC_ORDER); AUDIO_ISOC_ORDER);
peasycap->audio_isoc_buffer[k].pgo = NULL; peasycap->audio_isoc_buffer[k].pgo = NULL;
peasycap->allocation_audio_page -= peasycap->allocation_audio_page -=
((unsigned int)(0x01 << AUDIO_ISOC_ORDER)); BIT(AUDIO_ISOC_ORDER);
m++; m++;
} }
} }
JOM(4, "easyoss_delete(): isoc audio buffers freed: %i pages\n", JOM(4, "easyoss_delete(): isoc audio buffers freed: %i pages\n",
m * (0x01 << AUDIO_ISOC_ORDER)); m * (0x01 << AUDIO_ISOC_ORDER));
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#ifdef CONFIG_EASYCAP_OSS #ifdef CONFIG_EASYCAP_OSS
JOM(4, "freeing audio buffers.\n"); JOM(4, "freeing audio buffers.\n");
gone = 0; gone = 0;
for (k = 0; k < peasycap->audio_buffer_page_many; k++) { for (k = 0; k < peasycap->audio_buffer_page_many; k++) {
if (NULL != peasycap->audio_buffer[k].pgo) { if (NULL != peasycap->audio_buffer[k].pgo) {
free_page((unsigned long)(peasycap->audio_buffer[k].pgo)); free_page((unsigned long)peasycap->audio_buffer[k].pgo);
peasycap->audio_buffer[k].pgo = NULL; peasycap->audio_buffer[k].pgo = NULL;
peasycap->allocation_audio_page -= 1; peasycap->allocation_audio_page -= 1;
gone++; gone++;
} }
} }
JOM(4, "easyoss_delete(): audio buffers freed: %i pages\n", gone); JOM(4, "easyoss_delete(): audio buffers freed: %i pages\n", gone);
#endif /* CONFIG_EASYCAP_OSS */ #endif /* CONFIG_EASYCAP_OSS */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "freeing easycap structure.\n"); JOM(4, "freeing easycap structure.\n");
allocation_video_urb = peasycap->allocation_video_urb; allocation_video_urb = peasycap->allocation_video_urb;
allocation_video_page = peasycap->allocation_video_page; allocation_video_page = peasycap->allocation_video_page;
allocation_video_struct = peasycap->allocation_video_struct; allocation_video_struct = peasycap->allocation_video_struct;
registered_video = peasycap->registered_video; registered_video = peasycap->registered_video;
allocation_audio_urb = peasycap->allocation_audio_urb; allocation_audio_urb = peasycap->allocation_audio_urb;
allocation_audio_page = peasycap->allocation_audio_page; allocation_audio_page = peasycap->allocation_audio_page;
allocation_audio_struct = peasycap->allocation_audio_struct; allocation_audio_struct = peasycap->allocation_audio_struct;
registered_audio = peasycap->registered_audio; registered_audio = peasycap->registered_audio;
kfree(peasycap); kfree(peasycap);
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
if (mutex_lock_interruptible(&mutex_dongle)) { if (mutex_lock_interruptible(&mutex_dongle)) {
SAY("ERROR: cannot down mutex_dongle\n"); SAY("ERROR: cannot down mutex_dongle\n");
} else { } else {
...@@ -1002,68 +984,65 @@ if (0 <= kd && DONGLE_MANY > kd) { ...@@ -1002,68 +984,65 @@ if (0 <= kd && DONGLE_MANY > kd) {
easycapdc60_dongle[kd].peasycap = NULL; easycapdc60_dongle[kd].peasycap = NULL;
mutex_unlock(&mutex_dongle); mutex_unlock(&mutex_dongle);
JOM(4, "unlocked mutex_dongle\n"); JOM(4, "unlocked mutex_dongle\n");
JOT(4, " null-->easycapdc60_dongle[%i].peasycap\n", kd); JOT(4, " null-->dongle[%i].peasycap\n", kd);
allocation_video_struct -= sizeof(struct easycap); allocation_video_struct -= sizeof(struct easycap);
} }
} else { } else {
SAY("ERROR: cannot purge easycapdc60_dongle[].peasycap"); SAY("ERROR: cannot purge dongle[].peasycap");
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
SAY("%8i= video urbs after all deletions\n", allocation_video_urb); SAY("%8i=video urbs after all deletions\n", allocation_video_urb);
SAY("%8i= video pages after all deletions\n", allocation_video_page); SAY("%8i=video pages after all deletions\n", allocation_video_page);
SAY("%8i= video structs after all deletions\n", allocation_video_struct); SAY("%8i=video structs after all deletions\n", allocation_video_struct);
SAY("%8i= video devices after all deletions\n", registered_video); SAY("%8i=video devices after all deletions\n", registered_video);
SAY("%8i= audio urbs after all deletions\n", allocation_audio_urb); SAY("%8i=audio urbs after all deletions\n", allocation_audio_urb);
SAY("%8i= audio pages after all deletions\n", allocation_audio_page); SAY("%8i=audio pages after all deletions\n", allocation_audio_page);
SAY("%8i= audio structs after all deletions\n", allocation_audio_struct); SAY("%8i=audio structs after all deletions\n", allocation_audio_struct);
SAY("%8i= audio devices after all deletions\n", registered_audio); SAY("%8i=audio devices after all deletions\n", registered_audio);
JOT(4, "ending.\n"); JOT(4, "ending.\n");
return; return;
} }
/*****************************************************************************/ /*****************************************************************************/
static unsigned int easycap_poll(struct file *file, poll_table *wait) static unsigned int easycap_poll(struct file *file, poll_table *wait)
{ {
struct easycap *peasycap; struct easycap *peasycap;
int rc, kd; int rc, kd;
JOT(8, "\n"); JOT(8, "\n");
if (NULL == ((poll_table *)wait)) if (NULL == ((poll_table *)wait))
JOT(8, "WARNING: poll table pointer is NULL ... continuing\n"); JOT(8, "WARNING: poll table pointer is NULL ... continuing\n");
if (NULL == file) { if (NULL == file) {
SAY("ERROR: file pointer is NULL\n"); SAY("ERROR: file pointer is NULL\n");
return -ERESTARTSYS; return -ERESTARTSYS;
} }
peasycap = file->private_data; peasycap = file->private_data;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return -EFAULT; return -EFAULT;
} }
if (NULL == peasycap->pusb_device) { if (NULL == peasycap->pusb_device) {
SAY("ERROR: peasycap->pusb_device is NULL\n"); SAY("ERROR: peasycap->pusb_device is NULL\n");
return -EFAULT; return -EFAULT;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
kd = isdongle(peasycap); kd = isdongle(peasycap);
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_video)) { if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_video)) {
SAY("ERROR: cannot down " SAY("ERROR: cannot down dongle[%i].mutex_video\n", kd);
"easycapdc60_dongle[%i].mutex_video\n", kd);
return -ERESTARTSYS; return -ERESTARTSYS;
} }
JOM(4, "locked easycapdc60_dongle[%i].mutex_video\n", kd); JOM(4, "locked dongle[%i].mutex_video\n", kd);
/*-------------------------------------------------------------------*/
/* /*
* MEANWHILE, easycap_usb_disconnect() MAY HAVE FREED POINTER * MEANWHILE, easycap_usb_disconnect() MAY HAVE FREED POINTER
* peasycap, IN WHICH CASE A REPEAT CALL TO isdongle() WILL FAIL. * peasycap, IN WHICH CASE A REPEAT CALL TO isdongle() WILL FAIL.
* IF NECESSARY, BAIL OUT. * IF NECESSARY, BAIL OUT.
*/ */
/*-------------------------------------------------------------------*/
if (kd != isdongle(peasycap)) if (kd != isdongle(peasycap))
return -ERESTARTSYS; return -ERESTARTSYS;
if (NULL == file) { if (NULL == file) {
...@@ -1087,47 +1066,43 @@ if (0 <= kd && DONGLE_MANY > kd) { ...@@ -1087,47 +1066,43 @@ if (0 <= kd && DONGLE_MANY > kd) {
mutex_unlock(&easycapdc60_dongle[kd].mutex_video); mutex_unlock(&easycapdc60_dongle[kd].mutex_video);
return -ERESTARTSYS; return -ERESTARTSYS;
} }
} else } else
/*-------------------------------------------------------------------*/
/* /*
* IF easycap_usb_disconnect() HAS ALREADY FREED POINTER peasycap * IF easycap_usb_disconnect() HAS ALREADY FREED POINTER peasycap
* BEFORE THE ATTEMPT TO ACQUIRE THE SEMAPHORE, isdongle() WILL * BEFORE THE ATTEMPT TO ACQUIRE THE SEMAPHORE, isdongle() WILL
* HAVE FAILED. BAIL OUT. * HAVE FAILED. BAIL OUT.
*/ */
/*-------------------------------------------------------------------*/
return -ERESTARTSYS; return -ERESTARTSYS;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
rc = easycap_dqbuf(peasycap, 0); rc = easycap_dqbuf(peasycap, 0);
peasycap->polled = 1; peasycap->polled = 1;
mutex_unlock(&easycapdc60_dongle[kd].mutex_video); mutex_unlock(&easycapdc60_dongle[kd].mutex_video);
if (0 == rc) if (0 == rc)
return POLLIN | POLLRDNORM; return POLLIN | POLLRDNORM;
else else
return POLLERR; return POLLERR;
} }
/*****************************************************************************/ /*****************************************************************************/
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* IF mode IS NONZERO THIS ROUTINE RETURNS -EAGAIN RATHER THAN BLOCKING. * IF mode IS NONZERO THIS ROUTINE RETURNS -EAGAIN RATHER THAN BLOCKING.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int int easycap_dqbuf(struct easycap *peasycap, int mode)
easycap_dqbuf(struct easycap *peasycap, int mode)
{ {
int input, ifield, miss, rc; int input, ifield, miss, rc;
JOT(8, "\n");
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
if (NULL == peasycap->pusb_device) { if (NULL == peasycap->pusb_device) {
SAY("ERROR: peasycap->pusb_device is NULL\n"); SAY("ERROR: peasycap->pusb_device is NULL\n");
return -EFAULT; return -EFAULT;
} }
ifield = 0; ifield = 0;
JOM(8, "%i=ifield\n", ifield); JOM(8, "%i=ifield\n", ifield);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* CHECK FOR LOST INPUT SIGNAL. * CHECK FOR LOST INPUT SIGNAL.
...@@ -1143,8 +1118,8 @@ JOM(8, "%i=ifield\n", ifield); ...@@ -1143,8 +1118,8 @@ JOM(8, "%i=ifield\n", ifield);
* INPUT 0 UNPLUGGED, INPUT 4 UNPLUGGED => SCREEN 0 BARS, SCREEN 4 BARS * INPUT 0 UNPLUGGED, INPUT 4 UNPLUGGED => SCREEN 0 BARS, SCREEN 4 BARS
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
input = peasycap->input; input = peasycap->input;
if (0 <= input && INPUT_MANY > input) { if (0 <= input && INPUT_MANY > input) {
rc = read_saa(peasycap->pusb_device, 0x1F); rc = read_saa(peasycap->pusb_device, 0x1F);
if (0 <= rc) { if (0 <= rc) {
if (rc & 0x40) if (rc & 0x40)
...@@ -1157,14 +1132,14 @@ if (0 <= input && INPUT_MANY > input) { ...@@ -1157,14 +1132,14 @@ if (0 <= input && INPUT_MANY > input) {
else if ((2 * VIDEO_LOST_TOLERATE) < peasycap->lost[input]) else if ((2 * VIDEO_LOST_TOLERATE) < peasycap->lost[input])
peasycap->lost[input] = (2 * VIDEO_LOST_TOLERATE); peasycap->lost[input] = (2 * VIDEO_LOST_TOLERATE);
} }
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* WAIT FOR FIELD ifield (0 => TOP, 1 => BOTTOM) * WAIT FOR FIELD ifield (0 => TOP, 1 => BOTTOM)
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
miss = 0; miss = 0;
while ((peasycap->field_read == peasycap->field_fill) || while ((peasycap->field_read == peasycap->field_fill) ||
(0 != (0xFF00 & peasycap->field_buffer (0 != (0xFF00 & peasycap->field_buffer
[peasycap->field_read][0].kount)) || [peasycap->field_read][0].kount)) ||
(ifield != (0x00FF & peasycap->field_buffer (ifield != (0x00FF & peasycap->field_buffer
...@@ -1187,7 +1162,7 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1187,7 +1162,7 @@ while ((peasycap->field_read == peasycap->field_fill) ||
return -EIO; return -EIO;
} }
if (peasycap->video_idle) { if (peasycap->video_idle) {
JOM(8, "%i=peasycap->video_idle ... returning -EAGAIN\n", JOM(8, "%i=peasycap->video_idle returning -EAGAIN\n",
peasycap->video_idle); peasycap->video_idle);
return -EAGAIN; return -EAGAIN;
} }
...@@ -1199,14 +1174,14 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1199,14 +1174,14 @@ while ((peasycap->field_read == peasycap->field_fill) ||
peasycap->video_eof = 0; peasycap->video_eof = 0;
peasycap->audio_eof = 0; peasycap->audio_eof = 0;
if (0 != reset(peasycap)) { if (0 != reset(peasycap)) {
JOM(8, " ... failed ... returning -EIO\n"); JOM(8, " ... failed returning -EIO\n");
peasycap->video_eof = 1; peasycap->video_eof = 1;
peasycap->audio_eof = 1; peasycap->audio_eof = 1;
kill_video_urbs(peasycap); kill_video_urbs(peasycap);
return -EIO; return -EIO;
} }
peasycap->status = 0; peasycap->status = 0;
JOM(8, " ... OK ... returning -EAGAIN\n"); JOM(8, " ... OK returning -EAGAIN\n");
return -EAGAIN; return -EAGAIN;
} }
#endif /*PERSEVERE*/ #endif /*PERSEVERE*/
...@@ -1216,24 +1191,24 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1216,24 +1191,24 @@ while ((peasycap->field_read == peasycap->field_fill) ||
JOM(8, "returning -EIO\n"); JOM(8, "returning -EIO\n");
return -EIO; return -EIO;
} }
miss++; miss++;
} }
JOM(8, "first awakening on wq_video after %i waits\n", miss); JOM(8, "first awakening on wq_video after %i waits\n", miss);
rc = field2frame(peasycap); rc = field2frame(peasycap);
if (rc) if (rc)
SAM("ERROR: field2frame() returned %i\n", rc); SAM("ERROR: field2frame() rc = %i\n", rc);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* WAIT FOR THE OTHER FIELD * WAIT FOR THE OTHER FIELD
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (ifield) if (ifield)
ifield = 0; ifield = 0;
else else
ifield = 1; ifield = 1;
miss = 0; miss = 0;
while ((peasycap->field_read == peasycap->field_fill) || while ((peasycap->field_read == peasycap->field_fill) ||
(0 != (0xFF00 & peasycap->field_buffer (0 != (0xFF00 & peasycap->field_buffer
[peasycap->field_read][0].kount)) || [peasycap->field_read][0].kount)) ||
(ifield != (0x00FF & peasycap->field_buffer (ifield != (0x00FF & peasycap->field_buffer
...@@ -1241,8 +1216,7 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1241,8 +1216,7 @@ while ((peasycap->field_read == peasycap->field_fill) ||
if (mode) if (mode)
return -EAGAIN; return -EAGAIN;
JOM(8, "second wait on wq_video, " JOM(8, "second wait on wq_video %i=field_read %i=field_fill\n",
"%i=field_read %i=field_fill\n",
peasycap->field_read, peasycap->field_fill); peasycap->field_read, peasycap->field_fill);
if (0 != (wait_event_interruptible(peasycap->wq_video, if (0 != (wait_event_interruptible(peasycap->wq_video,
(peasycap->video_idle || peasycap->video_eof || (peasycap->video_idle || peasycap->video_eof ||
...@@ -1256,7 +1230,7 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1256,7 +1230,7 @@ while ((peasycap->field_read == peasycap->field_fill) ||
return -EIO; return -EIO;
} }
if (peasycap->video_idle) { if (peasycap->video_idle) {
JOM(8, "%i=peasycap->video_idle ... returning -EAGAIN\n", JOM(8, "%i=peasycap->video_idle returning -EAGAIN\n",
peasycap->video_idle); peasycap->video_idle);
return -EAGAIN; return -EAGAIN;
} }
...@@ -1268,7 +1242,7 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1268,7 +1242,7 @@ while ((peasycap->field_read == peasycap->field_fill) ||
peasycap->video_eof = 0; peasycap->video_eof = 0;
peasycap->audio_eof = 0; peasycap->audio_eof = 0;
if (0 != reset(peasycap)) { if (0 != reset(peasycap)) {
JOM(8, " ... failed ... returning -EIO\n"); JOM(8, " ... failed returning -EIO\n");
peasycap->video_eof = 1; peasycap->video_eof = 1;
peasycap->audio_eof = 1; peasycap->audio_eof = 1;
kill_video_urbs(peasycap); kill_video_urbs(peasycap);
...@@ -1285,45 +1259,45 @@ while ((peasycap->field_read == peasycap->field_fill) || ...@@ -1285,45 +1259,45 @@ while ((peasycap->field_read == peasycap->field_fill) ||
JOM(8, "returning -EIO\n"); JOM(8, "returning -EIO\n");
return -EIO; return -EIO;
} }
miss++; miss++;
} }
JOM(8, "second awakening on wq_video after %i waits\n", miss); JOM(8, "second awakening on wq_video after %i waits\n", miss);
rc = field2frame(peasycap); rc = field2frame(peasycap);
if (rc) if (rc)
SAM("ERROR: field2frame() returned %i\n", rc); SAM("ERROR: field2frame() rc = %i\n", rc);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* WASTE THIS FRAME * WASTE THIS FRAME
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (0 != peasycap->skip) { if (0 != peasycap->skip) {
peasycap->skipped++; peasycap->skipped++;
if (peasycap->skip != peasycap->skipped) if (peasycap->skip != peasycap->skipped)
return peasycap->skip - peasycap->skipped; return peasycap->skip - peasycap->skipped;
peasycap->skipped = 0; peasycap->skipped = 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
peasycap->frame_read = peasycap->frame_fill; peasycap->frame_read = peasycap->frame_fill;
peasycap->queued[peasycap->frame_read] = 0; peasycap->queued[peasycap->frame_read] = 0;
peasycap->done[peasycap->frame_read] = V4L2_BUF_FLAG_DONE; peasycap->done[peasycap->frame_read] = V4L2_BUF_FLAG_DONE;
(peasycap->frame_fill)++; peasycap->frame_fill++;
if (peasycap->frame_buffer_many <= peasycap->frame_fill) if (peasycap->frame_buffer_many <= peasycap->frame_fill)
peasycap->frame_fill = 0; peasycap->frame_fill = 0;
if (0x01 & easycap_standard[peasycap->standard_offset].mask) { if (0x01 & easycap_standard[peasycap->standard_offset].mask)
peasycap->frame_buffer[peasycap->frame_read][0].kount = peasycap->frame_buffer[peasycap->frame_read][0].kount =
V4L2_FIELD_TOP; V4L2_FIELD_TOP;
} else { else
peasycap->frame_buffer[peasycap->frame_read][0].kount = peasycap->frame_buffer[peasycap->frame_read][0].kount =
V4L2_FIELD_BOTTOM; V4L2_FIELD_BOTTOM;
}
JOM(8, "setting: %i=peasycap->frame_read\n", peasycap->frame_read);
JOM(8, "bumped to: %i=peasycap->frame_fill\n", peasycap->frame_fill);
return 0; JOM(8, "setting: %i=peasycap->frame_read\n", peasycap->frame_read);
JOM(8, "bumped to: %i=peasycap->frame_fill\n", peasycap->frame_fill);
return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
...@@ -1341,33 +1315,34 @@ return 0; ...@@ -1341,33 +1315,34 @@ return 0;
int int
field2frame(struct easycap *peasycap) field2frame(struct easycap *peasycap)
{ {
struct timeval timeval; struct timeval timeval;
long long int above, below; long long int above, below;
u32 remainder; u32 remainder;
struct signed_div_result sdr; struct signed_div_result sdr;
void *pex, *pad; void *pex, *pad;
int kex, kad, mex, mad, rex, rad, rad2; int kex, kad, mex, mad, rex, rad, rad2;
int c2, c3, w2, w3, cz, wz; int c2, c3, w2, w3, cz, wz;
int rc, bytesperpixel, multiplier, much, more, over, rump, caches, input; int rc, bytesperpixel, multiplier;
u8 mask, margin; int much, more, over, rump, caches, input;
bool odd, isuy, decimatepixel, offerfields, badinput; u8 mask, margin;
bool odd, isuy, decimatepixel, offerfields, badinput;
if (NULL == peasycap) {
if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return -EFAULT; return -EFAULT;
} }
badinput = false; badinput = false;
input = 0x07 & peasycap->field_buffer[peasycap->field_read][0].input; input = 0x07 & peasycap->field_buffer[peasycap->field_read][0].input;
JOM(8, "===== parity %i, input 0x%02X, field buffer %i --> " JOM(8, "===== parity %i, input 0x%02X, field buffer %i --> "
"frame buffer %i\n", "frame buffer %i\n",
peasycap->field_buffer[peasycap->field_read][0].kount, peasycap->field_buffer[peasycap->field_read][0].kount,
peasycap->field_buffer[peasycap->field_read][0].input, peasycap->field_buffer[peasycap->field_read][0].input,
peasycap->field_read, peasycap->frame_fill); peasycap->field_read, peasycap->frame_fill);
JOM(8, "===== %i=bytesperpixel\n", peasycap->bytesperpixel); JOM(8, "===== %i=bytesperpixel\n", peasycap->bytesperpixel);
if (true == peasycap->offerfields) if (true == peasycap->offerfields)
JOM(8, "===== offerfields\n"); JOM(8, "===== offerfields\n");
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
...@@ -1375,76 +1350,68 @@ if (true == peasycap->offerfields) ...@@ -1375,76 +1350,68 @@ if (true == peasycap->offerfields)
* REJECT OR CLEAN BAD FIELDS * REJECT OR CLEAN BAD FIELDS
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (peasycap->field_read == peasycap->field_fill) { if (peasycap->field_read == peasycap->field_fill) {
SAM("ERROR: on entry, still filling field buffer %i\n", SAM("ERROR: on entry, still filling field buffer %i\n",
peasycap->field_read); peasycap->field_read);
return 0; return 0;
} }
#ifdef EASYCAP_TESTCARD #ifdef EASYCAP_TESTCARD
easycap_testcard(peasycap, peasycap->field_read); easycap_testcard(peasycap, peasycap->field_read);
#else #else
if (0 <= input && INPUT_MANY > input) { if (0 <= input && INPUT_MANY > input) {
if (easycap_bars && VIDEO_LOST_TOLERATE <= peasycap->lost[input]) if (easycap_bars && VIDEO_LOST_TOLERATE <= peasycap->lost[input])
easycap_testcard(peasycap, peasycap->field_read); easycap_testcard(peasycap, peasycap->field_read);
} }
#endif /*EASYCAP_TESTCARD*/ #endif /*EASYCAP_TESTCARD*/
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
offerfields = peasycap->offerfields; offerfields = peasycap->offerfields;
bytesperpixel = peasycap->bytesperpixel; bytesperpixel = peasycap->bytesperpixel;
decimatepixel = peasycap->decimatepixel; decimatepixel = peasycap->decimatepixel;
if ((2 != bytesperpixel) && if ((2 != bytesperpixel) &&
(3 != bytesperpixel) && (3 != bytesperpixel) &&
(4 != bytesperpixel)) { (4 != bytesperpixel)) {
SAM("MISTAKE: %i=bytesperpixel\n", bytesperpixel); SAM("MISTAKE: %i=bytesperpixel\n", bytesperpixel);
return -EFAULT; return -EFAULT;
} }
if (true == decimatepixel) if (true == decimatepixel)
multiplier = 2; multiplier = 2;
else else
multiplier = 1; multiplier = 1;
w2 = 2 * multiplier * (peasycap->width); w2 = 2 * multiplier * (peasycap->width);
w3 = bytesperpixel * w3 = bytesperpixel * multiplier * (peasycap->width);
multiplier * wz = multiplier * (peasycap->height) *
(peasycap->width); multiplier * (peasycap->width);
wz = multiplier *
(peasycap->height) * kex = peasycap->field_read; mex = 0;
multiplier * kad = peasycap->frame_fill; mad = 0;
(peasycap->width);
pex = peasycap->field_buffer[kex][0].pgo; rex = PAGE_SIZE;
kex = peasycap->field_read; mex = 0; pad = peasycap->frame_buffer[kad][0].pgo; rad = PAGE_SIZE;
kad = peasycap->frame_fill; mad = 0; odd = !!(peasycap->field_buffer[kex][0].kount);
pex = peasycap->field_buffer[kex][0].pgo; rex = PAGE_SIZE; if ((true == odd) && (false == decimatepixel)) {
pad = peasycap->frame_buffer[kad][0].pgo; rad = PAGE_SIZE; JOM(8, "initial skipping %4i bytes p.%4i\n",
if (peasycap->field_buffer[kex][0].kount)
odd = true;
else
odd = false;
if ((true == odd) && (false == decimatepixel)) {
JOM(8, " initial skipping %4i bytes p.%4i\n",
w3/multiplier, mad); w3/multiplier, mad);
pad += (w3 / multiplier); rad -= (w3 / multiplier); pad += (w3 / multiplier); rad -= (w3 / multiplier);
} }
isuy = true; isuy = true;
mask = 0; rump = 0; caches = 0; mask = 0; rump = 0; caches = 0;
cz = 0; cz = 0;
while (cz < wz) { while (cz < wz) {
/*-------------------------------------------------------------------*/
/* /*
** PROCESS ONE LINE OF FRAME AT FULL RESOLUTION: * PROCESS ONE LINE OF FRAME AT FULL RESOLUTION:
** READ w2 BYTES FROM FIELD BUFFER, * READ w2 BYTES FROM FIELD BUFFER,
** WRITE w3 BYTES TO FRAME BUFFER * WRITE w3 BYTES TO FRAME BUFFER
**/ */
/*-------------------------------------------------------------------*/
if (false == decimatepixel) { if (false == decimatepixel) {
over = w2; over = w2;
do { do {
much = over; more = 0; margin = 0; mask = 0x00; much = over; more = 0;
margin = 0; mask = 0x00;
if (rex < much) if (rex < much)
much = rex; much = rex;
rump = 0; rump = 0;
...@@ -1460,10 +1427,10 @@ while (cz < wz) { ...@@ -1460,10 +1427,10 @@ while (cz < wz) {
if (1 < bytesperpixel) { if (1 < bytesperpixel) {
if (rad * 2 < much * bytesperpixel) { if (rad * 2 < much * bytesperpixel) {
/* /*
** INJUDICIOUS ALTERATION OF THIS * INJUDICIOUS ALTERATION OF
** STATEMENT BLOCK WILL CAUSE * THIS STATEMENT BLOCK WILL
** BREAKAGE. BEWARE. * CAUSE BREAKAGE. BEWARE.
**/ */
rad2 = rad + bytesperpixel - 1; rad2 = rad + bytesperpixel - 1;
much = ((((2 * much = ((((2 *
rad2)/bytesperpixel)/2) * 2); rad2)/bytesperpixel)/2) * 2);
...@@ -1483,13 +1450,11 @@ while (cz < wz) { ...@@ -1483,13 +1450,11 @@ while (cz < wz) {
} else } else
mask |= 0x08; mask |= 0x08;
} }
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
} else { } else {
SAM("MISTAKE: %i=bytesperpixel\n", SAM("MISTAKE: %i=bytesperpixel\n",
bytesperpixel); bytesperpixel);
return -EFAULT; return -EFAULT;
} }
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if (rump) if (rump)
caches++; caches++;
if (true == badinput) { if (true == badinput) {
...@@ -1578,16 +1543,16 @@ while (cz < wz) { ...@@ -1578,16 +1543,16 @@ while (cz < wz) {
return -EFAULT; return -EFAULT;
} }
more = (bytesperpixel * more = (bytesperpixel * much) / 4;
much) / 4;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
if (1 < bytesperpixel) { if (1 < bytesperpixel) {
if (rad * 4 < much * bytesperpixel) { if (rad * 4 < much * bytesperpixel) {
/* /*
** INJUDICIOUS ALTERATION OF THIS * INJUDICIOUS ALTERATION OF
** STATEMENT BLOCK WILL CAUSE * THIS STATEMENT BLOCK
** BREAKAGE. BEWARE. * WILL CAUSE BREAKAGE.
**/ * BEWARE.
*/
rad2 = rad + bytesperpixel - 1; rad2 = rad + bytesperpixel - 1;
much = ((((2 * rad2)/bytesperpixel)/2) much = ((((2 * rad2)/bytesperpixel)/2)
* 4); * 4);
...@@ -1604,8 +1569,7 @@ while (cz < wz) { ...@@ -1604,8 +1569,7 @@ while (cz < wz) {
margin = *((u8 *)(peasycap-> margin = *((u8 *)(peasycap->
field_buffer field_buffer
[kex][mex + 1].pgo)); [kex][mex + 1].pgo));
} } else
else
mask |= 0x08; mask |= 0x08;
} }
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
...@@ -1687,46 +1651,43 @@ while (cz < wz) { ...@@ -1687,46 +1651,43 @@ while (cz < wz) {
rex -= much; rex -= much;
} while (over); } while (over);
} }
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* SANITY CHECKS * SANITY CHECKS
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
c2 = (mex + 1)*PAGE_SIZE - rex; c2 = (mex + 1)*PAGE_SIZE - rex;
if (cz != c2) if (cz != c2)
SAM("ERROR: discrepancy %i in bytes read\n", c2 - cz); SAM("ERROR: discrepancy %i in bytes read\n", c2 - cz);
c3 = (mad + 1)*PAGE_SIZE - rad; c3 = (mad + 1)*PAGE_SIZE - rad;
if (false == decimatepixel) { if (false == decimatepixel) {
if (bytesperpixel * if (bytesperpixel * cz != c3)
cz != c3)
SAM("ERROR: discrepancy %i in bytes written\n", SAM("ERROR: discrepancy %i in bytes written\n",
c3 - (bytesperpixel * c3 - (bytesperpixel * cz));
cz)); } else {
} else {
if (false == odd) { if (false == odd) {
if (bytesperpixel * if (bytesperpixel *
cz != (4 * c3)) cz != (4 * c3))
SAM("ERROR: discrepancy %i in bytes written\n", SAM("ERROR: discrepancy %i in bytes written\n",
(2*c3)-(bytesperpixel * (2*c3)-(bytesperpixel * cz));
cz));
} else { } else {
if (0 != c3) if (0 != c3)
SAM("ERROR: discrepancy %i " SAM("ERROR: discrepancy %i "
"in bytes written\n", c3); "in bytes written\n", c3);
} }
} }
if (rump) if (rump)
SAM("WORRY: undischarged cache at end of line in frame buffer\n"); SAM("WORRY: undischarged cache at end of line in frame buffer\n");
JOM(8, "===== field2frame(): %i bytes --> %i bytes (incl skip)\n", c2, c3); JOM(8, "===== field2frame(): %i bytes --> %i bytes (incl skip)\n", c2, c3);
JOM(8, "===== field2frame(): %i=mad %i=rad\n", mad, rad); JOM(8, "===== field2frame(): %i=mad %i=rad\n", mad, rad);
if (true == odd) if (true == odd)
JOM(8, "+++++ field2frame(): frame buffer %i is full\n", kad); JOM(8, "+++++ field2frame(): frame buffer %i is full\n", kad);
if (peasycap->field_read == peasycap->field_fill) if (peasycap->field_read == peasycap->field_fill)
SAM("WARNING: on exit, filling field buffer %i\n", SAM("WARNING: on exit, filling field buffer %i\n",
peasycap->field_read); peasycap->field_read);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
...@@ -1734,8 +1695,8 @@ if (peasycap->field_read == peasycap->field_fill) ...@@ -1734,8 +1695,8 @@ if (peasycap->field_read == peasycap->field_fill)
* CALCULATE VIDEO STREAMING RATE * CALCULATE VIDEO STREAMING RATE
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
do_gettimeofday(&timeval); do_gettimeofday(&timeval);
if (peasycap->timeval6.tv_sec) { if (peasycap->timeval6.tv_sec) {
below = ((long long int)(1000000)) * below = ((long long int)(1000000)) *
((long long int)(timeval.tv_sec - ((long long int)(timeval.tv_sec -
peasycap->timeval6.tv_sec)) + peasycap->timeval6.tv_sec)) +
...@@ -1746,33 +1707,33 @@ if (peasycap->timeval6.tv_sec) { ...@@ -1746,33 +1707,33 @@ if (peasycap->timeval6.tv_sec) {
above = sdr.quotient; above = sdr.quotient;
remainder = (u32)sdr.remainder; remainder = (u32)sdr.remainder;
JOM(8, "video streaming at %3lli.%03i fields per second\n", above, JOM(8, "video streaming at %3lli.%03i fields per second\n",
(remainder/1000)); above, (remainder/1000));
} }
peasycap->timeval6 = timeval; peasycap->timeval6 = timeval;
if (caches) if (caches)
JOM(8, "%i=caches\n", caches); JOM(8, "%i=caches\n", caches);
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
struct signed_div_result struct signed_div_result
signed_div(long long int above, long long int below) signed_div(long long int above, long long int below)
{ {
struct signed_div_result sdr; struct signed_div_result sdr;
if (((0 <= above) && (0 <= below)) || ((0 > above) && (0 > below))) { if (((0 <= above) && (0 <= below)) || ((0 > above) && (0 > below))) {
sdr.remainder = (unsigned long long int) do_div(above, below); sdr.remainder = (unsigned long long int) do_div(above, below);
sdr.quotient = (long long int) above; sdr.quotient = (long long int) above;
} else { } else {
if (0 > above) if (0 > above)
above = -above; above = -above;
if (0 > below) if (0 > below)
below = -below; below = -below;
sdr.remainder = (unsigned long long int) do_div(above, below); sdr.remainder = (unsigned long long int) do_div(above, below);
sdr.quotient = -((long long int) above); sdr.quotient = -((long long int) above);
} }
return sdr; return sdr;
} }
/*****************************************************************************/ /*****************************************************************************/
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
...@@ -1804,24 +1765,24 @@ int ...@@ -1804,24 +1765,24 @@ int
redaub(struct easycap *peasycap, void *pad, void *pex, int much, int more, redaub(struct easycap *peasycap, void *pad, void *pex, int much, int more,
u8 mask, u8 margin, bool isuy) u8 mask, u8 margin, bool isuy)
{ {
static s32 ay[256], bu[256], rv[256], gu[256], gv[256]; static s32 ay[256], bu[256], rv[256], gu[256], gv[256];
u8 *pcache; u8 *pcache;
u8 r, g, b, y, u, v, c, *p2, *p3, *pz, *pr; u8 r, g, b, y, u, v, c, *p2, *p3, *pz, *pr;
int bytesperpixel; int bytesperpixel;
bool byteswaporder, decimatepixel, last; bool byteswaporder, decimatepixel, last;
int j, rump; int j, rump;
s32 tmp; s32 tmp;
if (much % 2) { if (much % 2) {
SAM("MISTAKE: much is odd\n"); SAM("MISTAKE: much is odd\n");
return -EFAULT; return -EFAULT;
} }
bytesperpixel = peasycap->bytesperpixel; bytesperpixel = peasycap->bytesperpixel;
byteswaporder = peasycap->byteswaporder; byteswaporder = peasycap->byteswaporder;
decimatepixel = peasycap->decimatepixel; decimatepixel = peasycap->decimatepixel;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (!bu[255]) { if (!bu[255]) {
for (j = 0; j < 112; j++) { for (j = 0; j < 112; j++) {
tmp = (0xFF00 & (453 * j)) >> 8; tmp = (0xFF00 & (453 * j)) >> 8;
bu[j + 128] = tmp; bu[127 - j] = -tmp; bu[j + 128] = tmp; bu[127 - j] = -tmp;
...@@ -1847,64 +1808,56 @@ if (!bu[255]) { ...@@ -1847,64 +1808,56 @@ if (!bu[255]) {
for (j = 236; j < 256; j++) for (j = 236; j < 256; j++)
ay[j] = ay[235]; ay[j] = ay[235];
JOM(8, "lookup tables are prepared\n"); JOM(8, "lookup tables are prepared\n");
} }
pcache = peasycap->pcache; pcache = peasycap->pcache;
if (NULL == pcache) if (NULL == pcache)
pcache = &peasycap->cache[0]; pcache = &peasycap->cache[0];
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* TRANSFER CONTENTS OF CACHE TO THE FRAME BUFFER * TRANSFER CONTENTS OF CACHE TO THE FRAME BUFFER
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (!pcache) { if (!pcache) {
SAM("MISTAKE: pcache is NULL\n"); SAM("MISTAKE: pcache is NULL\n");
return -EFAULT; return -EFAULT;
} }
if (pcache != &peasycap->cache[0]) if (pcache != &peasycap->cache[0])
JOM(16, "cache has %i bytes\n", (int)(pcache - &peasycap->cache[0])); JOM(16, "cache has %i bytes\n", (int)(pcache - &peasycap->cache[0]));
p2 = &peasycap->cache[0]; p2 = &peasycap->cache[0];
p3 = (u8 *)pad - (int)(pcache - &peasycap->cache[0]); p3 = (u8 *)pad - (int)(pcache - &peasycap->cache[0]);
while (p2 < pcache) { while (p2 < pcache) {
*p3++ = *p2; p2++; *p3++ = *p2; p2++;
} }
pcache = &peasycap->cache[0]; pcache = &peasycap->cache[0];
if (p3 != pad) { if (p3 != pad) {
SAM("MISTAKE: pointer misalignment\n"); SAM("MISTAKE: pointer misalignment\n");
return -EFAULT; return -EFAULT;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
rump = (int)(0x03 & mask); rump = (int)(0x03 & mask);
u = 0; v = 0; u = 0; v = 0;
p2 = (u8 *)pex; pz = p2 + much; pr = p3 + more; last = false; p2 = (u8 *)pex; pz = p2 + much; pr = p3 + more; last = false;
p2++; p2++;
if (true == isuy) if (true == isuy)
u = *(p2 - 1); u = *(p2 - 1);
else else
v = *(p2 - 1); v = *(p2 - 1);
if (rump) if (rump)
JOM(16, "%4i=much %4i=more %i=rump\n", much, more, rump); JOM(16, "%4i=much %4i=more %i=rump\n", much, more, rump);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
switch (bytesperpixel) { switch (bytesperpixel) {
case 2: { case 2: {
if (false == decimatepixel) { if (false == decimatepixel) {
memcpy(pad, pex, (size_t)much); memcpy(pad, pex, (size_t)much);
if (false == byteswaporder) if (false == byteswaporder) {
/*---------------------------------------------------*/ /* UYVY */
/*
** UYVY
*/
/*---------------------------------------------------*/
return 0; return 0;
else { } else {
/*---------------------------------------------------*/ /* YUYV */
/*
** YUYV
*/
/*---------------------------------------------------*/
p3 = (u8 *)pad; pz = p3 + much; p3 = (u8 *)pad; pz = p3 + much;
while (pz > p3) { while (pz > p3) {
c = *p3; c = *p3;
...@@ -1916,11 +1869,7 @@ case 2: { ...@@ -1916,11 +1869,7 @@ case 2: {
} }
} else { } else {
if (false == byteswaporder) { if (false == byteswaporder) {
/*---------------------------------------------------*/ /* UYVY DECIMATED */
/*
** UYVY DECIMATED
*/
/*---------------------------------------------------*/
p2 = (u8 *)pex; p3 = (u8 *)pad; pz = p2 + much; p2 = (u8 *)pex; p3 = (u8 *)pad; pz = p2 + much;
while (pz > p2) { while (pz > p2) {
*p3 = *p2; *p3 = *p2;
...@@ -1931,11 +1880,7 @@ case 2: { ...@@ -1931,11 +1880,7 @@ case 2: {
} }
return 0; return 0;
} else { } else {
/*---------------------------------------------------*/ /* YUYV DECIMATED */
/*
** YUYV DECIMATED
**/
/*---------------------------------------------------*/
p2 = (u8 *)pex; p3 = (u8 *)pad; pz = p2 + much; p2 = (u8 *)pex; p3 = (u8 *)pad; pz = p2 + much;
while (pz > p2) { while (pz > p2) {
*p3 = *(p2 + 1); *p3 = *(p2 + 1);
...@@ -1949,15 +1894,11 @@ case 2: { ...@@ -1949,15 +1894,11 @@ case 2: {
} }
break; break;
} }
case 3: case 3:
{ {
if (false == decimatepixel) { if (false == decimatepixel) {
if (false == byteswaporder) { if (false == byteswaporder) {
/*---------------------------------------------------*/ /* RGB */
/*
** RGB
**/
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2025,11 +1966,7 @@ case 3: ...@@ -2025,11 +1966,7 @@ case 3:
} }
return 0; return 0;
} else { } else {
/*---------------------------------------------------*/ /* BGR */
/*
** BGR
*/
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2100,11 +2037,7 @@ case 3: ...@@ -2100,11 +2037,7 @@ case 3:
return 0; return 0;
} else { } else {
if (false == byteswaporder) { if (false == byteswaporder) {
/*---------------------------------------------------*/ /* RGB DECIMATED */
/*
** RGB DECIMATED
*/
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2175,11 +2108,7 @@ case 3: ...@@ -2175,11 +2108,7 @@ case 3:
} }
return 0; return 0;
} else { } else {
/*---------------------------------------------------*/ /* BGR DECIMATED */
/*
* BGR DECIMATED
*/
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2254,15 +2183,11 @@ case 3: ...@@ -2254,15 +2183,11 @@ case 3:
} }
break; break;
} }
case 4: case 4:
{ {
if (false == decimatepixel) { if (false == decimatepixel) {
if (false == byteswaporder) { if (false == byteswaporder) {
/*---------------------------------------------------*/ /* RGBA */
/*
** RGBA
*/
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2340,11 +2265,9 @@ case 4: ...@@ -2340,11 +2265,9 @@ case 4:
} }
return 0; return 0;
} else { } else {
/*---------------------------------------------------*/
/* /*
** BGRA * BGRA
*/ */
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2401,12 +2324,11 @@ case 4: ...@@ -2401,12 +2324,11 @@ case 4:
*pcache++ = 0; *pcache++ = 0;
break; break;
} }
default: { default:
SAM("MISTAKE: %i=rump\n", SAM("MISTAKE: %i=rump\n",
bytesperpixel - rump); bytesperpixel - rump);
return -EFAULT; return -EFAULT;
} }
}
} else { } else {
*p3 = b; *p3 = b;
*(p3 + 1) = g; *(p3 + 1) = g;
...@@ -2424,11 +2346,9 @@ case 4: ...@@ -2424,11 +2346,9 @@ case 4:
return 0; return 0;
} else { } else {
if (false == byteswaporder) { if (false == byteswaporder) {
/*---------------------------------------------------*/
/* /*
** RGBA DECIMATED * RGBA DECIMATED
*/ */
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2510,11 +2430,9 @@ case 4: ...@@ -2510,11 +2430,9 @@ case 4:
} }
return 0; return 0;
} else { } else {
/*---------------------------------------------------*/
/* /*
** BGRA DECIMATED * BGRA DECIMATED
*/ */
/*---------------------------------------------------*/
while (pz > p2) { while (pz > p2) {
if (pr <= (p3 + bytesperpixel)) if (pr <= (p3 + bytesperpixel))
last = true; last = true;
...@@ -2597,115 +2515,113 @@ case 4: ...@@ -2597,115 +2515,113 @@ case 4:
} }
break; break;
} }
default: { default: {
SAM("MISTAKE: %i=bytesperpixel\n", bytesperpixel); SAM("MISTAKE: %i=bytesperpixel\n", bytesperpixel);
return -EFAULT; return -EFAULT;
} }
} }
return 0; return 0;
} }
/*****************************************************************************/ /*****************************************************************************/
/*---------------------------------------------------------------------------*/
/* /*
* SEE CORBET ET AL. "LINUX DEVICE DRIVERS", 3rd EDITION, PAGES 430-434 * SEE CORBET ET AL. "LINUX DEVICE DRIVERS", 3rd EDITION, PAGES 430-434
*/ */
/*---------------------------------------------------------------------------*/
/*****************************************************************************/ /*****************************************************************************/
static void easycap_vma_open(struct vm_area_struct *pvma) static void easycap_vma_open(struct vm_area_struct *pvma)
{ {
struct easycap *peasycap; struct easycap *peasycap;
peasycap = pvma->vm_private_data; peasycap = pvma->vm_private_data;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return; return;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return; return;
} }
peasycap->vma_many++; peasycap->vma_many++;
JOT(8, "%i=peasycap->vma_many\n", peasycap->vma_many); JOT(8, "%i=peasycap->vma_many\n", peasycap->vma_many);
return; return;
} }
/*****************************************************************************/ /*****************************************************************************/
static void easycap_vma_close(struct vm_area_struct *pvma) static void easycap_vma_close(struct vm_area_struct *pvma)
{ {
struct easycap *peasycap; struct easycap *peasycap;
peasycap = pvma->vm_private_data; peasycap = pvma->vm_private_data;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return; return;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return; return;
} }
peasycap->vma_many--; peasycap->vma_many--;
JOT(8, "%i=peasycap->vma_many\n", peasycap->vma_many); JOT(8, "%i=peasycap->vma_many\n", peasycap->vma_many);
return; return;
} }
/*****************************************************************************/ /*****************************************************************************/
static int easycap_vma_fault(struct vm_area_struct *pvma, struct vm_fault *pvmf) static int easycap_vma_fault(struct vm_area_struct *pvma, struct vm_fault *pvmf)
{ {
int k, m, retcode; int k, m, retcode;
void *pbuf; void *pbuf;
struct page *page; struct page *page;
struct easycap *peasycap; struct easycap *peasycap;
retcode = VM_FAULT_NOPAGE; retcode = VM_FAULT_NOPAGE;
if (NULL == pvma) { if (NULL == pvma) {
SAY("pvma is NULL\n"); SAY("pvma is NULL\n");
return retcode; return retcode;
} }
if (NULL == pvmf) { if (NULL == pvmf) {
SAY("pvmf is NULL\n"); SAY("pvmf is NULL\n");
return retcode; return retcode;
} }
k = (pvmf->pgoff) / (FRAME_BUFFER_SIZE/PAGE_SIZE); k = (pvmf->pgoff) / (FRAME_BUFFER_SIZE/PAGE_SIZE);
m = (pvmf->pgoff) % (FRAME_BUFFER_SIZE/PAGE_SIZE); m = (pvmf->pgoff) % (FRAME_BUFFER_SIZE/PAGE_SIZE);
if (!m) if (!m)
JOT(4, "%4i=k, %4i=m\n", k, m); JOT(4, "%4i=k, %4i=m\n", k, m);
else else
JOT(16, "%4i=k, %4i=m\n", k, m); JOT(16, "%4i=k, %4i=m\n", k, m);
if ((0 > k) || (FRAME_BUFFER_MANY <= k)) { if ((0 > k) || (FRAME_BUFFER_MANY <= k)) {
SAY("ERROR: buffer index %i out of range\n", k); SAY("ERROR: buffer index %i out of range\n", k);
return retcode; return retcode;
} }
if ((0 > m) || (FRAME_BUFFER_SIZE/PAGE_SIZE <= m)) { if ((0 > m) || (FRAME_BUFFER_SIZE/PAGE_SIZE <= m)) {
SAY("ERROR: page number %i out of range\n", m); SAY("ERROR: page number %i out of range\n", m);
return retcode; return retcode;
} }
peasycap = pvma->vm_private_data; peasycap = pvma->vm_private_data;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: peasycap is NULL\n"); SAY("ERROR: peasycap is NULL\n");
return retcode; return retcode;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
pbuf = peasycap->frame_buffer[k][m].pgo; pbuf = peasycap->frame_buffer[k][m].pgo;
if (NULL == pbuf) { if (NULL == pbuf) {
SAM("ERROR: pbuf is NULL\n"); SAM("ERROR: pbuf is NULL\n");
return retcode; return retcode;
} }
page = virt_to_page(pbuf); page = virt_to_page(pbuf);
if (NULL == page) { if (NULL == page) {
SAM("ERROR: page is NULL\n"); SAM("ERROR: page is NULL\n");
return retcode; return retcode;
} }
get_page(page); get_page(page);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (NULL == page) { if (NULL == page) {
SAM("ERROR: page is NULL after get_page(page)\n"); SAM("ERROR: page is NULL after get_page(page)\n");
} else { } else {
pvmf->page = page; pvmf->page = page;
retcode = VM_FAULT_MINOR; retcode = VM_FAULT_MINOR;
} }
return retcode; return retcode;
} }
static const struct vm_operations_struct easycap_vm_ops = { static const struct vm_operations_struct easycap_vm_ops = {
...@@ -2754,44 +2670,43 @@ static int easycap_mmap(struct file *file, struct vm_area_struct *pvma) ...@@ -2754,44 +2670,43 @@ static int easycap_mmap(struct file *file, struct vm_area_struct *pvma)
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void easycap_complete(struct urb *purb) static void easycap_complete(struct urb *purb)
{ {
struct easycap *peasycap; struct easycap *peasycap;
struct data_buffer *pfield_buffer; struct data_buffer *pfield_buffer;
char errbuf[16]; char errbuf[16];
int i, more, much, leap, rc, last; int i, more, much, leap, rc, last;
int videofieldamount; int videofieldamount;
unsigned int override, bad; unsigned int override, bad;
int framestatus, framelength, frameactual, frameoffset; int framestatus, framelength, frameactual, frameoffset;
u8 *pu; u8 *pu;
if (NULL == purb) { if (NULL == purb) {
SAY("ERROR: easycap_complete(): purb is NULL\n"); SAY("ERROR: easycap_complete(): purb is NULL\n");
return; return;
} }
peasycap = purb->context; peasycap = purb->context;
if (NULL == peasycap) { if (NULL == peasycap) {
SAY("ERROR: easycap_complete(): peasycap is NULL\n"); SAY("ERROR: easycap_complete(): peasycap is NULL\n");
return; return;
} }
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
SAY("ERROR: bad peasycap: %p\n", peasycap); SAY("ERROR: bad peasycap: %p\n", peasycap);
return; return;
} }
if (peasycap->video_eof) if (peasycap->video_eof)
return; return;
for (i = 0; i < VIDEO_ISOC_BUFFER_MANY; i++) for (i = 0; i < VIDEO_ISOC_BUFFER_MANY; i++)
if (purb->transfer_buffer == peasycap->video_isoc_buffer[i].pgo) if (purb->transfer_buffer == peasycap->video_isoc_buffer[i].pgo)
break; break;
JOM(16, "%2i=urb\n", i); JOM(16, "%2i=urb\n", i);
last = peasycap->video_isoc_sequence; last = peasycap->video_isoc_sequence;
if ((((VIDEO_ISOC_BUFFER_MANY - 1) == last) && if ((((VIDEO_ISOC_BUFFER_MANY - 1) == last) && (0 != i)) ||
(0 != i)) || (((VIDEO_ISOC_BUFFER_MANY - 1) != last) && ((last + 1) != i))) {
(((VIDEO_ISOC_BUFFER_MANY - 1) != last) && JOM(16, "ERROR: out-of-order urbs %i,%i ... continuing\n",
((last + 1) != i))) { last, i);
JOM(16, "ERROR: out-of-order urbs %i,%i ... continuing\n", last, i); }
} peasycap->video_isoc_sequence = i;
peasycap->video_isoc_sequence = i;
if (peasycap->video_idle) { if (peasycap->video_idle) {
JOM(16, "%i=video_idle %i=video_isoc_streaming\n", JOM(16, "%i=video_idle %i=video_isoc_streaming\n",
peasycap->video_idle, peasycap->video_isoc_streaming); peasycap->video_idle, peasycap->video_isoc_streaming);
if (peasycap->video_isoc_streaming) { if (peasycap->video_isoc_streaming) {
...@@ -2805,15 +2720,15 @@ if (peasycap->video_idle) { ...@@ -2805,15 +2720,15 @@ if (peasycap->video_idle) {
peasycap->video_idle); peasycap->video_idle);
} }
} }
return; return;
} }
override = 0; override = 0;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (FIELD_BUFFER_MANY <= peasycap->field_fill) { if (FIELD_BUFFER_MANY <= peasycap->field_fill) {
SAM("ERROR: bad peasycap->field_fill\n"); SAM("ERROR: bad peasycap->field_fill\n");
return; return;
} }
if (purb->status) { if (purb->status) {
if ((-ESHUTDOWN == purb->status) || (-ENOENT == purb->status)) { if ((-ESHUTDOWN == purb->status) || (-ENOENT == purb->status)) {
JOM(8, "urb status -ESHUTDOWN or -ENOENT\n"); JOM(8, "urb status -ESHUTDOWN or -ENOENT\n");
return; return;
...@@ -2823,7 +2738,7 @@ if (purb->status) { ...@@ -2823,7 +2738,7 @@ if (purb->status) {
SAM("ERROR: bad urb status -%s: %d\n", SAM("ERROR: bad urb status -%s: %d\n",
strerror(purb->status), purb->status); strerror(purb->status), purb->status);
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
} else { } else {
for (i = 0; i < purb->number_of_packets; i++) { for (i = 0; i < purb->number_of_packets; i++) {
if (0 != purb->iso_frame_desc[i].status) { if (0 != purb->iso_frame_desc[i].status) {
(peasycap->field_buffer (peasycap->field_buffer
...@@ -3026,8 +2941,7 @@ if (purb->status) { ...@@ -3026,8 +2941,7 @@ if (purb->status) {
SAM("ERROR: bad peasycap->field_fill\n"); SAM("ERROR: bad peasycap->field_fill\n");
return; return;
} }
if (FIELD_BUFFER_SIZE/PAGE_SIZE <= if (FIELD_BUFFER_SIZE/PAGE_SIZE <= peasycap->field_page) {
peasycap->field_page) {
SAM("ERROR: bad peasycap->field_page\n"); SAM("ERROR: bad peasycap->field_page\n");
return; return;
} }
...@@ -3055,8 +2969,7 @@ if (purb->status) { ...@@ -3055,8 +2969,7 @@ if (purb->status) {
field_buffer field_buffer
[peasycap->field_fill] [peasycap->field_fill]
[peasycap->field_page]; [peasycap->field_page];
pfield_buffer->pto = pfield_buffer->pto = pfield_buffer->pgo;
pfield_buffer->pgo;
pfield_buffer->input = 0x08 | pfield_buffer->input = 0x08 |
(0x07 & peasycap->input); (0x07 & peasycap->input);
if ((peasycap->field_buffer[peasycap-> if ((peasycap->field_buffer[peasycap->
...@@ -3068,7 +2981,8 @@ if (purb->status) { ...@@ -3068,7 +2981,8 @@ if (purb->status) {
[0]).kount |= 0x1000; [0]).kount |= 0x1000;
} }
much = PAGE_SIZE - (int)(pfield_buffer->pto - much = PAGE_SIZE -
(int)(pfield_buffer->pto -
pfield_buffer->pgo); pfield_buffer->pgo);
if (much > more) if (much > more)
...@@ -3081,7 +2995,7 @@ if (purb->status) { ...@@ -3081,7 +2995,7 @@ if (purb->status) {
} }
} }
} }
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* RESUBMIT THIS URB, UNLESS A SEVERE PERSISTENT ERROR CONDITION EXISTS. * RESUBMIT THIS URB, UNLESS A SEVERE PERSISTENT ERROR CONDITION EXISTS.
...@@ -3090,7 +3004,7 @@ if (purb->status) { ...@@ -3090,7 +3004,7 @@ if (purb->status) {
* THE USERSPACE PROGRAM, E.G. mplayer, MAY HANG ON EXIT. BEWARE. * THE USERSPACE PROGRAM, E.G. mplayer, MAY HANG ON EXIT. BEWARE.
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (VIDEO_ISOC_BUFFER_MANY <= peasycap->video_junk) { if (VIDEO_ISOC_BUFFER_MANY <= peasycap->video_junk) {
SAM("easycap driver shutting down on condition green\n"); SAM("easycap driver shutting down on condition green\n");
peasycap->status = 1; peasycap->status = 1;
peasycap->video_eof = 1; peasycap->video_eof = 1;
...@@ -3101,8 +3015,8 @@ if (VIDEO_ISOC_BUFFER_MANY <= peasycap->video_junk) { ...@@ -3101,8 +3015,8 @@ if (VIDEO_ISOC_BUFFER_MANY <= peasycap->video_junk) {
wake_up_interruptible(&peasycap->wq_audio); wake_up_interruptible(&peasycap->wq_audio);
#endif /*PERSEVERE*/ #endif /*PERSEVERE*/
return; return;
} }
if (peasycap->video_isoc_streaming) { if (peasycap->video_isoc_streaming) {
rc = usb_submit_urb(purb, GFP_ATOMIC); rc = usb_submit_urb(purb, GFP_ATOMIC);
if (rc) { if (rc) {
SAM("%s: %d\n", strerror(rc), rc); SAM("%s: %d\n", strerror(rc), rc);
...@@ -3112,8 +3026,8 @@ if (peasycap->video_isoc_streaming) { ...@@ -3112,8 +3026,8 @@ if (peasycap->video_isoc_streaming) {
"failed with rc:\n", "failed with rc:\n",
peasycap->video_idle); peasycap->video_idle);
} }
} }
return; return;
} }
static const struct file_operations easycap_fops = { static const struct file_operations easycap_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -3339,7 +3253,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface, ...@@ -3339,7 +3253,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface,
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
rc = fillin_formats(); rc = fillin_formats();
if (0 > rc) { if (0 > rc) {
SAM("ERROR: fillin_formats() returned %i\n", rc); SAM("ERROR: fillin_formats() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
JOM(4, "%i formats available\n", rc); JOM(4, "%i formats available\n", rc);
...@@ -3443,8 +3357,8 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface, ...@@ -3443,8 +3357,8 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface,
if (pusb_device == easycapdc60_dongle[ndong].peasycap-> if (pusb_device == easycapdc60_dongle[ndong].peasycap->
pusb_device) { pusb_device) {
peasycap = easycapdc60_dongle[ndong].peasycap; peasycap = easycapdc60_dongle[ndong].peasycap;
JOT(8, "intf[%i]: easycapdc60_dongle[%i].peasycap-->" JOT(8, "intf[%i]: dongle[%i].peasycap\n",
"peasycap\n", bInterfaceNumber, ndong); bInterfaceNumber, ndong);
break; break;
} }
} }
...@@ -4024,7 +3938,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface, ...@@ -4024,7 +3938,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface,
easycap_ntsc ? "NTSC" : "PAL"); easycap_ntsc ? "NTSC" : "PAL");
rc = reset(peasycap); rc = reset(peasycap);
if (rc) { if (rc) {
SAM("ERROR: reset() returned %i\n", rc); SAM("ERROR: reset() rc = %i\n", rc);
return -EFAULT; return -EFAULT;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
...@@ -4109,7 +4023,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface, ...@@ -4109,7 +4023,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface,
pusb_interface_descriptor->bInterfaceNumber); pusb_interface_descriptor->bInterfaceNumber);
break; break;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
case 2: { case 2: {
if (!peasycap) { if (!peasycap) {
SAM("MISTAKE: peasycap is NULL\n"); SAM("MISTAKE: peasycap is NULL\n");
...@@ -4376,7 +4290,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface, ...@@ -4376,7 +4290,7 @@ static int easycap_usb_probe(struct usb_interface *pusb_interface,
rc = easycap_alsa_probe(peasycap); rc = easycap_alsa_probe(peasycap);
if (rc) { if (rc) {
err("easycap_alsa_probe() returned %i\n", rc); err("easycap_alsa_probe() rc = %i\n", rc);
return -ENODEV; return -ENODEV;
} else { } else {
JOM(8, "kref_get() with %i=kref.refcount.counter\n", JOM(8, "kref_get() with %i=kref.refcount.counter\n",
...@@ -4539,10 +4453,9 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface) ...@@ -4539,10 +4453,9 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface)
} }
break; break;
} }
/*---------------------------------------------------------------------------*/
default: default:
break; break;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/* /*
* DEREGISTER * DEREGISTER
...@@ -4552,31 +4465,31 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface) ...@@ -4552,31 +4465,31 @@ static void easycap_usb_disconnect(struct usb_interface *pusb_interface)
* AN EasyCAP IS UNPLUGGED WHILE THE URBS ARE RUNNING. BEWARE. * AN EasyCAP IS UNPLUGGED WHILE THE URBS ARE RUNNING. BEWARE.
*/ */
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
kd = isdongle(peasycap); kd = isdongle(peasycap);
switch (bInterfaceNumber) { switch (bInterfaceNumber) {
case 0: { case 0: {
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
wake_up_interruptible(&peasycap->wq_video); wake_up_interruptible(&peasycap->wq_video);
JOM(4, "about to lock easycapdc60_dongle[%i].mutex_video\n", JOM(4, "about to lock dongle[%i].mutex_video\n", kd);
kd);
if (mutex_lock_interruptible(&easycapdc60_dongle[kd]. if (mutex_lock_interruptible(&easycapdc60_dongle[kd].
mutex_video)) { mutex_video)) {
SAY("ERROR: cannot lock easycapdc60_dongle[%i]." SAY("ERROR: "
"mutex_video\n", kd); "cannot lock dongle[%i].mutex_video\n", kd);
return; return;
} }
JOM(4, "locked easycapdc60_dongle[%i].mutex_video\n", kd); JOM(4, "locked dongle[%i].mutex_video\n", kd);
} else } else {
SAY("ERROR: %i=kd is bad: cannot lock dongle\n", kd); SAY("ERROR: %i=kd is bad: cannot lock dongle\n", kd);
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#ifndef EASYCAP_IS_VIDEODEV_CLIENT #ifndef EASYCAP_IS_VIDEODEV_CLIENT
if (NULL == peasycap) { if (NULL == peasycap) {
SAM("ERROR: peasycap has become NULL\n"); SAM("ERROR: peasycap has become NULL\n");
} else { } else {
usb_deregister_dev(pusb_interface, &easycap_class); usb_deregister_dev(pusb_interface, &easycap_class);
(peasycap->registered_video)--; peasycap->registered_video--;
JOM(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber); JOM(4, "intf[%i]: usb_deregister_dev() minor = %i\n",
SAM("easycap detached from minor #%d\n", minor); bInterfaceNumber, minor);
} }
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
#else #else
...@@ -4592,105 +4505,96 @@ case 0: { ...@@ -4592,105 +4505,96 @@ case 0: {
JOM(4, "v4l2_device_unregister() OK\n"); JOM(4, "v4l2_device_unregister() OK\n");
video_unregister_device(&peasycap->video_device); video_unregister_device(&peasycap->video_device);
JOM(4, "intf[%i]: video_unregister_device() OK\n", bInterfaceNumber); JOM(4, "intf[%i]: video_unregister_device() minor=%i\n",
(peasycap->registered_video)--; bInterfaceNumber, minor);
JOM(4, "unregistered with videodev: %i=minor\n", minor); peasycap->registered_video--;
#endif /*EASYCAP_IS_VIDEODEV_CLIENT*/ #endif /*EASYCAP_IS_VIDEODEV_CLIENT*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
mutex_unlock(&easycapdc60_dongle[kd].mutex_video); mutex_unlock(&easycapdc60_dongle[kd].mutex_video);
JOM(4, "unlocked easycapdc60_dongle[%i].mutex_video\n", kd); JOM(4, "unlocked dongle[%i].mutex_video\n", kd);
} }
break; break;
} }
case 2: { case 2: {
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
wake_up_interruptible(&peasycap->wq_audio); wake_up_interruptible(&peasycap->wq_audio);
JOM(4, "about to lock easycapdc60_dongle[%i].mutex_audio\n", JOM(4, "about to lock dongle[%i].mutex_audio\n", kd);
kd);
if (mutex_lock_interruptible(&easycapdc60_dongle[kd]. if (mutex_lock_interruptible(&easycapdc60_dongle[kd].
mutex_audio)) { mutex_audio)) {
SAY("ERROR: cannot lock easycapdc60_dongle[%i]." SAY("ERROR: "
"mutex_audio\n", kd); "cannot lock dongle[%i].mutex_audio\n", kd);
return; return;
} }
JOM(4, "locked easycapdc60_dongle[%i].mutex_audio\n", kd); JOM(4, "locked dongle[%i].mutex_audio\n", kd);
} else } else
SAY("ERROR: %i=kd is bad: cannot lock dongle\n", kd); SAY("ERROR: %i=kd is bad: cannot lock dongle\n", kd);
#ifndef CONFIG_EASYCAP_OSS #ifndef CONFIG_EASYCAP_OSS
if (0 != snd_card_free(peasycap->psnd_card)) { if (0 != snd_card_free(peasycap->psnd_card)) {
SAY("ERROR: snd_card_free() failed\n"); SAY("ERROR: snd_card_free() failed\n");
} else { } else {
peasycap->psnd_card = NULL; peasycap->psnd_card = NULL;
(peasycap->registered_audio)--; (peasycap->registered_audio)--;
} }
#else /* CONFIG_EASYCAP_OSS */ #else /* CONFIG_EASYCAP_OSS */
usb_deregister_dev(pusb_interface, &easyoss_class); usb_deregister_dev(pusb_interface, &easyoss_class);
(peasycap->registered_audio)--; peasycap->registered_audio--;
JOM(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber); JOM(4, "intf[%i]: usb_deregister_dev()\n", bInterfaceNumber);
SAM("easyoss detached from minor #%d\n", minor); SAM("easyoss detached from minor #%d\n", minor);
#endif /* CONFIG_EASYCAP_OSS */ #endif /* CONFIG_EASYCAP_OSS */
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
mutex_unlock(&easycapdc60_dongle[kd].mutex_audio); mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
JOM(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd); JOM(4, "unlocked dongle[%i].mutex_audio\n", kd);
} }
break; break;
} }
default: default:
break; break;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* /*
* CALL easycap_delete() IF NO REMAINING REFERENCES TO peasycap * CALL easycap_delete() IF NO REMAINING REFERENCES TO peasycap
* (ALSO WHEN ALSA HAS BEEN IN USE) * (ALSO WHEN ALSA HAS BEEN IN USE)
*/ */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
if (!peasycap->kref.refcount.counter) { if (!peasycap->kref.refcount.counter) {
SAM("ERROR: peasycap->kref.refcount.counter is zero " SAM("ERROR: peasycap->kref.refcount.counter is zero "
"so cannot call kref_put()\n"); "so cannot call kref_put()\n");
SAM("ending unsuccessfully: may cause memory leak\n"); SAM("ending unsuccessfully: may cause memory leak\n");
return; return;
} }
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
JOM(4, "about to lock easycapdc60_dongle[%i].mutex_video\n", kd); JOM(4, "about to lock dongle[%i].mutex_video\n", kd);
if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_video)) { if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_video)) {
SAY("ERROR: cannot down " SAY("ERROR: cannot lock dongle[%i].mutex_video\n", kd);
"easycapdc60_dongle[%i].mutex_video\n", kd);
SAM("ending unsuccessfully: may cause memory leak\n"); SAM("ending unsuccessfully: may cause memory leak\n");
return; return;
} }
JOM(4, "locked easycapdc60_dongle[%i].mutex_video\n", kd); JOM(4, "locked dongle[%i].mutex_video\n", kd);
JOM(4, "about to lock easycapdc60_dongle[%i].mutex_audio\n", kd); JOM(4, "about to lock dongle[%i].mutex_audio\n", kd);
if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_audio)) { if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_audio)) {
SAY("ERROR: cannot down " SAY("ERROR: cannot lock dongle[%i].mutex_audio\n", kd);
"easycapdc60_dongle[%i].mutex_audio\n", kd);
mutex_unlock(&(easycapdc60_dongle[kd].mutex_video)); mutex_unlock(&(easycapdc60_dongle[kd].mutex_video));
JOM(4, "unlocked easycapdc60_dongle[%i].mutex_video\n", kd); JOM(4, "unlocked dongle[%i].mutex_video\n", kd);
SAM("ending unsuccessfully: may cause memory leak\n"); SAM("ending unsuccessfully: may cause memory leak\n");
return; return;
} }
JOM(4, "locked easycapdc60_dongle[%i].mutex_audio\n", kd); JOM(4, "locked dongle[%i].mutex_audio\n", kd);
} }
JOM(4, "intf[%i]: %i=peasycap->kref.refcount.counter\n", JOM(4, "intf[%i]: %i=peasycap->kref.refcount.counter\n",
bInterfaceNumber, (int)peasycap->kref.refcount.counter); bInterfaceNumber, (int)peasycap->kref.refcount.counter);
kref_put(&peasycap->kref, easycap_delete); kref_put(&peasycap->kref, easycap_delete);
JOT(4, "intf[%i]: kref_put() done.\n", bInterfaceNumber); JOT(4, "intf[%i]: kref_put() done.\n", bInterfaceNumber);
if (0 <= kd && DONGLE_MANY > kd) { if (0 <= kd && DONGLE_MANY > kd) {
mutex_unlock(&(easycapdc60_dongle[kd].mutex_audio)); mutex_unlock(&(easycapdc60_dongle[kd].mutex_audio));
JOT(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd); JOT(4, "unlocked dongle[%i].mutex_audio\n", kd);
mutex_unlock(&easycapdc60_dongle[kd].mutex_video); mutex_unlock(&easycapdc60_dongle[kd].mutex_video);
JOT(4, "unlocked easycapdc60_dongle[%i].mutex_video\n", kd); JOT(4, "unlocked dongle[%i].mutex_video\n", kd);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
JOM(4, "ends\n"); JOM(4, "ends\n");
return; return;
} }
/*****************************************************************************/ /*****************************************************************************/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment