aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-dev.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-dev.c32
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 */
762int __video_register_device(struct video_device *vdev, int type, int nr, 782int __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);