diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-dev.c')
-rw-r--r-- | drivers/media/v4l2-core/v4l2-dev.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/drivers/media/v4l2-core/v4l2-dev.c b/drivers/media/v4l2-core/v4l2-dev.c index 0a30dbf3d05c..634d863c05b4 100644 --- a/drivers/media/v4l2-core/v4l2-dev.c +++ b/drivers/media/v4l2-core/v4l2-dev.c | |||
@@ -554,6 +554,7 @@ static void determine_valid_ioctls(struct video_device *vdev) | |||
554 | bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER; | 554 | bool is_vid = vdev->vfl_type == VFL_TYPE_GRABBER; |
555 | bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI; | 555 | bool is_vbi = vdev->vfl_type == VFL_TYPE_VBI; |
556 | bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO; | 556 | bool is_radio = vdev->vfl_type == VFL_TYPE_RADIO; |
557 | bool is_sdr = vdev->vfl_type == VFL_TYPE_SDR; | ||
557 | bool is_rx = vdev->vfl_dir != VFL_DIR_TX; | 558 | bool is_rx = vdev->vfl_dir != VFL_DIR_TX; |
558 | bool is_tx = vdev->vfl_dir != VFL_DIR_RX; | 559 | bool is_tx = vdev->vfl_dir != VFL_DIR_RX; |
559 | 560 | ||
@@ -662,9 +663,20 @@ static void determine_valid_ioctls(struct video_device *vdev) | |||
662 | ops->vidioc_try_fmt_sliced_vbi_out))) | 663 | ops->vidioc_try_fmt_sliced_vbi_out))) |
663 | set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); | 664 | set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); |
664 | SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap); | 665 | SET_VALID_IOCTL(ops, VIDIOC_G_SLICED_VBI_CAP, vidioc_g_sliced_vbi_cap); |
666 | } else if (is_sdr) { | ||
667 | /* SDR specific ioctls */ | ||
668 | if (ops->vidioc_enum_fmt_sdr_cap) | ||
669 | set_bit(_IOC_NR(VIDIOC_ENUM_FMT), valid_ioctls); | ||
670 | if (ops->vidioc_g_fmt_sdr_cap) | ||
671 | set_bit(_IOC_NR(VIDIOC_G_FMT), valid_ioctls); | ||
672 | if (ops->vidioc_s_fmt_sdr_cap) | ||
673 | set_bit(_IOC_NR(VIDIOC_S_FMT), valid_ioctls); | ||
674 | if (ops->vidioc_try_fmt_sdr_cap) | ||
675 | set_bit(_IOC_NR(VIDIOC_TRY_FMT), valid_ioctls); | ||
665 | } | 676 | } |
666 | if (!is_radio) { | 677 | |
667 | /* ioctls valid for video or vbi */ | 678 | if (is_vid || is_vbi || is_sdr) { |
679 | /* ioctls valid for video, vbi or sdr */ | ||
668 | SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs); | 680 | SET_VALID_IOCTL(ops, VIDIOC_REQBUFS, vidioc_reqbufs); |
669 | SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf); | 681 | SET_VALID_IOCTL(ops, VIDIOC_QUERYBUF, vidioc_querybuf); |
670 | SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf); | 682 | SET_VALID_IOCTL(ops, VIDIOC_QBUF, vidioc_qbuf); |
@@ -672,6 +684,10 @@ static void determine_valid_ioctls(struct video_device *vdev) | |||
672 | SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf); | 684 | SET_VALID_IOCTL(ops, VIDIOC_DQBUF, vidioc_dqbuf); |
673 | SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs); | 685 | SET_VALID_IOCTL(ops, VIDIOC_CREATE_BUFS, vidioc_create_bufs); |
674 | SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf); | 686 | SET_VALID_IOCTL(ops, VIDIOC_PREPARE_BUF, vidioc_prepare_buf); |
687 | } | ||
688 | |||
689 | if (is_vid || is_vbi) { | ||
690 | /* ioctls valid for video or vbi */ | ||
675 | if (ops->vidioc_s_std) | 691 | if (ops->vidioc_s_std) |
676 | set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls); | 692 | set_bit(_IOC_NR(VIDIOC_ENUMSTD), valid_ioctls); |
677 | SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std); | 693 | SET_VALID_IOCTL(ops, VIDIOC_S_STD, vidioc_s_std); |
@@ -685,6 +701,7 @@ static void determine_valid_ioctls(struct video_device *vdev) | |||
685 | SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); | 701 | SET_VALID_IOCTL(ops, VIDIOC_G_AUDIO, vidioc_g_audio); |
686 | SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); | 702 | SET_VALID_IOCTL(ops, VIDIOC_S_AUDIO, vidioc_s_audio); |
687 | SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); | 703 | SET_VALID_IOCTL(ops, VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings); |
704 | SET_VALID_IOCTL(ops, VIDIOC_S_EDID, vidioc_s_edid); | ||
688 | } | 705 | } |
689 | if (is_tx) { | 706 | if (is_tx) { |
690 | SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); | 707 | SET_VALID_IOCTL(ops, VIDIOC_ENUMOUTPUT, vidioc_enum_output); |
@@ -710,9 +727,10 @@ static void determine_valid_ioctls(struct video_device *vdev) | |||
710 | SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings); | 727 | SET_VALID_IOCTL(ops, VIDIOC_G_DV_TIMINGS, vidioc_g_dv_timings); |
711 | SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings); | 728 | SET_VALID_IOCTL(ops, VIDIOC_ENUM_DV_TIMINGS, vidioc_enum_dv_timings); |
712 | SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap); | 729 | SET_VALID_IOCTL(ops, VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap); |
730 | SET_VALID_IOCTL(ops, VIDIOC_G_EDID, vidioc_g_edid); | ||
713 | } | 731 | } |
714 | if (is_tx) { | 732 | if (is_tx && (is_radio || is_sdr)) { |
715 | /* transmitter only ioctls */ | 733 | /* radio transmitter only ioctls */ |
716 | SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator); | 734 | SET_VALID_IOCTL(ops, VIDIOC_G_MODULATOR, vidioc_g_modulator); |
717 | SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator); | 735 | SET_VALID_IOCTL(ops, VIDIOC_S_MODULATOR, vidioc_s_modulator); |
718 | } | 736 | } |
@@ -758,6 +776,8 @@ static void determine_valid_ioctls(struct video_device *vdev) | |||
758 | * %VFL_TYPE_RADIO - A radio card | 776 | * %VFL_TYPE_RADIO - A radio card |
759 | * | 777 | * |
760 | * %VFL_TYPE_SUBDEV - A subdevice | 778 | * %VFL_TYPE_SUBDEV - A subdevice |
779 | * | ||
780 | * %VFL_TYPE_SDR - Software Defined Radio | ||
761 | */ | 781 | */ |
762 | int __video_register_device(struct video_device *vdev, int type, int nr, | 782 | int __video_register_device(struct video_device *vdev, int type, int nr, |
763 | int warn_if_nr_in_use, struct module *owner) | 783 | int warn_if_nr_in_use, struct module *owner) |
@@ -797,6 +817,10 @@ int __video_register_device(struct video_device *vdev, int type, int nr, | |||
797 | case VFL_TYPE_SUBDEV: | 817 | case VFL_TYPE_SUBDEV: |
798 | name_base = "v4l-subdev"; | 818 | name_base = "v4l-subdev"; |
799 | break; | 819 | break; |
820 | case VFL_TYPE_SDR: | ||
821 | /* Use device name 'swradio' because 'sdr' was already taken. */ | ||
822 | name_base = "swradio"; | ||
823 | break; | ||
800 | default: | 824 | default: |
801 | printk(KERN_ERR "%s called with unknown type: %d\n", | 825 | printk(KERN_ERR "%s called with unknown type: %d\n", |
802 | __func__, type); | 826 | __func__, type); |