[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: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
c7855ee531
Коммит
98680557f3
|
@ -470,71 +470,49 @@ struct easycap {
|
|||
*/
|
||||
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
|
||||
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_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);
|
||||
int easycap_dqbuf(struct easycap *, int);
|
||||
int submit_video_urbs(struct easycap *);
|
||||
int kill_video_urbs(struct easycap *);
|
||||
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_brightness(struct easycap *, int);
|
||||
int adjust_contrast(struct easycap *, int);
|
||||
int adjust_saturation(struct easycap *, int);
|
||||
int adjust_hue(struct easycap *, int);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
* AUDIO FUNCTION PROTOTYPES
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
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 *);
|
||||
int easycap_alsa_probe(struct easycap *);
|
||||
void easycap_alsa_complete(struct urb *);
|
||||
int audio_setup(struct easycap *);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/*
|
||||
* LOW-LEVEL FUNCTION PROTOTYPES
|
||||
*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
int audio_gainget(struct usb_device *);
|
||||
int audio_gainset(struct usb_device *, s8);
|
||||
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 wakeup_device(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 setup_stk(struct usb_device *, bool);
|
||||
int setup_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 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 *);
|
||||
int read_saa(struct usb_device *, u16);
|
||||
int write_saa(struct usb_device *, u16, u16);
|
||||
int start_100(struct usb_device *);
|
||||
int stop_100(struct usb_device *);
|
||||
int isdongle(struct easycap *);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
/*****************************************************************************/
|
||||
|
|
|
@ -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,9 +1604,9 @@ 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,
|
||||
u8 mask, u8 margin, bool isuy)
|
||||
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];
|
||||
u8 *pcache;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
/*****************************************************************************/
|
||||
|
|
Загрузка…
Ссылка в новой задаче