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

Commit 1945f939 authored by Tomas Winkler's avatar Tomas Winkler Committed by Greg Kroah-Hartman
Browse files

staging/easycap: make oss ops function static in sound_oss.c



1. make oss ops function static
2. move around code so to avid forward declarations
3. move OSS ioclts from ioctl.c to sound_oss.c

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 0edbc24c
Loading
Loading
Loading
Loading
+1 −9
Original line number Diff line number Diff line
@@ -555,15 +555,7 @@ struct page *easycap_alsa_page(struct snd_pcm_substream *, unsigned long);

#else /* CONFIG_EASYCAP_OSS */
void             easyoss_complete(struct urb *);
ssize_t          easyoss_read(struct file *, char __user *, size_t, loff_t *);
int              easyoss_open(struct inode *, struct file *);
int              easyoss_release(struct inode *, struct file *);
long             easyoss_ioctl_noinode(struct file *, unsigned int,
								unsigned long);
int              easyoss_ioctl(struct inode *, struct file *, unsigned int,
								unsigned long);
unsigned int     easyoss_poll(struct file *, poll_table *);
void             easyoss_delete(struct kref *);

#endif /* !CONFIG_EASYCAP_OSS */

int              easycap_sound_setup(struct easycap *);
+0 −307
Original line number Diff line number Diff line
@@ -2517,310 +2517,3 @@ JOM(4, "unlocked easycapdc60_dongle[%i].mutex_video\n", kd);
return 0;
}
/*****************************************************************************/
#ifdef CONFIG_EASYCAP_OSS
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
#if ((defined(EASYCAP_IS_VIDEODEV_CLIENT)) || \
	(defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)))
long
easyoss_ioctl_noinode(struct file *file, unsigned int cmd, unsigned long arg) {
	return (long)easyoss_ioctl((struct inode *)NULL, file, cmd, arg);
}
#endif /*EASYCAP_IS_VIDEODEV_CLIENT||EASYCAP_NEEDS_UNLOCKED_IOCTL*/
/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
/*---------------------------------------------------------------------------*/
int
easyoss_ioctl(struct inode *inode, struct file *file,
					unsigned int cmd, unsigned long arg)
{
struct easycap *peasycap;
struct usb_device *p;
int kd;

if (NULL == file) {
	SAY("ERROR:  file is NULL\n");
	return -ERESTARTSYS;
}
peasycap = file->private_data;
if (NULL == peasycap) {
	SAY("ERROR:  peasycap is NULL.\n");
	return -EFAULT;
}
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
	SAY("ERROR: bad peasycap\n");
	return -EFAULT;
}
p = peasycap->pusb_device;
if (NULL == p) {
	SAM("ERROR: peasycap->pusb_device is NULL\n");
	return -EFAULT;
}
kd = isdongle(peasycap);
if (0 <= kd && DONGLE_MANY > kd) {
	if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_audio)) {
		SAY("ERROR: cannot lock "
				"easycapdc60_dongle[%i].mutex_audio\n", kd);
		return -ERESTARTSYS;
	}
	JOM(4, "locked easycapdc60_dongle[%i].mutex_audio\n", kd);
/*---------------------------------------------------------------------------*/
/*
 *  MEANWHILE, easycap_usb_disconnect() MAY HAVE FREED POINTER peasycap,
 *  IN WHICH CASE A REPEAT CALL TO isdongle() WILL FAIL.
 *  IF NECESSARY, BAIL OUT.
*/
/*---------------------------------------------------------------------------*/
	if (kd != isdongle(peasycap))
		return -ERESTARTSYS;
	if (NULL == file) {
		SAY("ERROR:  file is NULL\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -ERESTARTSYS;
	}
	peasycap = file->private_data;
	if (NULL == peasycap) {
		SAY("ERROR:  peasycap is NULL\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -ERESTARTSYS;
	}
	if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
		SAY("ERROR: bad peasycap\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	p = peasycap->pusb_device;
	if (NULL == peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device is NULL\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -ERESTARTSYS;
	}
} else {
/*---------------------------------------------------------------------------*/
/*
 *  IF easycap_usb_disconnect() HAS ALREADY FREED POINTER peasycap BEFORE THE
 *  ATTEMPT TO ACQUIRE THE SEMAPHORE, isdongle() WILL HAVE FAILED.  BAIL OUT.
*/
/*---------------------------------------------------------------------------*/
	return -ERESTARTSYS;
}
/*---------------------------------------------------------------------------*/
switch (cmd) {
case SNDCTL_DSP_GETCAPS: {
	int caps;
	JOM(8, "SNDCTL_DSP_GETCAPS\n");

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		caps = 0x04400000;
	else
		caps = 0x04400000;
#else
	if (true == peasycap->microphone)
		caps = 0x02400000;
	else
		caps = 0x04400000;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &caps, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_GETFMTS: {
	int incoming;
	JOM(8, "SNDCTL_DSP_GETFMTS\n");

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		incoming = AFMT_S16_LE;
	else
		incoming = AFMT_S16_LE;
#else
	if (true == peasycap->microphone)
		incoming = AFMT_S16_LE;
	else
		incoming = AFMT_S16_LE;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_SETFMT: {
	int incoming, outgoing;
	JOM(8, "SNDCTL_DSP_SETFMT\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		outgoing = AFMT_S16_LE;
	else
		outgoing = AFMT_S16_LE;
#else
	if (true == peasycap->microphone)
		outgoing = AFMT_S16_LE;
	else
		outgoing = AFMT_S16_LE;
#endif /*UPSAMPLE*/

	if (incoming != outgoing) {
		JOM(8, "........... %i=outgoing\n", outgoing);
		JOM(8, "        cf. %i=AFMT_S16_LE\n", AFMT_S16_LE);
		JOM(8, "        cf. %i=AFMT_U8\n", AFMT_U8);
		if (0 != copy_to_user((void __user *)arg, &outgoing,
								sizeof(int))) {
			mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
			return -EFAULT;
		}
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EINVAL ;
	}
	break;
}
case SNDCTL_DSP_STEREO: {
	int incoming;
	JOM(8, "SNDCTL_DSP_STEREO\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		incoming = 1;
	else
		incoming = 1;
#else
	if (true == peasycap->microphone)
		incoming = 0;
	else
		incoming = 1;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_SPEED: {
	int incoming;
	JOM(8, "SNDCTL_DSP_SPEED\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		incoming = 32000;
	else
		incoming = 48000;
#else
	if (true == peasycap->microphone)
		incoming = 8000;
	else
		incoming = 48000;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_GETTRIGGER: {
	int incoming;
	JOM(8, "SNDCTL_DSP_GETTRIGGER\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

	incoming = PCM_ENABLE_INPUT;
	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_SETTRIGGER: {
	int incoming;
	JOM(8, "SNDCTL_DSP_SETTRIGGER\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);
	JOM(8, "........... cf 0x%x=PCM_ENABLE_INPUT "
				"0x%x=PCM_ENABLE_OUTPUT\n",
					PCM_ENABLE_INPUT, PCM_ENABLE_OUTPUT);
	;
	;
	;
	;
	break;
}
case SNDCTL_DSP_GETBLKSIZE: {
	int incoming;
	JOM(8, "SNDCTL_DSP_GETBLKSIZE\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);
	incoming = peasycap->audio_bytes_per_fragment;
	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_GETISPACE: {
	struct audio_buf_info audio_buf_info;

	JOM(8, "SNDCTL_DSP_GETISPACE\n");

	audio_buf_info.bytes      = peasycap->audio_bytes_per_fragment;
	audio_buf_info.fragments  = 1;
	audio_buf_info.fragsize   = 0;
	audio_buf_info.fragstotal = 0;

	if (0 != copy_to_user((void __user *)arg, &audio_buf_info,
								sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case 0x00005401:
case 0x00005402:
case 0x00005403:
case 0x00005404:
case 0x00005405:
case 0x00005406: {
	JOM(8, "SNDCTL_TMR_...: 0x%08X unsupported\n", cmd);
	mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
	return -ENOIOCTLCMD;
}
default: {
	JOM(8, "ERROR: unrecognized DSP IOCTL command: 0x%08X\n", cmd);
	mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
	return -ENOIOCTLCMD;
}
}
mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
return 0;
}
#endif /* CONFIG_EASYCAP_OSS */
/*****************************************************************************/
+326 −24
Original line number Diff line number Diff line
@@ -40,23 +40,6 @@
 *  PARAMETERS USED WHEN REGISTERING THE AUDIO INTERFACE
 */
/*--------------------------------------------------------------------------*/
const struct file_operations easyoss_fops = {
	.owner		= THIS_MODULE,
	.open		= easyoss_open,
	.release	= easyoss_release,
#if defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)
	.unlocked_ioctl	= easyoss_ioctl_noinode,
#else
	.ioctl		= easyoss_ioctl,
#endif /*EASYCAP_NEEDS_UNLOCKED_IOCTL*/
	.read		= easyoss_read,
	.llseek		= no_llseek,
};
struct usb_class_driver easyoss_class = {
.name = "usb/easyoss%d",
.fops = &easyoss_fops,
.minor_base = USB_SKEL_MINOR_BASE,
};
/*****************************************************************************/
/*---------------------------------------------------------------------------*/
/*
@@ -328,8 +311,7 @@ return;
 *  HAVE AN IOCTL INTERFACE.
 */
/*---------------------------------------------------------------------------*/
int
easyoss_open(struct inode *inode, struct file *file)
static int easyoss_open(struct inode *inode, struct file *file)
{
struct usb_interface *pusb_interface;
struct easycap *peasycap;
@@ -401,8 +383,7 @@ if (0 != easycap_sound_setup(peasycap)) {
return 0;
}
/*****************************************************************************/
int
easyoss_release(struct inode *inode, struct file *file)
static int easyoss_release(struct inode *inode, struct file *file)
{
struct easycap *peasycap;

@@ -425,8 +406,7 @@ JOM(4, "ending successfully\n");
return 0;
}
/*****************************************************************************/
ssize_t
easyoss_read(struct file *file, char __user *puserspacebuffer,
static ssize_t easyoss_read(struct file *file, char __user *puserspacebuffer,
			size_t kount, loff_t *poff)
{
struct timeval timeval;
@@ -725,6 +705,328 @@ mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
JOM(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd);
JOM(8, "returning %li\n", (long int)szret);
return szret;

}
/*---------------------------------------------------------------------------*/
static int easyoss_ioctl(struct inode *inode, struct file *file,
			unsigned int cmd, unsigned long arg)
{
struct easycap *peasycap;
struct usb_device *p;
int kd;

if (NULL == file) {
	SAY("ERROR:  file is NULL\n");
	return -ERESTARTSYS;
}
peasycap = file->private_data;
if (NULL == peasycap) {
	SAY("ERROR:  peasycap is NULL.\n");
	return -EFAULT;
}
if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
	SAY("ERROR: bad peasycap\n");
	return -EFAULT;
}
p = peasycap->pusb_device;
if (NULL == p) {
	SAM("ERROR: peasycap->pusb_device is NULL\n");
	return -EFAULT;
}
kd = isdongle(peasycap);
if (0 <= kd && DONGLE_MANY > kd) {
	if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_audio)) {
		SAY("ERROR: cannot lock "
				"easycapdc60_dongle[%i].mutex_audio\n", kd);
		return -ERESTARTSYS;
	}
	JOM(4, "locked easycapdc60_dongle[%i].mutex_audio\n", kd);
/*---------------------------------------------------------------------------*/
/*
 *  MEANWHILE, easycap_usb_disconnect() MAY HAVE FREED POINTER peasycap,
 *  IN WHICH CASE A REPEAT CALL TO isdongle() WILL FAIL.
 *  IF NECESSARY, BAIL OUT.
*/
/*---------------------------------------------------------------------------*/
	if (kd != isdongle(peasycap))
		return -ERESTARTSYS;
	if (NULL == file) {
		SAY("ERROR:  file is NULL\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -ERESTARTSYS;
	}
	peasycap = file->private_data;
	if (NULL == peasycap) {
		SAY("ERROR:  peasycap is NULL\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -ERESTARTSYS;
	}
	if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
		SAY("ERROR: bad peasycap\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	p = peasycap->pusb_device;
	if (NULL == peasycap->pusb_device) {
		SAM("ERROR: peasycap->pusb_device is NULL\n");
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -ERESTARTSYS;
	}
} else {
/*---------------------------------------------------------------------------*/
/*
 *  IF easycap_usb_disconnect() HAS ALREADY FREED POINTER peasycap BEFORE THE
 *  ATTEMPT TO ACQUIRE THE SEMAPHORE, isdongle() WILL HAVE FAILED.  BAIL OUT.
*/
/*---------------------------------------------------------------------------*/
	return -ERESTARTSYS;
}
/*---------------------------------------------------------------------------*/
switch (cmd) {
case SNDCTL_DSP_GETCAPS: {
	int caps;
	JOM(8, "SNDCTL_DSP_GETCAPS\n");

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		caps = 0x04400000;
	else
		caps = 0x04400000;
#else
	if (true == peasycap->microphone)
		caps = 0x02400000;
	else
		caps = 0x04400000;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &caps, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_GETFMTS: {
	int incoming;
	JOM(8, "SNDCTL_DSP_GETFMTS\n");

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		incoming = AFMT_S16_LE;
	else
		incoming = AFMT_S16_LE;
#else
	if (true == peasycap->microphone)
		incoming = AFMT_S16_LE;
	else
		incoming = AFMT_S16_LE;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_SETFMT: {
	int incoming, outgoing;
	JOM(8, "SNDCTL_DSP_SETFMT\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		outgoing = AFMT_S16_LE;
	else
		outgoing = AFMT_S16_LE;
#else
	if (true == peasycap->microphone)
		outgoing = AFMT_S16_LE;
	else
		outgoing = AFMT_S16_LE;
#endif /*UPSAMPLE*/

	if (incoming != outgoing) {
		JOM(8, "........... %i=outgoing\n", outgoing);
		JOM(8, "        cf. %i=AFMT_S16_LE\n", AFMT_S16_LE);
		JOM(8, "        cf. %i=AFMT_U8\n", AFMT_U8);
		if (0 != copy_to_user((void __user *)arg, &outgoing,
								sizeof(int))) {
			mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
			return -EFAULT;
		}
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EINVAL ;
	}
	break;
}
case SNDCTL_DSP_STEREO: {
	int incoming;
	JOM(8, "SNDCTL_DSP_STEREO\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		incoming = 1;
	else
		incoming = 1;
#else
	if (true == peasycap->microphone)
		incoming = 0;
	else
		incoming = 1;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_SPEED: {
	int incoming;
	JOM(8, "SNDCTL_DSP_SPEED\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

#if defined(UPSAMPLE)
	if (true == peasycap->microphone)
		incoming = 32000;
	else
		incoming = 48000;
#else
	if (true == peasycap->microphone)
		incoming = 8000;
	else
		incoming = 48000;
#endif /*UPSAMPLE*/

	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_GETTRIGGER: {
	int incoming;
	JOM(8, "SNDCTL_DSP_GETTRIGGER\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);

	incoming = PCM_ENABLE_INPUT;
	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_SETTRIGGER: {
	int incoming;
	JOM(8, "SNDCTL_DSP_SETTRIGGER\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);
	JOM(8, "........... cf 0x%x=PCM_ENABLE_INPUT "
				"0x%x=PCM_ENABLE_OUTPUT\n",
					PCM_ENABLE_INPUT, PCM_ENABLE_OUTPUT);
	;
	;
	;
	;
	break;
}
case SNDCTL_DSP_GETBLKSIZE: {
	int incoming;
	JOM(8, "SNDCTL_DSP_GETBLKSIZE\n");
	if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	JOM(8, "........... %i=incoming\n", incoming);
	incoming = peasycap->audio_bytes_per_fragment;
	if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case SNDCTL_DSP_GETISPACE: {
	struct audio_buf_info audio_buf_info;

	JOM(8, "SNDCTL_DSP_GETISPACE\n");

	audio_buf_info.bytes      = peasycap->audio_bytes_per_fragment;
	audio_buf_info.fragments  = 1;
	audio_buf_info.fragsize   = 0;
	audio_buf_info.fragstotal = 0;

	if (0 != copy_to_user((void __user *)arg, &audio_buf_info,
								sizeof(int))) {
		mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
		return -EFAULT;
	}
	break;
}
case 0x00005401:
case 0x00005402:
case 0x00005403:
case 0x00005404:
case 0x00005405:
case 0x00005406: {
	JOM(8, "SNDCTL_TMR_...: 0x%08X unsupported\n", cmd);
	mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
	return -ENOIOCTLCMD;
}
default: {
	JOM(8, "ERROR: unrecognized DSP IOCTL command: 0x%08X\n", cmd);
	mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
	return -ENOIOCTLCMD;
}
}
mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
return 0;
}
/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
#if ((defined(EASYCAP_IS_VIDEODEV_CLIENT)) || \
	(defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)))
static long easyoss_ioctl_noinode(struct file *file,
		unsigned int cmd, unsigned long arg)
{
	return (long)easyoss_ioctl((struct inode *)NULL, file, cmd, arg);
}
#endif /*EASYCAP_IS_VIDEODEV_CLIENT||EASYCAP_NEEDS_UNLOCKED_IOCTL*/
/*****************************************************************************/

const struct file_operations easyoss_fops = {
	.owner		= THIS_MODULE,
	.open		= easyoss_open,
	.release	= easyoss_release,
#if defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)
	.unlocked_ioctl	= easyoss_ioctl_noinode,
#else
	.ioctl		= easyoss_ioctl,
#endif /*EASYCAP_NEEDS_UNLOCKED_IOCTL*/
	.read		= easyoss_read,
	.llseek		= no_llseek,
};
struct usb_class_driver easyoss_class = {
	.name = "usb/easyoss%d",
	.fops = &easyoss_fops,
	.minor_base = USB_SKEL_MINOR_BASE,
};
/*****************************************************************************/