Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98680557 authored by Tomas Winkler's avatar Tomas Winkler Committed by Mauro Carvalho Chehab
Browse files

[media] easycap: cleanup function usage



1. Remove declarations of none global functions from easycap.h
and make them static in the c-files.
2. Reorder static functions to reduce number of forward declarations.
3. Remove unused functions.

Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent c7855ee5
Loading
Loading
Loading
Loading
+33 −55
Original line number Diff line number Diff line
@@ -473,20 +473,16 @@ long easycap_unlocked_ioctl(struct file *, unsigned int, unsigned long);
int easycap_dqbuf(struct easycap *, int);
int submit_video_urbs(struct easycap *);
int kill_video_urbs(struct easycap *);
int              field2frame(struct easycap *);
int              redaub(struct easycap *, void *, void *,
						int, int, u8, u8, bool);
void easycap_testcard(struct easycap *, int);
int fillin_formats(void);
int newinput(struct easycap *, int);

int adjust_standard(struct easycap *, v4l2_std_id);
int              adjust_format(struct easycap *, u32, u32, u32,
								int, bool);
int adjust_format(struct easycap *, u32, u32, u32, int, bool);
int adjust_brightness(struct easycap *, int);
int adjust_contrast(struct easycap *, int);
int adjust_saturation(struct easycap *, int);
int adjust_hue(struct easycap *, int);
int              adjust_volume(struct easycap *, int);
/*---------------------------------------------------------------------------*/
/*
 *  AUDIO FUNCTION PROTOTYPES
@@ -494,46 +490,28 @@ int adjust_volume(struct easycap *, int);
/*---------------------------------------------------------------------------*/
int easycap_alsa_probe(struct easycap *);
void easycap_alsa_complete(struct urb *);

int              easycap_sound_setup(struct easycap *);
int              submit_audio_urbs(struct easycap *);
int              kill_audio_urbs(struct easycap *);
void             easyoss_testtone(struct easycap *, int);
int audio_setup(struct easycap *);
/*---------------------------------------------------------------------------*/
/*
 *  LOW-LEVEL FUNCTION PROTOTYPES
 */
/*---------------------------------------------------------------------------*/
int              audio_gainget(struct usb_device *);
int audio_gainset(struct usb_device *, s8);

int              set_interface(struct usb_device *, u16);
int wakeup_device(struct usb_device *);
int              confirm_resolution(struct usb_device *);
int              confirm_stream(struct usb_device *);

int setup_stk(struct usb_device *, bool);
int setup_saa(struct usb_device *, bool);
int              setup_vt(struct usb_device *);
int              check_stk(struct usb_device *, bool);
int              check_saa(struct usb_device *, bool);
int ready_saa(struct usb_device *);
int merit_saa(struct usb_device *);
int check_vt(struct usb_device *);
int select_input(struct usb_device *, int, int);
int              set_resolution(struct usb_device *,
						u16, u16, u16, u16);
int set_resolution(struct usb_device *, u16, u16, u16, u16);

int read_saa(struct usb_device *, u16);
int              read_stk(struct usb_device *, u32);
int write_saa(struct usb_device *, u16, u16);
int              write_000(struct usb_device *, u16, u16);
int start_100(struct usb_device *);
int stop_100(struct usb_device *);
int              write_300(struct usb_device *);
int              read_vt(struct usb_device *, u16);
int              write_vt(struct usb_device *, u16, u16);
int isdongle(struct easycap *);
/*---------------------------------------------------------------------------*/

+1 −1
Original line number Diff line number Diff line
@@ -854,7 +854,7 @@ int adjust_hue(struct easycap *peasycap, int value)
	return -ENOENT;
}
/*****************************************************************************/
int adjust_volume(struct easycap *peasycap, int value)
static int adjust_volume(struct easycap *peasycap, int value)
{
	s8 mood;
	int i1;
+27 −192
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@

#include "easycap.h"


#define GET(X, Y, Z) do { \
	int __rc; \
	*(Z) = (u16)0; \
@@ -354,101 +355,6 @@ static int wait_i2c(struct usb_device *p)
	return -1;
}

/****************************************************************************/
int confirm_resolution(struct usb_device *p)
{
	u8 get0, get1, get2, get3, get4, get5, get6, get7;

	if (!p)
		return -ENODEV;
	GET(p, 0x0110, &get0);
	GET(p, 0x0111, &get1);
	GET(p, 0x0112, &get2);
	GET(p, 0x0113, &get3);
	GET(p, 0x0114, &get4);
	GET(p, 0x0115, &get5);
	GET(p, 0x0116, &get6);
	GET(p, 0x0117, &get7);
	JOT(8,  "0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X\n",
		get0, get1, get2, get3, get4, get5, get6, get7);
	JOT(8,  "....cf PAL_720x526: "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X\n",
		0x000, 0x000, 0x001, 0x000, 0x5A0, 0x005, 0x121, 0x001);
	JOT(8,  "....cf PAL_704x526: "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X\n",
		0x004, 0x000, 0x001, 0x000, 0x584, 0x005, 0x121, 0x001);
	JOT(8,  "....cf VGA_640x480: "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X, "
		"0x%03X, 0x%03X\n",
		0x008, 0x000, 0x020, 0x000, 0x508, 0x005, 0x110, 0x001);
	return 0;
}
/****************************************************************************/
int confirm_stream(struct usb_device *p)
{
	u16 get2;
	u8 igot;

	if (!p)
		return -ENODEV;
	GET(p, 0x0100, &igot);  get2 = 0x80 & igot;
	if (0x80 == get2)
		JOT(8, "confirm_stream:  OK\n");
	else
		JOT(8, "confirm_stream:  STUCK\n");
	return 0;
}
/****************************************************************************/
int setup_stk(struct usb_device *p, bool ntsc)
{
	int i;
	const struct stk1160config *cfg;
	if (!p)
		return -ENODEV;
	cfg = (ntsc) ? stk1160configNTSC : stk1160configPAL;
	for (i = 0; cfg[i].reg != 0xFFF; i++)
		SET(p, cfg[i].reg, cfg[i].set);

	write_300(p);

	return 0;
}
/****************************************************************************/
int setup_saa(struct usb_device *p, bool ntsc)
{
	int i, ir;
	const struct saa7113config *cfg;
	if (!p)
		return -ENODEV;
	cfg = (ntsc) ?  saa7113configNTSC : saa7113configPAL;
	for (i = 0; cfg[i].reg != 0xFF; i++)
		ir = write_saa(p, cfg[i].reg, cfg[i].set);
	return 0;
}
/****************************************************************************/
int write_000(struct usb_device *p, u16 set2, u16 set0)
{
	u8 igot0, igot2;

	if (!p)
		return -ENODEV;
	GET(p, 0x0002, &igot2);
	GET(p, 0x0000, &igot0);
	SET(p, 0x0002, set2);
	SET(p, 0x0000, set0);
	return 0;
}
/****************************************************************************/
int write_saa(struct usb_device *p, u16 reg0, u16 set0)
{
@@ -470,8 +376,7 @@ int write_saa(struct usb_device *p, u16 reg0, u16 set0)
 *  REGISTER 504:  TARGET ADDRESS ON VT1612A
 */
/*--------------------------------------------------------------------------*/
int
write_vt(struct usb_device *p, u16 reg0, u16 set0)
static int write_vt(struct usb_device *p, u16 reg0, u16 set0)
{
	u8 igot;
	u16 got502, got503;
@@ -508,7 +413,7 @@ write_vt(struct usb_device *p, u16 reg0, u16 set0)
 *  REGISTER 504:  TARGET ADDRESS ON VT1612A
 */
/*--------------------------------------------------------------------------*/
int read_vt(struct usb_device *p, u16 reg0)
static int read_vt(struct usb_device *p, u16 reg0)
{
	u8 igot;
	u16 got502, got503;
@@ -532,7 +437,7 @@ int read_vt(struct usb_device *p, u16 reg0)
 *  THESE APPEAR TO HAVE NO EFFECT ON EITHER VIDEO OR AUDIO.
 */
/*--------------------------------------------------------------------------*/
int write_300(struct usb_device *p)
static int write_300(struct usb_device *p)
{
	if (!p)
		return -ENODEV;
@@ -545,32 +450,32 @@ int write_300(struct usb_device *p)
	return 0;
}
/****************************************************************************/
/*--------------------------------------------------------------------------*/
/*
 *  NOTE: THE FOLLOWING IS NOT CHECKED:
 *  REGISTER 0x0F, WHICH IS INVOLVED IN CHROMINANCE AUTOMATIC GAIN CONTROL.
 */
/*--------------------------------------------------------------------------*/
int check_saa(struct usb_device *p, bool ntsc)
/****************************************************************************/
int setup_stk(struct usb_device *p, bool ntsc)
{
	int i, ir, rc = 0;
	struct saa7113config const *cfg;
	int i;
	const struct stk1160config *cfg;
	if (!p)
		return -ENODEV;
	cfg = (ntsc) ? stk1160configNTSC : stk1160configPAL;
	for (i = 0; cfg[i].reg != 0xFFF; i++)
		SET(p, cfg[i].reg, cfg[i].set);

	cfg = (ntsc) ? saa7113configNTSC : saa7113configPAL;
	for (i = 0; cfg[i].reg != 0xFF; i++) {
		if (0x0F == cfg[i].reg)
			continue;
		ir = read_saa(p, cfg[i].reg);
		if (ir != cfg[i].set) {
			SAY("SAA register 0x%02X has 0x%02X, expected 0x%02X\n",
				cfg[i].reg, ir, cfg[i].set);
				rc--;
		}
	}
	write_300(p);

	return (rc < -8) ? rc : 0;
	return 0;
}
/****************************************************************************/
int setup_saa(struct usb_device *p, bool ntsc)
{
	int i, ir;
	const struct saa7113config *cfg;
	if (!p)
		return -ENODEV;
	cfg = (ntsc) ?  saa7113configNTSC : saa7113configPAL;
	for (i = 0; cfg[i].reg != 0xFF; i++)
		ir = write_saa(p, cfg[i].reg, cfg[i].set);
	return 0;
}
/****************************************************************************/
int merit_saa(struct usb_device *p)
@@ -629,44 +534,6 @@ int ready_saa(struct usb_device *p)
	return 0;
}
/****************************************************************************/
/*--------------------------------------------------------------------------*/
/*
 *  NOTE: THE FOLLOWING ARE NOT CHECKED:
 *  REGISTERS 0x000, 0x002:  FUNCTIONALITY IS NOT KNOWN
 *  REGISTER  0x100:  ACCEPT ALSO (0x80 | stk1160config....[.].set)
 */
/*--------------------------------------------------------------------------*/
int check_stk(struct usb_device *p, bool ntsc)
{
	int i, ir;
	const struct stk1160config *cfg;

	if (!p)
		return -ENODEV;
	cfg = (ntsc) ? stk1160configNTSC : stk1160configPAL;

	for (i = 0; 0xFFF != cfg[i].reg; i++) {
		if (0x000 == cfg[i].reg || 0x002 == cfg[i].reg)
			continue;


		ir = read_stk(p, cfg[i].reg);
		if (0x100 == cfg[i].reg) {
			if ((ir != (0xFF & cfg[i].set)) &&
			    (ir != (0x80 | (0xFF & cfg[i].set))) &&
			    (0xFFFF != cfg[i].set)) {
				SAY("STK reg[0x%03X]=0x%02X expected 0x%02X\n",
					cfg[i].reg, ir, cfg[i].set);
			}
			continue;
		}
		if ((ir != (0xFF & cfg[i].set)) && (0xFFFF != cfg[i].set))
			SAY("STK register 0x%03X has 0x%02X,expected 0x%02X\n",
				cfg[i].reg, ir, cfg[i].set);
	}
	return 0;
}
/****************************************************************************/
int read_saa(struct usb_device *p, u16 reg0)
{
	u8 igot;
@@ -682,7 +549,7 @@ int read_saa(struct usb_device *p, u16 reg0)
	return igot;
}
/****************************************************************************/
int read_stk(struct usb_device *p, u32 reg0)
static int read_stk(struct usb_device *p, u32 reg0)
{
	u8 igot;

@@ -692,27 +559,7 @@ int read_stk(struct usb_device *p, u32 reg0)
	GET(p, reg0, &igot);
	return igot;
}
/****************************************************************************/
/*--------------------------------------------------------------------------*/
/*
 *    HARDWARE    USERSPACE INPUT NUMBER   PHYSICAL INPUT   DRIVER input VALUE
 *
 *  CVBS+S-VIDEO           0 or 1              CVBS                 1
 *   FOUR-CVBS             0 or 1              CVBS1                1
 *   FOUR-CVBS                2                CVBS2                2
 *   FOUR-CVBS                3                CVBS3                3
 *   FOUR-CVBS                4                CVBS4                4
 *  CVBS+S-VIDEO              5               S-VIDEO               5
 *
 *  WHEN 5==input THE ARGUMENT mode MUST ALSO BE SUPPLIED:
 *
 *     mode  7   => GAIN TO BE SET EXPLICITLY USING REGISTER 0x05 (UNTESTED)
 *     mode  9   => USE AUTOMATIC GAIN CONTROL (DEFAULT)
 *
*/
/*---------------------------------------------------------------------------*/
int
select_input(struct usb_device *p, int input, int mode)
int select_input(struct usb_device *p, int input, int mode)
{
	int ir;

@@ -1115,15 +962,3 @@ int audio_gainset(struct usb_device *pusb_device, s8 loud)
	return 0;
}
/*****************************************************************************/
int audio_gainget(struct usb_device *pusb_device)
{
	int igot;

	if (!pusb_device)
		return -ENODEV;
	igot = read_vt(pusb_device, 0x001C);
	if (0 > igot)
		SAY("ERROR: failed to read VT1612A register 0x1C\n");
	return igot;
}
/*****************************************************************************/
+8 −5
Original line number Diff line number Diff line
@@ -66,6 +66,10 @@ struct easycap_dongle easycapdc60_dongle[DONGLE_MANY];
static struct mutex mutex_dongle;
static void easycap_complete(struct urb *purb);
static int reset(struct easycap *peasycap);
static int field2frame(struct easycap *peasycap);
static int redaub(struct easycap *peasycap,
		void *pad, void *pex, int much, int more,
		u8 mask, u8 margin, bool isuy);

const char *strerror(int err)
{
@@ -1211,8 +1215,7 @@ int easycap_dqbuf(struct easycap *peasycap, int mode)
 *  CHOOSES THE OPTION V4L2_FIELD_INTERLACED.
 */
/*---------------------------------------------------------------------------*/
int
field2frame(struct easycap *peasycap)
static int field2frame(struct easycap *peasycap)
{

	void *pex, *pad;
@@ -1601,8 +1604,8 @@ field2frame(struct easycap *peasycap)
 *  REDUCE CODE LENGTH WILL GENERALLY IMPAIR RUNTIME PERFORMANCE.  BEWARE.
 */
/*---------------------------------------------------------------------------*/
int
redaub(struct easycap *peasycap, void *pad, void *pex, int much, int more,
static int redaub(struct easycap *peasycap,
		void *pad, void *pex, int much, int more,
		u8 mask, u8 margin, bool isuy)
{
	static s32 ay[256], bu[256], rv[256], gu[256], gv[256];
+146 −199
Original line number Diff line number Diff line
@@ -56,6 +56,152 @@ static const struct snd_pcm_hardware alsa_hardware = {
};


/*---------------------------------------------------------------------------*/
/*
 *  SUBMIT ALL AUDIO URBS.
 */
/*---------------------------------------------------------------------------*/
static int submit_audio_urbs(struct easycap *peasycap)
{
	struct data_urb *pdata_urb;
	struct urb *purb;
	struct list_head *plist_head;
	int j, isbad, nospc, m, rc;
	int isbuf;

	if (!peasycap) {
		SAY("ERROR: peasycap is NULL\n");
		return -EFAULT;
	}
	if (!peasycap->purb_audio_head) {
		SAM("ERROR: peasycap->urb_audio_head uninitialized\n");
		return -EFAULT;
	}
	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device is NULL\n");
		return -EFAULT;
	}

	if (peasycap->audio_isoc_streaming) {
		JOM(4, "already streaming audio urbs\n");
		return 0;
	}

	JOM(4, "initial submission of all audio urbs\n");
	rc = usb_set_interface(peasycap->pusb_device,
			       peasycap->audio_interface,
			       peasycap->audio_altsetting_on);
	JOM(8, "usb_set_interface(.,%i,%i) returned %i\n",
	    peasycap->audio_interface,
	    peasycap->audio_altsetting_on, rc);

	isbad = 0;
	nospc = 0;
	m = 0;
	list_for_each(plist_head, peasycap->purb_audio_head) {
		pdata_urb = list_entry(plist_head, struct data_urb, list_head);
		if (pdata_urb && pdata_urb->purb) {
			purb = pdata_urb->purb;
			isbuf = pdata_urb->isbuf;

			purb->interval = 1;
			purb->dev = peasycap->pusb_device;
			purb->pipe = usb_rcvisocpipe(peasycap->pusb_device,
					peasycap->audio_endpointnumber);
			purb->transfer_flags = URB_ISO_ASAP;
			purb->transfer_buffer = peasycap->audio_isoc_buffer[isbuf].pgo;
			purb->transfer_buffer_length = peasycap->audio_isoc_buffer_size;
			purb->complete = easycap_alsa_complete;
			purb->context = peasycap;
			purb->start_frame = 0;
			purb->number_of_packets = peasycap->audio_isoc_framesperdesc;
			for (j = 0;  j < peasycap->audio_isoc_framesperdesc; j++) {
				purb->iso_frame_desc[j].offset = j * peasycap->audio_isoc_maxframesize;
				purb->iso_frame_desc[j].length = peasycap->audio_isoc_maxframesize;
			}

			rc = usb_submit_urb(purb, GFP_KERNEL);
			if (rc) {
				isbad++;
				SAM("ERROR: usb_submit_urb() failed"
				    " for urb with rc: -%s: %d\n",
				    strerror(rc), rc);
			} else {
				m++;
			}
		} else {
			isbad++;
		}
	}
	if (nospc) {
		SAM("-ENOSPC=usb_submit_urb() for %i urbs\n", nospc);
		SAM(".....  possibly inadequate USB bandwidth\n");
		peasycap->audio_eof = 1;
	}
	if (isbad) {
		JOM(4, "attempting cleanup instead of submitting\n");
		list_for_each(plist_head, (peasycap->purb_audio_head)) {
			pdata_urb = list_entry(plist_head, struct data_urb, list_head);
			if (pdata_urb && pdata_urb->purb)
				usb_kill_urb(pdata_urb->purb);
		}
		peasycap->audio_isoc_streaming = 0;
	} else {
		peasycap->audio_isoc_streaming = m;
		JOM(4, "submitted %i audio urbs\n", m);
	}

	return 0;
}
/*---------------------------------------------------------------------------*/
/*
 *  COMMON AUDIO INITIALIZATION
 */
/*---------------------------------------------------------------------------*/
static int easycap_sound_setup(struct easycap *peasycap)
{
	int rc;

	JOM(4, "starting initialization\n");

	if (!peasycap) {
		SAY("ERROR:  peasycap is NULL.\n");
		return -EFAULT;
	}
	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device is NULL\n");
		return -ENODEV;
	}
	JOM(16, "0x%08lX=peasycap->pusb_device\n", (long int)peasycap->pusb_device);

	rc = audio_setup(peasycap);
	JOM(8, "audio_setup() returned %i\n", rc);

	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device has become NULL\n");
		return -ENODEV;
	}
/*---------------------------------------------------------------------------*/
	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device has become NULL\n");
		return -ENODEV;
	}
	rc = usb_set_interface(peasycap->pusb_device, peasycap->audio_interface,
			       peasycap->audio_altsetting_on);
	JOM(8, "usb_set_interface(.,%i,%i) returned %i\n", peasycap->audio_interface,
	    peasycap->audio_altsetting_on, rc);

	rc = wakeup_device(peasycap->pusb_device);
	JOM(8, "wakeup_device() returned %i\n", rc);

	peasycap->audio_eof = 0;
	peasycap->audio_idle = 0;

	submit_audio_urbs(peasycap);

	JOM(4, "finished initialization\n");
	return 0;
}
/*****************************************************************************/
/*---------------------------------------------------------------------------*/
/*
@@ -615,202 +761,3 @@ int easycap_alsa_probe(struct easycap *peasycap)
	return 0;
}
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/*---------------------------------------------------------------------------*/
/*
 *  COMMON AUDIO INITIALIZATION
 */
/*---------------------------------------------------------------------------*/
int
easycap_sound_setup(struct easycap *peasycap)
{
	int rc;

	JOM(4, "starting initialization\n");

	if (!peasycap) {
		SAY("ERROR:  peasycap is NULL.\n");
		return -EFAULT;
	}
	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device is NULL\n");
		return -ENODEV;
	}
	JOM(16, "0x%08lX=peasycap->pusb_device\n", (long int)peasycap->pusb_device);

	rc = audio_setup(peasycap);
	JOM(8, "audio_setup() returned %i\n", rc);

	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device has become NULL\n");
		return -ENODEV;
	}
/*---------------------------------------------------------------------------*/
	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device has become NULL\n");
		return -ENODEV;
	}
	rc = usb_set_interface(peasycap->pusb_device, peasycap->audio_interface,
			       peasycap->audio_altsetting_on);
	JOM(8, "usb_set_interface(.,%i,%i) returned %i\n", peasycap->audio_interface,
	    peasycap->audio_altsetting_on, rc);

	rc = wakeup_device(peasycap->pusb_device);
	JOM(8, "wakeup_device() returned %i\n", rc);

	peasycap->audio_eof = 0;
	peasycap->audio_idle = 0;

	submit_audio_urbs(peasycap);

	JOM(4, "finished initialization\n");
	return 0;
}
/*****************************************************************************/
/*---------------------------------------------------------------------------*/
/*
 *  SUBMIT ALL AUDIO URBS.
 */
/*---------------------------------------------------------------------------*/
int
submit_audio_urbs(struct easycap *peasycap)
{
	struct data_urb *pdata_urb;
	struct urb *purb;
	struct list_head *plist_head;
	int j, isbad, nospc, m, rc;
	int isbuf;

	if (!peasycap) {
		SAY("ERROR: peasycap is NULL\n");
		return -EFAULT;
	}
	if (!peasycap->purb_audio_head) {
		SAM("ERROR: peasycap->urb_audio_head uninitialized\n");
		return -EFAULT;
	}
	if (!peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device is NULL\n");
		return -EFAULT;
	}

	if (peasycap->audio_isoc_streaming) {
		JOM(4, "already streaming audio urbs\n");
		return 0;
	}

	JOM(4, "initial submission of all audio urbs\n");
	rc = usb_set_interface(peasycap->pusb_device,
			       peasycap->audio_interface,
			       peasycap->audio_altsetting_on);
	JOM(8, "usb_set_interface(.,%i,%i) returned %i\n",
	    peasycap->audio_interface,
	    peasycap->audio_altsetting_on, rc);

	isbad = 0;
	nospc = 0;
	m = 0;
	list_for_each(plist_head, peasycap->purb_audio_head) {
		pdata_urb = list_entry(plist_head, struct data_urb, list_head);
		if (pdata_urb && pdata_urb->purb) {
			purb = pdata_urb->purb;
			isbuf = pdata_urb->isbuf;

			purb->interval = 1;
			purb->dev = peasycap->pusb_device;
			purb->pipe = usb_rcvisocpipe(peasycap->pusb_device,
					peasycap->audio_endpointnumber);
			purb->transfer_flags = URB_ISO_ASAP;
			purb->transfer_buffer = peasycap->audio_isoc_buffer[isbuf].pgo;
			purb->transfer_buffer_length = peasycap->audio_isoc_buffer_size;
			purb->complete = easycap_alsa_complete;
			purb->context = peasycap;
			purb->start_frame = 0;
			purb->number_of_packets = peasycap->audio_isoc_framesperdesc;
			for (j = 0;  j < peasycap->audio_isoc_framesperdesc; j++) {
				purb->iso_frame_desc[j].offset = j * peasycap->audio_isoc_maxframesize;
				purb->iso_frame_desc[j].length = peasycap->audio_isoc_maxframesize;
			}

			rc = usb_submit_urb(purb, GFP_KERNEL);
			if (rc) {
				isbad++;
				SAM("ERROR: usb_submit_urb() failed"
				    " for urb with rc: -%s: %d\n",
				    strerror(rc), rc);
			} else {
				m++;
			}
		} else {
			isbad++;
		}
	}
	if (nospc) {
		SAM("-ENOSPC=usb_submit_urb() for %i urbs\n", nospc);
		SAM(".....  possibly inadequate USB bandwidth\n");
		peasycap->audio_eof = 1;
	}
	if (isbad) {
		JOM(4, "attempting cleanup instead of submitting\n");
		list_for_each(plist_head, (peasycap->purb_audio_head)) {
			pdata_urb = list_entry(plist_head, struct data_urb, list_head);
			if (pdata_urb && pdata_urb->purb)
				usb_kill_urb(pdata_urb->purb);
		}
		peasycap->audio_isoc_streaming = 0;
	} else {
		peasycap->audio_isoc_streaming = m;
		JOM(4, "submitted %i audio urbs\n", m);
	}

	return 0;
}
/*****************************************************************************/
/*---------------------------------------------------------------------------*/
/*
 *  KILL ALL AUDIO URBS.
 */
/*---------------------------------------------------------------------------*/
int
kill_audio_urbs(struct easycap *peasycap)
{
	int m;
	struct list_head *plist_head;
	struct data_urb *pdata_urb;

	if (!peasycap) {
		SAY("ERROR: peasycap is NULL\n");
		return -EFAULT;
	}

	if (!peasycap->audio_isoc_streaming) {
		JOM(8, "%i=audio_isoc_streaming, no audio urbs killed\n",
		    peasycap->audio_isoc_streaming);
		return 0;
	}

	if (!peasycap->purb_audio_head) {
		SAM("ERROR: peasycap->purb_audio_head is NULL\n");
		return -EFAULT;
	}

	peasycap->audio_isoc_streaming = 0;
	JOM(4, "killing audio urbs\n");
	m = 0;
	list_for_each(plist_head, (peasycap->purb_audio_head)) {
		pdata_urb = list_entry(plist_head, struct data_urb, list_head);
		if (pdata_urb && pdata_urb->purb) {
			usb_kill_urb(pdata_urb->purb);
			m++;
		}
	}
	JOM(4, "%i audio urbs killed\n", m);

	return 0;
}
/*****************************************************************************/