diff options
author | Tomas Winkler <tomas.winkler@intel.com> | 2011-01-24 10:08:21 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-01-24 18:32:54 -0500 |
commit | 1945f939b6b3d2ea7a0ac143f85fd288a50e0516 (patch) | |
tree | 640f0006a05a6b1c6c9cf5d577a7633800f20f48 /drivers | |
parent | 0edbc24c5dc7fba0dce193f7d4b7faf2ad211ba4 (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.h | 10 | ||||
-rw-r--r-- | drivers/staging/easycap/easycap_ioctl.c | 307 | ||||
-rw-r--r-- | drivers/staging/easycap/easycap_sound_oss.c | 350 |
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 */ |
557 | void easyoss_complete(struct urb *); | 557 | void easyoss_complete(struct urb *); |
558 | ssize_t easyoss_read(struct file *, char __user *, size_t, loff_t *); | 558 | |
559 | int easyoss_open(struct inode *, struct file *); | ||
560 | int easyoss_release(struct inode *, struct file *); | ||
561 | long easyoss_ioctl_noinode(struct file *, unsigned int, | ||
562 | unsigned long); | ||
563 | int easyoss_ioctl(struct inode *, struct file *, unsigned int, | ||
564 | unsigned long); | ||
565 | unsigned int easyoss_poll(struct file *, poll_table *); | ||
566 | void easyoss_delete(struct kref *); | ||
567 | #endif /* !CONFIG_EASYCAP_OSS */ | 559 | #endif /* !CONFIG_EASYCAP_OSS */ |
568 | 560 | ||
569 | int easycap_sound_setup(struct easycap *); | 561 | int 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); | |||
2517 | return 0; | 2517 | return 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))) | ||
2524 | long | ||
2525 | easyoss_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 | /*---------------------------------------------------------------------------*/ | ||
2531 | int | ||
2532 | easyoss_ioctl(struct inode *inode, struct file *file, | ||
2533 | unsigned int cmd, unsigned long arg) | ||
2534 | { | ||
2535 | struct easycap *peasycap; | ||
2536 | struct usb_device *p; | ||
2537 | int kd; | ||
2538 | |||
2539 | if (NULL == file) { | ||
2540 | SAY("ERROR: file is NULL\n"); | ||
2541 | return -ERESTARTSYS; | ||
2542 | } | ||
2543 | peasycap = file->private_data; | ||
2544 | if (NULL == peasycap) { | ||
2545 | SAY("ERROR: peasycap is NULL.\n"); | ||
2546 | return -EFAULT; | ||
2547 | } | ||
2548 | if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { | ||
2549 | SAY("ERROR: bad peasycap\n"); | ||
2550 | return -EFAULT; | ||
2551 | } | ||
2552 | p = peasycap->pusb_device; | ||
2553 | if (NULL == p) { | ||
2554 | SAM("ERROR: peasycap->pusb_device is NULL\n"); | ||
2555 | return -EFAULT; | ||
2556 | } | ||
2557 | kd = isdongle(peasycap); | ||
2558 | if (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 | /*---------------------------------------------------------------------------*/ | ||
2606 | switch (cmd) { | ||
2607 | case 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 | } | ||
2629 | case 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 | } | ||
2651 | case 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 | } | ||
2686 | case 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 | } | ||
2713 | case 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 | } | ||
2740 | case 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 | } | ||
2756 | case 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 | } | ||
2773 | case 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 | } | ||
2788 | case 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 | } | ||
2805 | case 0x00005401: | ||
2806 | case 0x00005402: | ||
2807 | case 0x00005403: | ||
2808 | case 0x00005404: | ||
2809 | case 0x00005405: | ||
2810 | case 0x00005406: { | ||
2811 | JOM(8, "SNDCTL_TMR_...: 0x%08X unsupported\n", cmd); | ||
2812 | mutex_unlock(&easycapdc60_dongle[kd].mutex_audio); | ||
2813 | return -ENOIOCTLCMD; | ||
2814 | } | ||
2815 | default: { | ||
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 | } | ||
2821 | mutex_unlock(&easycapdc60_dongle[kd].mutex_audio); | ||
2822 | return 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 | /*--------------------------------------------------------------------------*/ |
43 | const 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 | }; | ||
55 | struct 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 | /*---------------------------------------------------------------------------*/ |
331 | int | 314 | static int easyoss_open(struct inode *inode, struct file *file) |
332 | easyoss_open(struct inode *inode, struct file *file) | ||
333 | { | 315 | { |
334 | struct usb_interface *pusb_interface; | 316 | struct usb_interface *pusb_interface; |
335 | struct easycap *peasycap; | 317 | struct easycap *peasycap; |
@@ -401,8 +383,7 @@ if (0 != easycap_sound_setup(peasycap)) { | |||
401 | return 0; | 383 | return 0; |
402 | } | 384 | } |
403 | /*****************************************************************************/ | 385 | /*****************************************************************************/ |
404 | int | 386 | static int easyoss_release(struct inode *inode, struct file *file) |
405 | easyoss_release(struct inode *inode, struct file *file) | ||
406 | { | 387 | { |
407 | struct easycap *peasycap; | 388 | struct easycap *peasycap; |
408 | 389 | ||
@@ -425,9 +406,8 @@ JOM(4, "ending successfully\n"); | |||
425 | return 0; | 406 | return 0; |
426 | } | 407 | } |
427 | /*****************************************************************************/ | 408 | /*****************************************************************************/ |
428 | ssize_t | 409 | static ssize_t easyoss_read(struct file *file, char __user *puserspacebuffer, |
429 | easyoss_read(struct file *file, char __user *puserspacebuffer, | 410 | size_t kount, loff_t *poff) |
430 | size_t kount, loff_t *poff) | ||
431 | { | 411 | { |
432 | struct timeval timeval; | 412 | struct timeval timeval; |
433 | long long int above, below, mean; | 413 | long long int above, below, mean; |
@@ -725,6 +705,328 @@ mutex_unlock(&easycapdc60_dongle[kd].mutex_audio); | |||
725 | JOM(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd); | 705 | JOM(4, "unlocked easycapdc60_dongle[%i].mutex_audio\n", kd); |
726 | JOM(8, "returning %li\n", (long int)szret); | 706 | JOM(8, "returning %li\n", (long int)szret); |
727 | return szret; | 707 | return szret; |
708 | |||
709 | } | ||
710 | /*---------------------------------------------------------------------------*/ | ||
711 | static int easyoss_ioctl(struct inode *inode, struct file *file, | ||
712 | unsigned int cmd, unsigned long arg) | ||
713 | { | ||
714 | struct easycap *peasycap; | ||
715 | struct usb_device *p; | ||
716 | int kd; | ||
717 | |||
718 | if (NULL == file) { | ||
719 | SAY("ERROR: file is NULL\n"); | ||
720 | return -ERESTARTSYS; | ||
721 | } | ||
722 | peasycap = file->private_data; | ||
723 | if (NULL == peasycap) { | ||
724 | SAY("ERROR: peasycap is NULL.\n"); | ||
725 | return -EFAULT; | ||
726 | } | ||
727 | if (memcmp(&peasycap->telltale[0], TELLTALE, strlen(TELLTALE))) { | ||
728 | SAY("ERROR: bad peasycap\n"); | ||
729 | return -EFAULT; | ||
730 | } | ||
731 | p = peasycap->pusb_device; | ||
732 | if (NULL == p) { | ||
733 | SAM("ERROR: peasycap->pusb_device is NULL\n"); | ||
734 | return -EFAULT; | ||
735 | } | ||
736 | kd = isdongle(peasycap); | ||
737 | if (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 | /*---------------------------------------------------------------------------*/ | ||
785 | switch (cmd) { | ||
786 | case 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 | } | ||
808 | case 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 | } |
830 | case 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 | } | ||
865 | case 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 | } | ||
892 | case 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 | } | ||
919 | case 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 | } | ||
935 | case 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 | } | ||
952 | case 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 | } | ||
967 | case 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 | } | ||
984 | case 0x00005401: | ||
985 | case 0x00005402: | ||
986 | case 0x00005403: | ||
987 | case 0x00005404: | ||
988 | case 0x00005405: | ||
989 | case 0x00005406: { | ||
990 | JOM(8, "SNDCTL_TMR_...: 0x%08X unsupported\n", cmd); | ||
991 | mutex_unlock(&easycapdc60_dongle[kd].mutex_audio); | ||
992 | return -ENOIOCTLCMD; | ||
993 | } | ||
994 | default: { | ||
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 | } | ||
1000 | mutex_unlock(&easycapdc60_dongle[kd].mutex_audio); | ||
1001 | return 0; | ||
1002 | } | ||
1003 | /*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ | ||
1004 | #if ((defined(EASYCAP_IS_VIDEODEV_CLIENT)) || \ | ||
1005 | (defined(EASYCAP_NEEDS_UNLOCKED_IOCTL))) | ||
1006 | static 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 | |||
1014 | const 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 | }; | ||
1026 | struct 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 | ||