aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2011-01-24 10:08:21 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-01-24 18:32:54 -0500
commit1945f939b6b3d2ea7a0ac143f85fd288a50e0516 (patch)
tree640f0006a05a6b1c6c9cf5d577a7633800f20f48 /drivers
parent0edbc24c5dc7fba0dce193f7d4b7faf2ad211ba4 (diff)
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: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/easycap/easycap.h10
-rw-r--r--drivers/staging/easycap/easycap_ioctl.c307
-rw-r--r--drivers/staging/easycap/easycap_sound_oss.c350
3 files changed, 327 insertions, 340 deletions
diff --git a/drivers/staging/easycap/easycap.h b/drivers/staging/easycap/easycap.h
index 55ff0d571cf..63722b1578d 100644
--- a/drivers/staging/easycap/easycap.h
+++ b/drivers/staging/easycap/easycap.h
@@ -555,15 +555,7 @@ struct page *easycap_alsa_page(struct snd_pcm_substream *, unsigned long);
555 555
556#else /* CONFIG_EASYCAP_OSS */ 556#else /* CONFIG_EASYCAP_OSS */
557void easyoss_complete(struct urb *); 557void easyoss_complete(struct urb *);
558ssize_t easyoss_read(struct file *, char __user *, size_t, loff_t *); 558
559int easyoss_open(struct inode *, struct file *);
560int easyoss_release(struct inode *, struct file *);
561long easyoss_ioctl_noinode(struct file *, unsigned int,
562 unsigned long);
563int easyoss_ioctl(struct inode *, struct file *, unsigned int,
564 unsigned long);
565unsigned int easyoss_poll(struct file *, poll_table *);
566void easyoss_delete(struct kref *);
567#endif /* !CONFIG_EASYCAP_OSS */ 559#endif /* !CONFIG_EASYCAP_OSS */
568 560
569int easycap_sound_setup(struct easycap *); 561int easycap_sound_setup(struct easycap *);
diff --git a/drivers/staging/easycap/easycap_ioctl.c b/drivers/staging/easycap/easycap_ioctl.c
index 6995163aba9..22219245736 100644
--- a/drivers/staging/easycap/easycap_ioctl.c
+++ b/drivers/staging/easycap/easycap_ioctl.c
@@ -2517,310 +2517,3 @@ JOM(4, "unlocked easycapdc60_dongle[%i].mutex_video\n", kd);
2517return 0; 2517return 0;
2518} 2518}
2519/*****************************************************************************/ 2519/*****************************************************************************/
2520#ifdef CONFIG_EASYCAP_OSS
2521/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
2522#if ((defined(EASYCAP_IS_VIDEODEV_CLIENT)) || \
2523 (defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)))
2524long
2525easyoss_ioctl_noinode(struct file *file, unsigned int cmd, unsigned long arg) {
2526 return (long)easyoss_ioctl((struct inode *)NULL, file, cmd, arg);
2527}
2528#endif /*EASYCAP_IS_VIDEODEV_CLIENT||EASYCAP_NEEDS_UNLOCKED_IOCTL*/
2529/*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
2530/*---------------------------------------------------------------------------*/
2531int
2532easyoss_ioctl(struct inode *inode, struct file *file,
2533 unsigned int cmd, unsigned long arg)
2534{
2535struct easycap *peasycap;
2536struct usb_device *p;
2537int kd;
2538
2539if (NULL == file) {
2540 SAY("ERROR: file is NULL\n");
2541 return -ERESTARTSYS;
2542}
2543peasycap = file->private_data;
2544if (NULL == peasycap) {
2545 SAY("ERROR: peasycap is NULL.\n");
2546 return -EFAULT;
2547}
2548if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
2549 SAY("ERROR: bad peasycap\n");
2550 return -EFAULT;
2551}
2552p = peasycap->pusb_device;
2553if (NULL == p) {
2554 SAM("ERROR: peasycap->pusb_device is NULL\n");
2555 return -EFAULT;
2556}
2557kd = isdongle(peasycap);
2558if (0 <= kd && DONGLE_MANY > kd) {
2559 if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_audio)) {
2560 SAY("ERROR: cannot lock "
2561 "easycapdc60_dongle[%i].mutex_audio\n", kd);
2562 return -ERESTARTSYS;
2563 }
2564 JOM(4, "locked easycapdc60_dongle[%i].mutex_audio\n", kd);
2565/*---------------------------------------------------------------------------*/
2566/*
2567 * MEANWHILE, easycap_usb_disconnect() MAY HAVE FREED POINTER peasycap,
2568 * IN WHICH CASE A REPEAT CALL TO isdongle() WILL FAIL.
2569 * IF NECESSARY, BAIL OUT.
2570*/
2571/*---------------------------------------------------------------------------*/
2572 if (kd != isdongle(peasycap))
2573 return -ERESTARTSYS;
2574 if (NULL == file) {
2575 SAY("ERROR: file is NULL\n");
2576 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2577 return -ERESTARTSYS;
2578 }
2579 peasycap = file->private_data;
2580 if (NULL == peasycap) {
2581 SAY("ERROR: peasycap is NULL\n");
2582 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2583 return -ERESTARTSYS;
2584 }
2585 if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
2586 SAY("ERROR: bad peasycap\n");
2587 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2588 return -EFAULT;
2589 }
2590 p = peasycap->pusb_device;
2591 if (NULL == peasycap->pusb_device) {
2592 SAM("ERROR: peasycap->pusb_device is NULL\n");
2593 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2594 return -ERESTARTSYS;
2595 }
2596} else {
2597/*---------------------------------------------------------------------------*/
2598/*
2599 * IF easycap_usb_disconnect() HAS ALREADY FREED POINTER peasycap BEFORE THE
2600 * ATTEMPT TO ACQUIRE THE SEMAPHORE, isdongle() WILL HAVE FAILED. BAIL OUT.
2601*/
2602/*---------------------------------------------------------------------------*/
2603 return -ERESTARTSYS;
2604}
2605/*---------------------------------------------------------------------------*/
2606switch (cmd) {
2607case SNDCTL_DSP_GETCAPS: {
2608 int caps;
2609 JOM(8, "SNDCTL_DSP_GETCAPS\n");
2610
2611#if defined(UPSAMPLE)
2612 if (true == peasycap->microphone)
2613 caps = 0x04400000;
2614 else
2615 caps = 0x04400000;
2616#else
2617 if (true == peasycap->microphone)
2618 caps = 0x02400000;
2619 else
2620 caps = 0x04400000;
2621#endif /*UPSAMPLE*/
2622
2623 if (0 != copy_to_user((void __user *)arg, &caps, sizeof(int))) {
2624 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2625 return -EFAULT;
2626 }
2627 break;
2628}
2629case SNDCTL_DSP_GETFMTS: {
2630 int incoming;
2631 JOM(8, "SNDCTL_DSP_GETFMTS\n");
2632
2633#if defined(UPSAMPLE)
2634 if (true == peasycap->microphone)
2635 incoming = AFMT_S16_LE;
2636 else
2637 incoming = AFMT_S16_LE;
2638#else
2639 if (true == peasycap->microphone)
2640 incoming = AFMT_S16_LE;
2641 else
2642 incoming = AFMT_S16_LE;
2643#endif /*UPSAMPLE*/
2644
2645 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
2646 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2647 return -EFAULT;
2648 }
2649 break;
2650}
2651case SNDCTL_DSP_SETFMT: {
2652 int incoming, outgoing;
2653 JOM(8, "SNDCTL_DSP_SETFMT\n");
2654 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
2655 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2656 return -EFAULT;
2657 }
2658 JOM(8, "........... %i=incoming\n", incoming);
2659
2660#if defined(UPSAMPLE)
2661 if (true == peasycap->microphone)
2662 outgoing = AFMT_S16_LE;
2663 else
2664 outgoing = AFMT_S16_LE;
2665#else
2666 if (true == peasycap->microphone)
2667 outgoing = AFMT_S16_LE;
2668 else
2669 outgoing = AFMT_S16_LE;
2670#endif /*UPSAMPLE*/
2671
2672 if (incoming != outgoing) {
2673 JOM(8, "........... %i=outgoing\n", outgoing);
2674 JOM(8, " cf. %i=AFMT_S16_LE\n", AFMT_S16_LE);
2675 JOM(8, " cf. %i=AFMT_U8\n", AFMT_U8);
2676 if (0 != copy_to_user((void __user *)arg, &outgoing,
2677 sizeof(int))) {
2678 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2679 return -EFAULT;
2680 }
2681 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2682 return -EINVAL ;
2683 }
2684 break;
2685}
2686case SNDCTL_DSP_STEREO: {
2687 int incoming;
2688 JOM(8, "SNDCTL_DSP_STEREO\n");
2689 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
2690 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2691 return -EFAULT;
2692 }
2693 JOM(8, "........... %i=incoming\n", incoming);
2694
2695#if defined(UPSAMPLE)
2696 if (true == peasycap->microphone)
2697 incoming = 1;
2698 else
2699 incoming = 1;
2700#else
2701 if (true == peasycap->microphone)
2702 incoming = 0;
2703 else
2704 incoming = 1;
2705#endif /*UPSAMPLE*/
2706
2707 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
2708 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2709 return -EFAULT;
2710 }
2711 break;
2712}
2713case SNDCTL_DSP_SPEED: {
2714 int incoming;
2715 JOM(8, "SNDCTL_DSP_SPEED\n");
2716 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
2717 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2718 return -EFAULT;
2719 }
2720 JOM(8, "........... %i=incoming\n", incoming);
2721
2722#if defined(UPSAMPLE)
2723 if (true == peasycap->microphone)
2724 incoming = 32000;
2725 else
2726 incoming = 48000;
2727#else
2728 if (true == peasycap->microphone)
2729 incoming = 8000;
2730 else
2731 incoming = 48000;
2732#endif /*UPSAMPLE*/
2733
2734 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
2735 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2736 return -EFAULT;
2737 }
2738 break;
2739}
2740case SNDCTL_DSP_GETTRIGGER: {
2741 int incoming;
2742 JOM(8, "SNDCTL_DSP_GETTRIGGER\n");
2743 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
2744 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2745 return -EFAULT;
2746 }
2747 JOM(8, "........... %i=incoming\n", incoming);
2748
2749 incoming = PCM_ENABLE_INPUT;
2750 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
2751 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2752 return -EFAULT;
2753 }
2754 break;
2755}
2756case SNDCTL_DSP_SETTRIGGER: {
2757 int incoming;
2758 JOM(8, "SNDCTL_DSP_SETTRIGGER\n");
2759 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
2760 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2761 return -EFAULT;
2762 }
2763 JOM(8, "........... %i=incoming\n", incoming);
2764 JOM(8, "........... cf 0x%x=PCM_ENABLE_INPUT "
2765 "0x%x=PCM_ENABLE_OUTPUT\n",
2766 PCM_ENABLE_INPUT, PCM_ENABLE_OUTPUT);
2767 ;
2768 ;
2769 ;
2770 ;
2771 break;
2772}
2773case SNDCTL_DSP_GETBLKSIZE: {
2774 int incoming;
2775 JOM(8, "SNDCTL_DSP_GETBLKSIZE\n");
2776 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
2777 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2778 return -EFAULT;
2779 }
2780 JOM(8, "........... %i=incoming\n", incoming);
2781 incoming = peasycap->audio_bytes_per_fragment;
2782 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
2783 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2784 return -EFAULT;
2785 }
2786 break;
2787}
2788case SNDCTL_DSP_GETISPACE: {
2789 struct audio_buf_info audio_buf_info;
2790
2791 JOM(8, "SNDCTL_DSP_GETISPACE\n");
2792
2793 audio_buf_info.bytes = peasycap->audio_bytes_per_fragment;
2794 audio_buf_info.fragments = 1;
2795 audio_buf_info.fragsize = 0;
2796 audio_buf_info.fragstotal = 0;
2797
2798 if (0 != copy_to_user((void __user *)arg, &audio_buf_info,
2799 sizeof(int))) {
2800 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2801 return -EFAULT;
2802 }
2803 break;
2804}
2805case 0x00005401:
2806case 0x00005402:
2807case 0x00005403:
2808case 0x00005404:
2809case 0x00005405:
2810case 0x00005406: {
2811 JOM(8, "SNDCTL_TMR_...: 0x%08X unsupported\n", cmd);
2812 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2813 return -ENOIOCTLCMD;
2814}
2815default: {
2816 JOM(8, "ERROR: unrecognized DSP IOCTL command: 0x%08X\n", cmd);
2817 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2818 return -ENOIOCTLCMD;
2819}
2820}
2821mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
2822return 0;
2823}
2824#endif /* CONFIG_EASYCAP_OSS */
2825/*****************************************************************************/
2826
diff --git a/drivers/staging/easycap/easycap_sound_oss.c b/drivers/staging/easycap/easycap_sound_oss.c
index 3f85cc3b060..02898142171 100644
--- a/drivers/staging/easycap/easycap_sound_oss.c
+++ b/drivers/staging/easycap/easycap_sound_oss.c
@@ -40,23 +40,6 @@
40 * PARAMETERS USED WHEN REGISTERING THE AUDIO INTERFACE 40 * PARAMETERS USED WHEN REGISTERING THE AUDIO INTERFACE
41 */ 41 */
42/*--------------------------------------------------------------------------*/ 42/*--------------------------------------------------------------------------*/
43const struct file_operations easyoss_fops = {
44 .owner = THIS_MODULE,
45 .open = easyoss_open,
46 .release = easyoss_release,
47#if defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)
48 .unlocked_ioctl = easyoss_ioctl_noinode,
49#else
50 .ioctl = easyoss_ioctl,
51#endif /*EASYCAP_NEEDS_UNLOCKED_IOCTL*/
52 .read = easyoss_read,
53 .llseek = no_llseek,
54};
55struct usb_class_driver easyoss_class = {
56.name = "usb/easyoss%d",
57.fops = &easyoss_fops,
58.minor_base = USB_SKEL_MINOR_BASE,
59};
60/*****************************************************************************/ 43/*****************************************************************************/
61/*---------------------------------------------------------------------------*/ 44/*---------------------------------------------------------------------------*/
62/* 45/*
@@ -328,8 +311,7 @@ return;
328 * HAVE AN IOCTL INTERFACE. 311 * HAVE AN IOCTL INTERFACE.
329 */ 312 */
330/*---------------------------------------------------------------------------*/ 313/*---------------------------------------------------------------------------*/
331int 314static int easyoss_open(struct inode *inode, struct file *file)
332easyoss_open(struct inode *inode, struct file *file)
333{ 315{
334struct usb_interface *pusb_interface; 316struct usb_interface *pusb_interface;
335struct easycap *peasycap; 317struct easycap *peasycap;
@@ -401,8 +383,7 @@ if (0 != easycap_sound_setup(peasycap)) {
401return 0; 383return 0;
402} 384}
403/*****************************************************************************/ 385/*****************************************************************************/
404int 386static int easyoss_release(struct inode *inode, struct file *file)
405easyoss_release(struct inode *inode, struct file *file)
406{ 387{
407struct easycap *peasycap; 388struct easycap *peasycap;
408 389
@@ -425,9 +406,8 @@ JOM(4, "ending successfully\n");
425return 0; 406return 0;
426} 407}
427/*****************************************************************************/ 408/*****************************************************************************/
428ssize_t 409static ssize_t easyoss_read(struct file *file, char __user *puserspacebuffer,
429easyoss_read(struct file *file, char __user *puserspacebuffer, 410 size_t kount, loff_t *poff)
430 size_t kount, loff_t *poff)
431{ 411{
432struct timeval timeval; 412struct timeval timeval;
433long long int above, below, mean; 413long long int above, below, mean;
@@ -725,6 +705,328 @@ mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
725JOM(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd); 705JOM(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd);
726JOM(8, "returning %li\n", (long int)szret); 706JOM(8, "returning %li\n", (long int)szret);
727return szret; 707return szret;
708
709}
710/*---------------------------------------------------------------------------*/
711static int easyoss_ioctl(struct inode *inode, struct file *file,
712 unsigned int cmd, unsigned long arg)
713{
714struct easycap *peasycap;
715struct usb_device *p;
716int kd;
717
718if (NULL == file) {
719 SAY("ERROR: file is NULL\n");
720 return -ERESTARTSYS;
721}
722peasycap = file->private_data;
723if (NULL == peasycap) {
724 SAY("ERROR: peasycap is NULL.\n");
725 return -EFAULT;
726}
727if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
728 SAY("ERROR: bad peasycap\n");
729 return -EFAULT;
730}
731p = peasycap->pusb_device;
732if (NULL == p) {
733 SAM("ERROR: peasycap->pusb_device is NULL\n");
734 return -EFAULT;
735}
736kd = isdongle(peasycap);
737if (0 <= kd && DONGLE_MANY > kd) {
738 if (mutex_lock_interruptible(&easycapdc60_dongle[kd].mutex_audio)) {
739 SAY("ERROR: cannot lock "
740 "easycapdc60_dongle[%i].mutex_audio\n", kd);
741 return -ERESTARTSYS;
742 }
743 JOM(4, "locked easycapdc60_dongle[%i].mutex_audio\n", kd);
744/*---------------------------------------------------------------------------*/
745/*
746 * MEANWHILE, easycap_usb_disconnect() MAY HAVE FREED POINTER peasycap,
747 * IN WHICH CASE A REPEAT CALL TO isdongle() WILL FAIL.
748 * IF NECESSARY, BAIL OUT.
749*/
750/*---------------------------------------------------------------------------*/
751 if (kd != isdongle(peasycap))
752 return -ERESTARTSYS;
753 if (NULL == file) {
754 SAY("ERROR: file is NULL\n");
755 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
756 return -ERESTARTSYS;
757 }
758 peasycap = file->private_data;
759 if (NULL == peasycap) {
760 SAY("ERROR: peasycap is NULL\n");
761 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
762 return -ERESTARTSYS;
763 }
764 if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) {
765 SAY("ERROR: bad peasycap\n");
766 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
767 return -EFAULT;
768 }
769 p = peasycap->pusb_device;
770 if (NULL == peasycap->pusb_device) {
771 SAM("ERROR: peasycap->pusb_device is NULL\n");
772 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
773 return -ERESTARTSYS;
774 }
775} else {
776/*---------------------------------------------------------------------------*/
777/*
778 * IF easycap_usb_disconnect() HAS ALREADY FREED POINTER peasycap BEFORE THE
779 * ATTEMPT TO ACQUIRE THE SEMAPHORE, isdongle() WILL HAVE FAILED. BAIL OUT.
780*/
781/*---------------------------------------------------------------------------*/
782 return -ERESTARTSYS;
783}
784/*---------------------------------------------------------------------------*/
785switch (cmd) {
786case SNDCTL_DSP_GETCAPS: {
787 int caps;
788 JOM(8, "SNDCTL_DSP_GETCAPS\n");
789
790#if defined(UPSAMPLE)
791 if (true == peasycap->microphone)
792 caps = 0x04400000;
793 else
794 caps = 0x04400000;
795#else
796 if (true == peasycap->microphone)
797 caps = 0x02400000;
798 else
799 caps = 0x04400000;
800#endif /*UPSAMPLE*/
801
802 if (0 != copy_to_user((void __user *)arg, &caps, sizeof(int))) {
803 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
804 return -EFAULT;
805 }
806 break;
807}
808case SNDCTL_DSP_GETFMTS: {
809 int incoming;
810 JOM(8, "SNDCTL_DSP_GETFMTS\n");
811
812#if defined(UPSAMPLE)
813 if (true == peasycap->microphone)
814 incoming = AFMT_S16_LE;
815 else
816 incoming = AFMT_S16_LE;
817#else
818 if (true == peasycap->microphone)
819 incoming = AFMT_S16_LE;
820 else
821 incoming = AFMT_S16_LE;
822#endif /*UPSAMPLE*/
823
824 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
825 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
826 return -EFAULT;
827 }
828 break;
728} 829}
830case SNDCTL_DSP_SETFMT: {
831 int incoming, outgoing;
832 JOM(8, "SNDCTL_DSP_SETFMT\n");
833 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
834 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
835 return -EFAULT;
836 }
837 JOM(8, "........... %i=incoming\n", incoming);
838
839#if defined(UPSAMPLE)
840 if (true == peasycap->microphone)
841 outgoing = AFMT_S16_LE;
842 else
843 outgoing = AFMT_S16_LE;
844#else
845 if (true == peasycap->microphone)
846 outgoing = AFMT_S16_LE;
847 else
848 outgoing = AFMT_S16_LE;
849#endif /*UPSAMPLE*/
850
851 if (incoming != outgoing) {
852 JOM(8, "........... %i=outgoing\n", outgoing);
853 JOM(8, " cf. %i=AFMT_S16_LE\n", AFMT_S16_LE);
854 JOM(8, " cf. %i=AFMT_U8\n", AFMT_U8);
855 if (0 != copy_to_user((void __user *)arg, &outgoing,
856 sizeof(int))) {
857 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
858 return -EFAULT;
859 }
860 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
861 return -EINVAL ;
862 }
863 break;
864}
865case SNDCTL_DSP_STEREO: {
866 int incoming;
867 JOM(8, "SNDCTL_DSP_STEREO\n");
868 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
869 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
870 return -EFAULT;
871 }
872 JOM(8, "........... %i=incoming\n", incoming);
873
874#if defined(UPSAMPLE)
875 if (true == peasycap->microphone)
876 incoming = 1;
877 else
878 incoming = 1;
879#else
880 if (true == peasycap->microphone)
881 incoming = 0;
882 else
883 incoming = 1;
884#endif /*UPSAMPLE*/
885
886 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
887 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
888 return -EFAULT;
889 }
890 break;
891}
892case SNDCTL_DSP_SPEED: {
893 int incoming;
894 JOM(8, "SNDCTL_DSP_SPEED\n");
895 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
896 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
897 return -EFAULT;
898 }
899 JOM(8, "........... %i=incoming\n", incoming);
900
901#if defined(UPSAMPLE)
902 if (true == peasycap->microphone)
903 incoming = 32000;
904 else
905 incoming = 48000;
906#else
907 if (true == peasycap->microphone)
908 incoming = 8000;
909 else
910 incoming = 48000;
911#endif /*UPSAMPLE*/
912
913 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
914 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
915 return -EFAULT;
916 }
917 break;
918}
919case SNDCTL_DSP_GETTRIGGER: {
920 int incoming;
921 JOM(8, "SNDCTL_DSP_GETTRIGGER\n");
922 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
923 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
924 return -EFAULT;
925 }
926 JOM(8, "........... %i=incoming\n", incoming);
927
928 incoming = PCM_ENABLE_INPUT;
929 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
930 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
931 return -EFAULT;
932 }
933 break;
934}
935case SNDCTL_DSP_SETTRIGGER: {
936 int incoming;
937 JOM(8, "SNDCTL_DSP_SETTRIGGER\n");
938 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
939 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
940 return -EFAULT;
941 }
942 JOM(8, "........... %i=incoming\n", incoming);
943 JOM(8, "........... cf 0x%x=PCM_ENABLE_INPUT "
944 "0x%x=PCM_ENABLE_OUTPUT\n",
945 PCM_ENABLE_INPUT, PCM_ENABLE_OUTPUT);
946 ;
947 ;
948 ;
949 ;
950 break;
951}
952case SNDCTL_DSP_GETBLKSIZE: {
953 int incoming;
954 JOM(8, "SNDCTL_DSP_GETBLKSIZE\n");
955 if (0 != copy_from_user(&incoming, (void __user *)arg, sizeof(int))) {
956 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
957 return -EFAULT;
958 }
959 JOM(8, "........... %i=incoming\n", incoming);
960 incoming = peasycap->audio_bytes_per_fragment;
961 if (0 != copy_to_user((void __user *)arg, &incoming, sizeof(int))) {
962 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
963 return -EFAULT;
964 }
965 break;
966}
967case SNDCTL_DSP_GETISPACE: {
968 struct audio_buf_info audio_buf_info;
969
970 JOM(8, "SNDCTL_DSP_GETISPACE\n");
971
972 audio_buf_info.bytes = peasycap->audio_bytes_per_fragment;
973 audio_buf_info.fragments = 1;
974 audio_buf_info.fragsize = 0;
975 audio_buf_info.fragstotal = 0;
976
977 if (0 != copy_to_user((void __user *)arg, &audio_buf_info,
978 sizeof(int))) {
979 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
980 return -EFAULT;
981 }
982 break;
983}
984case 0x00005401:
985case 0x00005402:
986case 0x00005403:
987case 0x00005404:
988case 0x00005405:
989case 0x00005406: {
990 JOM(8, "SNDCTL_TMR_...: 0x%08X unsupported\n", cmd);
991 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
992 return -ENOIOCTLCMD;
993}
994default: {
995 JOM(8, "ERROR: unrecognized DSP IOCTL command: 0x%08X\n", cmd);
996 mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
997 return -ENOIOCTLCMD;
998}
999}
1000mutex_unlock(&easycapdc60_dongle[kd].mutex_audio);
1001return 0;
1002}
1003/*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
1004#if ((defined(EASYCAP_IS_VIDEODEV_CLIENT)) || \
1005 (defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)))
1006static long easyoss_ioctl_noinode(struct file *file,
1007 unsigned int cmd, unsigned long arg)
1008{
1009 return (long)easyoss_ioctl((struct inode *)NULL, file, cmd, arg);
1010}
1011#endif /*EASYCAP_IS_VIDEODEV_CLIENT||EASYCAP_NEEDS_UNLOCKED_IOCTL*/
1012/*****************************************************************************/
1013
1014const struct file_operations easyoss_fops = {
1015 .owner = THIS_MODULE,
1016 .open = easyoss_open,
1017 .release = easyoss_release,
1018#if defined(EASYCAP_NEEDS_UNLOCKED_IOCTL)
1019 .unlocked_ioctl = easyoss_ioctl_noinode,
1020#else
1021 .ioctl = easyoss_ioctl,
1022#endif /*EASYCAP_NEEDS_UNLOCKED_IOCTL*/
1023 .read = easyoss_read,
1024 .llseek = no_llseek,
1025};
1026struct usb_class_driver easyoss_class = {
1027 .name = "usb/easyoss%d",
1028 .fops = &easyoss_fops,
1029 .minor_base = USB_SKEL_MINOR_BASE,
1030};
729/*****************************************************************************/ 1031/*****************************************************************************/
730 1032