Lines Matching +full:mux +full:- +full:ctrl +full:- +full:list

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
11 #include "saa7134-reg.h"
14 #include <linux/list.h>
20 #include <media/v4l2-common.h>
21 #include <media/v4l2-event.h>
24 /* ------------------------------------------------------------------ */
31 static char secam[] = "--";
35 MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
47 /* ------------------------------------------------------------------ */
55 /* ------------------------------------------------------------------ */
68 /* ------------------------------------------------------------------ */
84 /* ------------------------------------------------------------------ */
207 .name = "PAL-BG",
219 .name = "PAL-I",
231 .name = "PAL-DK",
267 .name = "SECAM-DK",
279 .name = "SECAM-L",
291 .name = "SECAM-Lc",
303 .name = "PAL-M",
315 .name = "PAL-Nc",
327 .name = "PAL-60",
359 /* ------------------------------------------------------------------ */
363 video_dbg("set tv norm = %s\n", norm->name); in set_tvnorm()
364 dev->tvnorm = norm; in set_tvnorm()
367 dev->crop_bounds.left = norm->h_start; in set_tvnorm()
368 dev->crop_defrect.left = norm->h_start; in set_tvnorm()
369 dev->crop_bounds.width = norm->h_stop - norm->h_start +1; in set_tvnorm()
370 dev->crop_defrect.width = norm->h_stop - norm->h_start +1; in set_tvnorm()
372 dev->crop_bounds.top = (norm->vbi_v_stop_0+1)*2; in set_tvnorm()
373 dev->crop_defrect.top = norm->video_v_start*2; in set_tvnorm()
374 dev->crop_bounds.height = ((norm->id & V4L2_STD_525_60) ? 524 : 624) in set_tvnorm()
375 - dev->crop_bounds.top; in set_tvnorm()
376 dev->crop_defrect.height = (norm->video_v_stop - norm->video_v_start +1)*2; in set_tvnorm()
378 dev->crop_current = dev->crop_defrect; in set_tvnorm()
387 dev->ctl_input = input; in video_mux()
388 set_tvnorm(dev, dev->tvnorm); in video_mux()
395 int luma_control, sync_control, chroma_ctrl1, mux; in saa7134_set_decoder() local
397 struct saa7134_tvnorm *norm = dev->tvnorm; in saa7134_set_decoder()
398 mux = card_in(dev, dev->ctl_input).vmux; in saa7134_set_decoder()
400 luma_control = norm->luma_control; in saa7134_set_decoder()
401 sync_control = norm->sync_control; in saa7134_set_decoder()
402 chroma_ctrl1 = norm->chroma_ctrl1; in saa7134_set_decoder()
404 if (mux > 5) in saa7134_set_decoder()
406 if (noninterlaced || dev->nosignal) in saa7134_set_decoder()
417 saa_writeb(SAA7134_ANALOG_IN_CTRL1, 0xc0 | mux); in saa7134_set_decoder()
424 saa_writeb(SAA7134_SOURCE_TIMING1, norm->src_timing); in saa7134_set_decoder()
428 saa_writeb(SAA7134_DEC_LUMA_BRIGHT, dev->ctl_bright); in saa7134_set_decoder()
431 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast); in saa7134_set_decoder()
434 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation); in saa7134_set_decoder()
436 saa_writeb(SAA7134_DEC_CHROMA_HUE, dev->ctl_hue); in saa7134_set_decoder()
438 saa_writeb(SAA7134_CHROMA_GAIN, norm->chroma_gain); in saa7134_set_decoder()
440 saa_writeb(SAA7134_CHROMA_CTRL2, norm->chroma_ctrl2); in saa7134_set_decoder()
446 saa_writeb(SAA7134_MISC_VGATE_MSB, norm->vgate_misc); in saa7134_set_decoder()
455 saa_call_all(dev, video, s_std, dev->tvnorm->id); in saa7134_set_tvnorm_hw()
458 saa_call_empress(dev, video, s_std, dev->tvnorm->id); in saa7134_set_tvnorm_hw()
506 mirror = (dev->ctl_mirror) ? 0x02 : 0x00; in set_v_scale()
532 h_start = dev->crop_current.left; in set_size()
533 v_start = dev->crop_current.top/2; in set_size()
534 h_stop = (dev->crop_current.left + dev->crop_current.width -1); in set_size()
535 v_stop = (dev->crop_current.top + dev->crop_current.height -1)/2; in set_size()
546 prescale = dev->crop_current.width / width; in set_size()
549 xscale = 1024 * dev->crop_current.width / prescale / width; in set_size()
550 yscale = 512 * div * dev->crop_current.height / height; in set_size()
564 y_odd = dev->ctl_y_odd; in set_size()
565 y_even = dev->ctl_y_even; in set_size()
572 /* ------------------------------------------------------------------ */
581 struct media_device *mdev = dev->media_dev; in saa7134_enable_analog_tuner()
586 if (!mdev || !dev->decoder) in saa7134_enable_analog_tuner()
596 list_for_each_entry(link, &dev->decoder->links, list) { in saa7134_enable_analog_tuner()
597 if (link->sink->entity == dev->decoder) { in saa7134_enable_analog_tuner()
599 if (link->flags & MEDIA_LNK_FL_ENABLED) in saa7134_enable_analog_tuner()
608 source = found_link->source->entity; in saa7134_enable_analog_tuner()
609 list_for_each_entry(link, &source->links, list) { in saa7134_enable_analog_tuner()
613 sink = link->sink->entity; in saa7134_enable_analog_tuner()
615 if (sink == dev->decoder) in saa7134_enable_analog_tuner()
620 pr_err("Couldn't change link %s->%s to %s. Error %d\n", in saa7134_enable_analog_tuner()
621 source->name, sink->name, in saa7134_enable_analog_tuner()
631 /* ------------------------------------------------------------------ */
637 struct saa7134_dmaqueue *dmaq = buf->vb2.vb2_buf.vb2_queue->drv_priv; in buffer_activate()
642 buf->top_seen = 0; in buffer_activate()
644 set_size(dev, TASK_A, dev->width, dev->height, in buffer_activate()
645 V4L2_FIELD_HAS_BOTH(dev->field)); in buffer_activate()
646 if (dev->fmt->yuv) in buffer_activate()
650 saa_writeb(SAA7134_OFMT_VIDEO_A, dev->fmt->pm); in buffer_activate()
654 if (dev->fmt->planar) in buffer_activate()
655 bpl = dev->width; in buffer_activate()
657 bpl = (dev->width * dev->fmt->depth) / 8; in buffer_activate()
660 (dmaq->pt.dma >> 12); in buffer_activate()
661 if (dev->fmt->bswap) in buffer_activate()
663 if (dev->fmt->wswap) in buffer_activate()
665 if (V4L2_FIELD_HAS_BOTH(dev->field)) { in buffer_activate()
671 /* non-interlaced */ in buffer_activate()
678 if (dev->fmt->planar) { in buffer_activate()
680 bpl_uv = bpl >> dev->fmt->hshift; in buffer_activate()
681 lines_uv = dev->height >> dev->fmt->vshift; in buffer_activate()
682 base2 = base + bpl * dev->height; in buffer_activate()
684 if (dev->fmt->uvswap) in buffer_activate()
688 if (V4L2_FIELD_HAS_BOTH(dev->field)) { in buffer_activate()
697 /* non-interlaced */ in buffer_activate()
711 mod_timer(&dmaq->timeout, jiffies + BUFFER_TIMEOUT); in buffer_activate()
717 struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv; in buffer_init()
721 dmaq->curr = NULL; in buffer_init()
722 buf->activate = buffer_activate; in buffer_init()
728 struct saa7134_dmaqueue *dmaq = vb2->vb2_queue->drv_priv; in buffer_prepare()
729 struct saa7134_dev *dev = dmaq->dev; in buffer_prepare()
735 if (dma->sgl->offset) { in buffer_prepare()
736 pr_err("The buffer is not page-aligned\n"); in buffer_prepare()
737 return -EINVAL; in buffer_prepare()
739 size = (dev->width * dev->height * dev->fmt->depth) >> 3; in buffer_prepare()
741 return -EINVAL; in buffer_prepare()
744 vbuf->field = dev->field; in buffer_prepare()
746 return saa7134_pgtable_build(dev->pci, &dmaq->pt, dma->sgl, dma->nents, in buffer_prepare()
754 struct saa7134_dmaqueue *dmaq = q->drv_priv; in queue_setup()
755 struct saa7134_dev *dev = dmaq->dev; in queue_setup()
756 int size = dev->fmt->depth * dev->width * dev->height >> 3; in queue_setup()
758 if (dev->width < 48 || in queue_setup()
759 dev->height < 32 || in queue_setup()
760 dev->width/4 > dev->crop_current.width || in queue_setup()
761 dev->height/4 > dev->crop_current.height || in queue_setup()
762 dev->width > dev->crop_bounds.width || in queue_setup()
763 dev->height > dev->crop_bounds.height) in queue_setup()
764 return -EINVAL; in queue_setup()
780 struct saa7134_dmaqueue *dmaq = vb->vb2_queue->drv_priv; in saa7134_vb2_buffer_queue()
781 struct saa7134_dev *dev = dmaq->dev; in saa7134_vb2_buffer_queue()
791 struct saa7134_dmaqueue *dmaq = vq->drv_priv; in saa7134_vb2_start_streaming()
792 struct saa7134_dev *dev = dmaq->dev; in saa7134_vb2_start_streaming()
798 if (card_is_empress(dev) && vb2_is_busy(&dev->empress_vbq) && in saa7134_vb2_start_streaming()
799 dmaq == &dev->video_q && dev->fmt->planar) { in saa7134_vb2_start_streaming()
802 list_for_each_entry_safe(buf, tmp, &dmaq->queue, entry) { in saa7134_vb2_start_streaming()
803 list_del(&buf->entry); in saa7134_vb2_start_streaming()
804 vb2_buffer_done(&buf->vb2.vb2_buf, in saa7134_vb2_start_streaming()
807 if (dmaq->curr) { in saa7134_vb2_start_streaming()
808 vb2_buffer_done(&dmaq->curr->vb2.vb2_buf, in saa7134_vb2_start_streaming()
810 dmaq->curr = NULL; in saa7134_vb2_start_streaming()
812 return -EBUSY; in saa7134_vb2_start_streaming()
819 * Unfortunately, I lack register-level documentation to check the in saa7134_vb2_start_streaming()
822 if ((dmaq == &dev->video_q && !vb2_is_streaming(&dev->vbi_vbq)) || in saa7134_vb2_start_streaming()
823 (dmaq == &dev->vbi_q && !vb2_is_streaming(&dev->video_vbq))) in saa7134_vb2_start_streaming()
824 cpu_latency_qos_add_request(&dev->qos_request, 20); in saa7134_vb2_start_streaming()
825 dmaq->seq_nr = 0; in saa7134_vb2_start_streaming()
832 struct saa7134_dmaqueue *dmaq = vq->drv_priv; in saa7134_vb2_stop_streaming()
833 struct saa7134_dev *dev = dmaq->dev; in saa7134_vb2_stop_streaming()
837 if ((dmaq == &dev->video_q && !vb2_is_streaming(&dev->vbi_vbq)) || in saa7134_vb2_stop_streaming()
838 (dmaq == &dev->vbi_q && !vb2_is_streaming(&dev->video_vbq))) in saa7134_vb2_stop_streaming()
839 cpu_latency_qos_remove_request(&dev->qos_request); in saa7134_vb2_stop_streaming()
853 /* ------------------------------------------------------------------ */
855 static int saa7134_s_ctrl(struct v4l2_ctrl *ctrl) in saa7134_s_ctrl() argument
857 struct saa7134_dev *dev = container_of(ctrl->handler, struct saa7134_dev, ctrl_handler); in saa7134_s_ctrl()
859 switch (ctrl->id) { in saa7134_s_ctrl()
861 dev->ctl_bright = ctrl->val; in saa7134_s_ctrl()
862 saa_writeb(SAA7134_DEC_LUMA_BRIGHT, ctrl->val); in saa7134_s_ctrl()
865 dev->ctl_hue = ctrl->val; in saa7134_s_ctrl()
866 saa_writeb(SAA7134_DEC_CHROMA_HUE, ctrl->val); in saa7134_s_ctrl()
869 dev->ctl_contrast = ctrl->val; in saa7134_s_ctrl()
871 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast); in saa7134_s_ctrl()
874 dev->ctl_saturation = ctrl->val; in saa7134_s_ctrl()
876 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation); in saa7134_s_ctrl()
879 dev->ctl_mute = ctrl->val; in saa7134_s_ctrl()
883 dev->ctl_volume = ctrl->val; in saa7134_s_ctrl()
884 saa7134_tvaudio_setvolume(dev,dev->ctl_volume); in saa7134_s_ctrl()
887 dev->ctl_invert = ctrl->val; in saa7134_s_ctrl()
889 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast); in saa7134_s_ctrl()
891 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation); in saa7134_s_ctrl()
894 dev->ctl_mirror = ctrl->val; in saa7134_s_ctrl()
897 dev->ctl_y_even = ctrl->val; in saa7134_s_ctrl()
900 dev->ctl_y_odd = ctrl->val; in saa7134_s_ctrl()
907 tda9887_cfg.priv = &dev->tda9887_conf; in saa7134_s_ctrl()
909 dev->ctl_automute = ctrl->val; in saa7134_s_ctrl()
910 if (dev->tda9887_conf) { in saa7134_s_ctrl()
911 if (dev->ctl_automute) in saa7134_s_ctrl()
912 dev->tda9887_conf |= TDA9887_AUTOMUTE; in saa7134_s_ctrl()
914 dev->tda9887_conf &= ~TDA9887_AUTOMUTE; in saa7134_s_ctrl()
921 return -EINVAL; in saa7134_s_ctrl()
926 /* ------------------------------------------------------------------ */
937 mutex_lock(&dev->lock); in video_open()
938 if (vdev->vfl_type == VFL_TYPE_RADIO) { in video_open()
944 video_mux(dev, dev->ctl_input); in video_open()
946 mutex_unlock(&dev->lock); in video_open()
957 mutex_lock(&dev->lock); in video_release()
960 if (vdev->vfl_type == VFL_TYPE_RADIO) in video_release()
965 /* ts-capture will not work in planar mode, so turn it off Hac: 04.05*/ in video_release()
972 if (vdev->vfl_type == VFL_TYPE_RADIO) in video_release()
974 mutex_unlock(&dev->lock); in video_release()
986 cmd.nonblocking = file->f_flags & O_NONBLOCK; in radio_read()
989 cmd.result = -ENODEV; in radio_read()
991 mutex_lock(&dev->lock); in radio_read()
993 mutex_unlock(&dev->lock); in radio_read()
1007 mutex_lock(&dev->lock); in radio_poll()
1009 mutex_unlock(&dev->lock); in radio_poll()
1014 /* ------------------------------------------------------------------ */
1020 struct saa7134_tvnorm *norm = dev->tvnorm; in saa7134_try_get_set_fmt_vbi_cap()
1022 memset(&f->fmt.vbi.reserved, 0, sizeof(f->fmt.vbi.reserved)); in saa7134_try_get_set_fmt_vbi_cap()
1023 f->fmt.vbi.sampling_rate = 6750000 * 4; in saa7134_try_get_set_fmt_vbi_cap()
1024 f->fmt.vbi.samples_per_line = 2048 /* VBI_LINE_LENGTH */; in saa7134_try_get_set_fmt_vbi_cap()
1025 f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY; in saa7134_try_get_set_fmt_vbi_cap()
1026 f->fmt.vbi.offset = 64 * 4; in saa7134_try_get_set_fmt_vbi_cap()
1027 f->fmt.vbi.start[0] = norm->vbi_v_start_0; in saa7134_try_get_set_fmt_vbi_cap()
1028 f->fmt.vbi.count[0] = norm->vbi_v_stop_0 - norm->vbi_v_start_0 +1; in saa7134_try_get_set_fmt_vbi_cap()
1029 f->fmt.vbi.start[1] = norm->vbi_v_start_1; in saa7134_try_get_set_fmt_vbi_cap()
1030 f->fmt.vbi.count[1] = f->fmt.vbi.count[0]; in saa7134_try_get_set_fmt_vbi_cap()
1031 f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */ in saa7134_try_get_set_fmt_vbi_cap()
1041 f->fmt.pix.width = dev->width; in saa7134_g_fmt_vid_cap()
1042 f->fmt.pix.height = dev->height; in saa7134_g_fmt_vid_cap()
1043 f->fmt.pix.field = dev->field; in saa7134_g_fmt_vid_cap()
1044 f->fmt.pix.pixelformat = dev->fmt->fourcc; in saa7134_g_fmt_vid_cap()
1045 if (dev->fmt->planar) in saa7134_g_fmt_vid_cap()
1046 f->fmt.pix.bytesperline = f->fmt.pix.width; in saa7134_g_fmt_vid_cap()
1048 f->fmt.pix.bytesperline = in saa7134_g_fmt_vid_cap()
1049 (f->fmt.pix.width * dev->fmt->depth) / 8; in saa7134_g_fmt_vid_cap()
1050 f->fmt.pix.sizeimage = in saa7134_g_fmt_vid_cap()
1051 (f->fmt.pix.height * f->fmt.pix.width * dev->fmt->depth) / 8; in saa7134_g_fmt_vid_cap()
1052 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in saa7134_g_fmt_vid_cap()
1064 fmt = format_by_fourcc(f->fmt.pix.pixelformat); in saa7134_try_fmt_vid_cap()
1066 return -EINVAL; in saa7134_try_fmt_vid_cap()
1068 field = f->fmt.pix.field; in saa7134_try_fmt_vid_cap()
1069 maxw = min(dev->crop_current.width*4, dev->crop_bounds.width); in saa7134_try_fmt_vid_cap()
1070 maxh = min(dev->crop_current.height*4, dev->crop_bounds.height); in saa7134_try_fmt_vid_cap()
1073 field = (f->fmt.pix.height > maxh/2) in saa7134_try_fmt_vid_cap()
1087 f->fmt.pix.field = field; in saa7134_try_fmt_vid_cap()
1088 if (f->fmt.pix.width < 48) in saa7134_try_fmt_vid_cap()
1089 f->fmt.pix.width = 48; in saa7134_try_fmt_vid_cap()
1090 if (f->fmt.pix.height < 32) in saa7134_try_fmt_vid_cap()
1091 f->fmt.pix.height = 32; in saa7134_try_fmt_vid_cap()
1092 if (f->fmt.pix.width > maxw) in saa7134_try_fmt_vid_cap()
1093 f->fmt.pix.width = maxw; in saa7134_try_fmt_vid_cap()
1094 if (f->fmt.pix.height > maxh) in saa7134_try_fmt_vid_cap()
1095 f->fmt.pix.height = maxh; in saa7134_try_fmt_vid_cap()
1096 f->fmt.pix.width &= ~0x03; in saa7134_try_fmt_vid_cap()
1097 if (fmt->planar) in saa7134_try_fmt_vid_cap()
1098 f->fmt.pix.bytesperline = f->fmt.pix.width; in saa7134_try_fmt_vid_cap()
1100 f->fmt.pix.bytesperline = in saa7134_try_fmt_vid_cap()
1101 (f->fmt.pix.width * fmt->depth) / 8; in saa7134_try_fmt_vid_cap()
1102 f->fmt.pix.sizeimage = in saa7134_try_fmt_vid_cap()
1103 (f->fmt.pix.height * f->fmt.pix.width * fmt->depth) / 8; in saa7134_try_fmt_vid_cap()
1104 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in saa7134_try_fmt_vid_cap()
1119 dev->fmt = format_by_fourcc(f->fmt.pix.pixelformat); in saa7134_s_fmt_vid_cap()
1120 dev->width = f->fmt.pix.width; in saa7134_s_fmt_vid_cap()
1121 dev->height = f->fmt.pix.height; in saa7134_s_fmt_vid_cap()
1122 dev->field = f->fmt.pix.field; in saa7134_s_fmt_vid_cap()
1131 n = i->index; in saa7134_enum_input()
1133 return -EINVAL; in saa7134_enum_input()
1134 if (card_in(dev, i->index).type == SAA7134_NO_INPUT) in saa7134_enum_input()
1135 return -EINVAL; in saa7134_enum_input()
1136 i->index = n; in saa7134_enum_input()
1137 strscpy(i->name, saa7134_input_name[card_in(dev, n).type], in saa7134_enum_input()
1138 sizeof(i->name)); in saa7134_enum_input()
1142 i->type = V4L2_INPUT_TYPE_TUNER; in saa7134_enum_input()
1145 i->type = V4L2_INPUT_TYPE_CAMERA; in saa7134_enum_input()
1148 if (n == dev->ctl_input) { in saa7134_enum_input()
1153 i->status |= V4L2_IN_ST_NO_H_LOCK; in saa7134_enum_input()
1155 i->status |= V4L2_IN_ST_NO_SIGNAL; in saa7134_enum_input()
1157 i->status |= V4L2_IN_ST_MACROVISION; in saa7134_enum_input()
1159 i->std = SAA7134_NORMS; in saa7134_enum_input()
1168 *i = dev->ctl_input; in saa7134_g_input()
1178 return -EINVAL; in saa7134_s_input()
1180 return -EINVAL; in saa7134_s_input()
1191 strscpy(cap->driver, "saa7134", sizeof(cap->driver)); in saa7134_querycap()
1192 strscpy(cap->card, saa7134_boards[dev->board].name, in saa7134_querycap()
1193 sizeof(cap->card)); in saa7134_querycap()
1194 cap->capabilities = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | in saa7134_querycap()
1197 if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type != UNSET) in saa7134_querycap()
1198 cap->capabilities |= V4L2_CAP_TUNER; in saa7134_querycap()
1199 if (dev->has_rds) in saa7134_querycap()
1200 cap->capabilities |= V4L2_CAP_RDS_CAPTURE; in saa7134_querycap()
1221 return -EINVAL; in saa7134_s_std()
1223 if ((id & V4L2_STD_SECAM) && (secam[0] != '-')) { in saa7134_s_std()
1240 return -EINVAL; in saa7134_s_std()
1254 *id = dev->tvnorm->id; in saa7134_g_std()
1294 return -EINVAL; in saa7134_g_pixelaspect()
1296 if (dev->tvnorm->id & V4L2_STD_525_60) { in saa7134_g_pixelaspect()
1297 f->numerator = 11; in saa7134_g_pixelaspect()
1298 f->denominator = 10; in saa7134_g_pixelaspect()
1300 if (dev->tvnorm->id & V4L2_STD_625_50) { in saa7134_g_pixelaspect()
1301 f->numerator = 54; in saa7134_g_pixelaspect()
1302 f->denominator = 59; in saa7134_g_pixelaspect()
1311 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in saa7134_g_selection()
1312 return -EINVAL; in saa7134_g_selection()
1314 switch (sel->target) { in saa7134_g_selection()
1316 sel->r = dev->crop_current; in saa7134_g_selection()
1319 sel->r = dev->crop_defrect; in saa7134_g_selection()
1322 sel->r = dev->crop_bounds; in saa7134_g_selection()
1325 return -EINVAL; in saa7134_g_selection()
1333 struct v4l2_rect *b = &dev->crop_bounds; in saa7134_s_selection()
1334 struct v4l2_rect *c = &dev->crop_current; in saa7134_s_selection()
1336 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in saa7134_s_selection()
1337 return -EINVAL; in saa7134_s_selection()
1339 if (sel->target != V4L2_SEL_TGT_CROP) in saa7134_s_selection()
1340 return -EINVAL; in saa7134_s_selection()
1342 if (vb2_is_streaming(&dev->video_vbq)) in saa7134_s_selection()
1343 return -EBUSY; in saa7134_s_selection()
1345 *c = sel->r; in saa7134_s_selection()
1346 if (c->top < b->top) in saa7134_s_selection()
1347 c->top = b->top; in saa7134_s_selection()
1348 if (c->top > b->top + b->height) in saa7134_s_selection()
1349 c->top = b->top + b->height; in saa7134_s_selection()
1350 if (c->height > b->top - c->top + b->height) in saa7134_s_selection()
1351 c->height = b->top - c->top + b->height; in saa7134_s_selection()
1353 if (c->left < b->left) in saa7134_s_selection()
1354 c->left = b->left; in saa7134_s_selection()
1355 if (c->left > b->left + b->width) in saa7134_s_selection()
1356 c->left = b->left + b->width; in saa7134_s_selection()
1357 if (c->width > b->left - c->left + b->width) in saa7134_s_selection()
1358 c->width = b->left - c->left + b->width; in saa7134_s_selection()
1359 sel->r = *c; in saa7134_s_selection()
1369 if (0 != t->index) in saa7134_g_tuner()
1370 return -EINVAL; in saa7134_g_tuner()
1378 return -EINVAL; in saa7134_g_tuner()
1380 strscpy(t->name, "Television", sizeof(t->name)); in saa7134_g_tuner()
1381 t->type = V4L2_TUNER_ANALOG_TV; in saa7134_g_tuner()
1383 t->capability = V4L2_TUNER_CAP_NORM | in saa7134_g_tuner()
1387 t->rxsubchans = saa7134_tvaudio_getstereo(dev); in saa7134_g_tuner()
1388 t->audmode = saa7134_tvaudio_rx2mode(t->rxsubchans); in saa7134_g_tuner()
1391 t->signal = 0xffff; in saa7134_g_tuner()
1402 if (0 != t->index) in saa7134_s_tuner()
1403 return -EINVAL; in saa7134_s_tuner()
1405 mode = dev->thread.mode; in saa7134_s_tuner()
1410 if (mode != t->audmode) in saa7134_s_tuner()
1411 dev->thread.mode = t->audmode; in saa7134_s_tuner()
1422 if (0 != f->tuner) in saa7134_g_frequency()
1423 return -EINVAL; in saa7134_g_frequency()
1436 if (0 != f->tuner) in saa7134_s_frequency()
1437 return -EINVAL; in saa7134_s_frequency()
1449 if (f->index >= FORMATS) in saa7134_enum_fmt_vid_cap()
1450 return -EINVAL; in saa7134_enum_fmt_vid_cap()
1452 f->pixelformat = formats[f->index].fourcc; in saa7134_enum_fmt_vid_cap()
1463 reg->val = saa_readb(reg->reg & 0xffffff); in vidioc_g_register()
1464 reg->size = 1; in vidioc_g_register()
1473 saa_writeb(reg->reg & 0xffffff, reg->val); in vidioc_s_register()
1483 if (0 != t->index) in radio_g_tuner()
1484 return -EINVAL; in radio_g_tuner()
1486 strscpy(t->name, "Radio", sizeof(t->name)); in radio_g_tuner()
1489 t->audmode &= V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO; in radio_g_tuner()
1490 if (dev->input->amux == TV) { in radio_g_tuner()
1491 t->signal = 0xf800 - ((saa_readb(0x581) & 0x1f) << 11); in radio_g_tuner()
1492 t->rxsubchans = (saa_readb(0x529) & 0x08) ? in radio_g_tuner()
1502 if (0 != t->index) in radio_s_tuner()
1503 return -EINVAL; in radio_s_tuner()
1577 /* ----------------------------------------------------------- */
1581 .name = "saa7134-video",
1588 .name = "saa7134-radio",
1640 struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler; in saa7134_video_init1()
1649 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK; in saa7134_video_init1()
1659 V4L2_CID_HUE, -128, 127, 1, 0); in saa7134_video_init1()
1665 V4L2_CID_AUDIO_VOLUME, -15, 15, 1, 0); in saa7134_video_init1()
1670 if (hdl->error) in saa7134_video_init1()
1671 return hdl->error; in saa7134_video_init1()
1673 hdl = &dev->radio_ctrl_handler; in saa7134_video_init1()
1675 v4l2_ctrl_add_handler(hdl, &dev->ctrl_handler, in saa7134_video_init1()
1677 if (hdl->error) in saa7134_video_init1()
1678 return hdl->error; in saa7134_video_init1()
1680 dev->ctl_mute = 1; in saa7134_video_init1()
1682 if (dev->tda9887_conf && saa7134_ctrl_automute.def) in saa7134_video_init1()
1683 dev->tda9887_conf |= TDA9887_AUTOMUTE; in saa7134_video_init1()
1684 dev->automute = 0; in saa7134_video_init1()
1686 INIT_LIST_HEAD(&dev->video_q.queue); in saa7134_video_init1()
1687 timer_setup(&dev->video_q.timeout, saa7134_buffer_timeout, 0); in saa7134_video_init1()
1688 dev->video_q.dev = dev; in saa7134_video_init1()
1689 dev->fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24); in saa7134_video_init1()
1690 dev->width = 720; in saa7134_video_init1()
1691 dev->height = 576; in saa7134_video_init1()
1692 dev->field = V4L2_FIELD_INTERLACED; in saa7134_video_init1()
1694 if (saa7134_boards[dev->board].video_out) in saa7134_video_init1()
1697 q = &dev->video_vbq; in saa7134_video_init1()
1698 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in saa7134_video_init1()
1702 * of a page. A user-provided pointer can start anywhere in a page, so in saa7134_video_init1()
1703 * USERPTR support is a no-go unless the application knows about these in saa7134_video_init1()
1706 q->io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ; in saa7134_video_init1()
1708 q->io_modes |= VB2_USERPTR; in saa7134_video_init1()
1709 q->drv_priv = &dev->video_q; in saa7134_video_init1()
1710 q->ops = &vb2_qops; in saa7134_video_init1()
1711 q->gfp_flags = GFP_DMA32; in saa7134_video_init1()
1712 q->mem_ops = &vb2_dma_sg_memops; in saa7134_video_init1()
1713 q->buf_struct_size = sizeof(struct saa7134_buf); in saa7134_video_init1()
1714 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in saa7134_video_init1()
1715 q->lock = &dev->lock; in saa7134_video_init1()
1716 q->dev = &dev->pci->dev; in saa7134_video_init1()
1720 saa7134_pgtable_alloc(dev->pci, &dev->video_q.pt); in saa7134_video_init1()
1722 q = &dev->vbi_vbq; in saa7134_video_init1()
1723 q->type = V4L2_BUF_TYPE_VBI_CAPTURE; in saa7134_video_init1()
1725 q->io_modes = VB2_MMAP | VB2_READ; in saa7134_video_init1()
1727 q->io_modes |= VB2_USERPTR; in saa7134_video_init1()
1728 q->drv_priv = &dev->vbi_q; in saa7134_video_init1()
1729 q->ops = &saa7134_vbi_qops; in saa7134_video_init1()
1730 q->gfp_flags = GFP_DMA32; in saa7134_video_init1()
1731 q->mem_ops = &vb2_dma_sg_memops; in saa7134_video_init1()
1732 q->buf_struct_size = sizeof(struct saa7134_buf); in saa7134_video_init1()
1733 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in saa7134_video_init1()
1734 q->lock = &dev->lock; in saa7134_video_init1()
1735 q->dev = &dev->pci->dev; in saa7134_video_init1()
1739 saa7134_pgtable_alloc(dev->pci, &dev->vbi_q.pt); in saa7134_video_init1()
1746 del_timer_sync(&dev->video_q.timeout); in saa7134_video_fini()
1748 saa7134_pgtable_free(dev->pci, &dev->video_q.pt); in saa7134_video_fini()
1749 saa7134_pgtable_free(dev->pci, &dev->vbi_q.pt); in saa7134_video_fini()
1750 v4l2_ctrl_handler_free(&dev->ctrl_handler); in saa7134_video_fini()
1752 v4l2_ctrl_handler_free(&dev->radio_ctrl_handler); in saa7134_video_fini()
1758 int vo = saa7134_boards[dev->board].video_out; in saa7134_videoport_init()
1760 unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts; in saa7134_videoport_init()
1796 v4l2_ctrl_handler_setup(&dev->ctrl_handler); in saa7134_video_init2()
1798 saa7134_tvaudio_setvolume(dev,dev->ctl_volume); in saa7134_video_init2()
1814 dev->nosignal = (st1 & 0x40) || (st2 & 0x40) || !(st2 & 0x1); in saa7134_irq_video_signalchange()
1816 if (dev->nosignal) { in saa7134_irq_video_signalchange()
1817 /* no video signal -> mute audio */ in saa7134_irq_video_signalchange()
1818 if (dev->ctl_automute) in saa7134_irq_video_signalchange()
1819 dev->automute = 1; in saa7134_irq_video_signalchange()
1826 if ((st2 & 0x80) && !noninterlaced && !dev->nosignal) in saa7134_irq_video_signalchange()
1831 if (dev->mops && dev->mops->signal_change) in saa7134_irq_video_signalchange()
1832 dev->mops->signal_change(dev); in saa7134_irq_video_signalchange()
1840 spin_lock(&dev->slock); in saa7134_irq_video_done()
1841 if (dev->video_q.curr) { in saa7134_irq_video_done()
1842 field = dev->field; in saa7134_irq_video_done()
1846 dev->video_q.curr->top_seen = 1; in saa7134_irq_video_done()
1849 if (!dev->video_q.curr->top_seen) in saa7134_irq_video_done()
1858 saa7134_buffer_finish(dev, &dev->video_q, VB2_BUF_STATE_DONE); in saa7134_irq_video_done()
1860 saa7134_buffer_next(dev, &dev->video_q); in saa7134_irq_video_done()
1863 spin_unlock(&dev->slock); in saa7134_irq_video_done()