Commit 5bdd6cc3300be534f2a2cf826e3fb926b5695698
1 parent
487206f263
Exists in
master
and in
4 other branches
V4L/DVB (4371a): Fix V4L1 dependencies on compat_ioctl32
Compat32 should be able to handle V4L1 ioctls if the old API support were selected. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Showing 1 changed file with 28 additions and 4 deletions Side-by-side Diff
drivers/media/video/compat_ioctl32.c
| ... | ... | @@ -21,7 +21,7 @@ |
| 21 | 21 | |
| 22 | 22 | #ifdef CONFIG_COMPAT |
| 23 | 23 | |
| 24 | - | |
| 24 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 25 | 25 | struct video_tuner32 { |
| 26 | 26 | compat_int_t tuner; |
| 27 | 27 | char name[32]; |
| ... | ... | @@ -107,6 +107,7 @@ |
| 107 | 107 | compat_caddr_t clips; |
| 108 | 108 | compat_int_t clipcount; |
| 109 | 109 | }; |
| 110 | +#endif | |
| 110 | 111 | |
| 111 | 112 | static int native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 112 | 113 | { |
| ... | ... | @@ -124,6 +125,7 @@ |
| 124 | 125 | } |
| 125 | 126 | |
| 126 | 127 | |
| 128 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 127 | 129 | /* You get back everything except the clips... */ |
| 128 | 130 | static int put_video_window32(struct video_window *kp, struct video_window32 __user *up) |
| 129 | 131 | { |
| ... | ... | @@ -138,6 +140,7 @@ |
| 138 | 140 | return -EFAULT; |
| 139 | 141 | return 0; |
| 140 | 142 | } |
| 143 | +#endif | |
| 141 | 144 | |
| 142 | 145 | struct v4l2_clip32 |
| 143 | 146 | { |
| ... | ... | @@ -490,6 +493,7 @@ |
| 490 | 493 | return 0; |
| 491 | 494 | } |
| 492 | 495 | |
| 496 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 493 | 497 | struct video_code32 |
| 494 | 498 | { |
| 495 | 499 | char loadwhat[16]; /* name or tag of file being passed */ |
| ... | ... | @@ -517,6 +521,8 @@ |
| 517 | 521 | #define VIDIOCSFREQ32 _IOW('v',15, u32) |
| 518 | 522 | #define VIDIOCSMICROCODE32 _IOW('v',27, struct video_code32) |
| 519 | 523 | |
| 524 | +#endif | |
| 525 | + | |
| 520 | 526 | /* VIDIOC_ENUMINPUT32 is VIDIOC_ENUMINPUT minus 4 bytes of padding alignement */ |
| 521 | 527 | #define VIDIOC_ENUMINPUT32 VIDIOC_ENUMINPUT - _IOC(0, 0, 0, 4) |
| 522 | 528 | #define VIDIOC_G_FMT32 _IOWR ('V', 4, struct v4l2_format32) |
| ... | ... | @@ -537,6 +543,7 @@ |
| 537 | 543 | #define VIDIOC_S_INPUT32 _IOWR ('V', 39, compat_int_t) |
| 538 | 544 | #define VIDIOC_TRY_FMT32 _IOWR ('V', 64, struct v4l2_format32) |
| 539 | 545 | |
| 546 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 540 | 547 | enum { |
| 541 | 548 | MaxClips = (~0U-sizeof(struct video_window))/sizeof(struct video_clip) |
| 542 | 549 | }; |
| 543 | 550 | |
| 544 | 551 | |
| ... | ... | @@ -601,14 +608,17 @@ |
| 601 | 608 | |
| 602 | 609 | return native_ioctl(file, VIDIOCSWIN, (unsigned long)vw); |
| 603 | 610 | } |
| 611 | +#endif | |
| 604 | 612 | |
| 605 | 613 | static int do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
| 606 | 614 | { |
| 607 | 615 | union { |
| 616 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 608 | 617 | struct video_tuner vt; |
| 609 | 618 | struct video_buffer vb; |
| 610 | 619 | struct video_window vw; |
| 611 | 620 | struct video_code vc; |
| 621 | +#endif | |
| 612 | 622 | struct v4l2_format v2f; |
| 613 | 623 | struct v4l2_buffer v2b; |
| 614 | 624 | struct v4l2_framebuffer v2fb; |
| ... | ... | @@ -624,6 +634,7 @@ |
| 624 | 634 | |
| 625 | 635 | /* First, convert the command. */ |
| 626 | 636 | switch(cmd) { |
| 637 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 627 | 638 | case VIDIOCGTUNER32: cmd = VIDIOCGTUNER; break; |
| 628 | 639 | case VIDIOCSTUNER32: cmd = VIDIOCSTUNER; break; |
| 629 | 640 | case VIDIOCGWIN32: cmd = VIDIOCGWIN; break; |
| ... | ... | @@ -631,6 +642,8 @@ |
| 631 | 642 | case VIDIOCSFBUF32: cmd = VIDIOCSFBUF; break; |
| 632 | 643 | case VIDIOCGFREQ32: cmd = VIDIOCGFREQ; break; |
| 633 | 644 | case VIDIOCSFREQ32: cmd = VIDIOCSFREQ; break; |
| 645 | + case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break; | |
| 646 | +#endif | |
| 634 | 647 | case VIDIOC_G_FMT32: cmd = VIDIOC_G_FMT; break; |
| 635 | 648 | case VIDIOC_S_FMT32: cmd = VIDIOC_S_FMT; break; |
| 636 | 649 | case VIDIOC_QUERYBUF32: cmd = VIDIOC_QUERYBUF; break; |
| 637 | 650 | |
| ... | ... | @@ -647,10 +660,10 @@ |
| 647 | 660 | case VIDIOC_G_INPUT32: cmd = VIDIOC_G_INPUT; break; |
| 648 | 661 | case VIDIOC_S_INPUT32: cmd = VIDIOC_S_INPUT; break; |
| 649 | 662 | case VIDIOC_TRY_FMT32: cmd = VIDIOC_TRY_FMT; break; |
| 650 | - case VIDIOCSMICROCODE32: cmd = VIDIOCSMICROCODE; break; | |
| 651 | 663 | }; |
| 652 | 664 | |
| 653 | 665 | switch(cmd) { |
| 666 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 654 | 667 | case VIDIOCSTUNER: |
| 655 | 668 | case VIDIOCGTUNER: |
| 656 | 669 | err = get_video_tuner32(&karg.vt, up); |
| ... | ... | @@ -664,6 +677,7 @@ |
| 664 | 677 | break; |
| 665 | 678 | |
| 666 | 679 | case VIDIOCSFREQ: |
| 680 | +#endif | |
| 667 | 681 | case VIDIOC_S_INPUT: |
| 668 | 682 | case VIDIOC_OVERLAY: |
| 669 | 683 | case VIDIOC_STREAMON: |
| 670 | 684 | |
| 671 | 685 | |
| 672 | 686 | |
| 673 | 687 | |
| ... | ... | @@ -717,18 +731,21 @@ |
| 717 | 731 | compatible_arg = 0; |
| 718 | 732 | break; |
| 719 | 733 | |
| 734 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 720 | 735 | case VIDIOCGWIN: |
| 721 | 736 | case VIDIOCGFBUF: |
| 722 | 737 | case VIDIOCGFREQ: |
| 738 | +#endif | |
| 723 | 739 | case VIDIOC_G_FBUF: |
| 724 | 740 | case VIDIOC_G_INPUT: |
| 725 | 741 | compatible_arg = 0; |
| 742 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 726 | 743 | case VIDIOCSMICROCODE: |
| 727 | 744 | err = microcode32(&karg.vc, up); |
| 728 | 745 | compatible_arg = 0; |
| 729 | 746 | break; |
| 747 | +#endif | |
| 730 | 748 | }; |
| 731 | - | |
| 732 | 749 | if(err) |
| 733 | 750 | goto out; |
| 734 | 751 | |
| ... | ... | @@ -743,6 +760,7 @@ |
| 743 | 760 | } |
| 744 | 761 | if(err == 0) { |
| 745 | 762 | switch(cmd) { |
| 763 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 746 | 764 | case VIDIOCGTUNER: |
| 747 | 765 | err = put_video_tuner32(&karg.vt, up); |
| 748 | 766 | break; |
| ... | ... | @@ -754,7 +772,7 @@ |
| 754 | 772 | case VIDIOCGFBUF: |
| 755 | 773 | err = put_video_buffer32(&karg.vb, up); |
| 756 | 774 | break; |
| 757 | - | |
| 775 | +#endif | |
| 758 | 776 | case VIDIOC_G_FBUF: |
| 759 | 777 | err = put_v4l2_framebuffer32(&karg.v2fb, up); |
| 760 | 778 | break; |
| 761 | 779 | |
| ... | ... | @@ -792,7 +810,9 @@ |
| 792 | 810 | err = put_v4l2_input32(&karg.v2i, up); |
| 793 | 811 | break; |
| 794 | 812 | |
| 813 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 795 | 814 | case VIDIOCGFREQ: |
| 815 | +#endif | |
| 796 | 816 | case VIDIOC_G_INPUT: |
| 797 | 817 | err = put_user(((u32)karg.vx), (u32 __user *)up); |
| 798 | 818 | break; |
| ... | ... | @@ -810,6 +830,7 @@ |
| 810 | 830 | return ret; |
| 811 | 831 | |
| 812 | 832 | switch (cmd) { |
| 833 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 813 | 834 | case VIDIOCSWIN32: |
| 814 | 835 | ret = do_set_window(file, cmd, arg); |
| 815 | 836 | break; |
| ... | ... | @@ -820,6 +841,7 @@ |
| 820 | 841 | case VIDIOCSFBUF32: |
| 821 | 842 | case VIDIOCGFREQ32: |
| 822 | 843 | case VIDIOCSFREQ32: |
| 844 | +#endif | |
| 823 | 845 | case VIDIOC_QUERYCAP: |
| 824 | 846 | case VIDIOC_ENUM_FMT: |
| 825 | 847 | case VIDIOC_G_FMT32: |
| ... | ... | @@ -851,6 +873,7 @@ |
| 851 | 873 | ret = do_video_ioctl(file, cmd, arg); |
| 852 | 874 | break; |
| 853 | 875 | |
| 876 | +#ifdef CONFIG_VIDEO_V4L1_COMPAT | |
| 854 | 877 | /* Little v, the video4linux ioctls (conflict?) */ |
| 855 | 878 | case VIDIOCGCAP: |
| 856 | 879 | case VIDIOCGCHAN: |
| ... | ... | @@ -879,6 +902,7 @@ |
| 879 | 902 | case _IOR('v' , BASE_VIDIOCPRIVATE+7, int): |
| 880 | 903 | ret = native_ioctl(file, cmd, (unsigned long)compat_ptr(arg)); |
| 881 | 904 | break; |
| 905 | +#endif | |
| 882 | 906 | default: |
| 883 | 907 | v4l_print_ioctl("compat_ioctl32", cmd); |
| 884 | 908 | } |