Lines Matching +full:input +full:- +full:depth

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * (c) 2001-03 Gerd Knorr <[email protected]> [SuSE Labs]
11 #include "saa7134-reg.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 /* ------------------------------------------------------------------ */
94 .depth = 8,
98 .depth = 16,
102 .depth = 16,
107 .depth = 16,
111 .depth = 16,
116 .depth = 24,
120 .depth = 24,
125 .depth = 32,
129 .depth = 32,
135 .depth = 16,
141 .depth = 16,
146 .depth = 16,
154 .depth = 12,
162 .depth = 12,
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()
383 static void video_mux(struct saa7134_dev *dev, int input) in video_mux() argument
385 video_dbg("video input = %d [%s]\n", in video_mux()
386 input, saa7134_input_name[card_in(dev, input).type]); in video_mux()
387 dev->ctl_input = input; in video_mux()
388 set_tvnorm(dev, dev->tvnorm); in video_mux()
389 saa7134_tvaudio_setinput(dev, &card_in(dev, input)); in video_mux()
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()
406 if (noninterlaced || dev->nosignal) 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()
592 * using an analog input instead of the tuner. However, as we can't 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()
851 /* ------------------------------------------------------------------ */
855 struct saa7134_dev *dev = container_of(ctrl->handler, struct saa7134_dev, ctrl_handler); in saa7134_s_ctrl()
857 switch (ctrl->id) { in saa7134_s_ctrl()
859 dev->ctl_bright = ctrl->val; in saa7134_s_ctrl()
860 saa_writeb(SAA7134_DEC_LUMA_BRIGHT, ctrl->val); in saa7134_s_ctrl()
863 dev->ctl_hue = ctrl->val; in saa7134_s_ctrl()
864 saa_writeb(SAA7134_DEC_CHROMA_HUE, ctrl->val); in saa7134_s_ctrl()
867 dev->ctl_contrast = ctrl->val; in saa7134_s_ctrl()
869 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast); in saa7134_s_ctrl()
872 dev->ctl_saturation = ctrl->val; in saa7134_s_ctrl()
874 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation); in saa7134_s_ctrl()
877 dev->ctl_mute = ctrl->val; in saa7134_s_ctrl()
881 dev->ctl_volume = ctrl->val; in saa7134_s_ctrl()
882 saa7134_tvaudio_setvolume(dev,dev->ctl_volume); in saa7134_s_ctrl()
885 dev->ctl_invert = ctrl->val; in saa7134_s_ctrl()
887 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast); in saa7134_s_ctrl()
889 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation); in saa7134_s_ctrl()
892 dev->ctl_mirror = ctrl->val; in saa7134_s_ctrl()
895 dev->ctl_y_even = ctrl->val; in saa7134_s_ctrl()
898 dev->ctl_y_odd = ctrl->val; in saa7134_s_ctrl()
905 tda9887_cfg.priv = &dev->tda9887_conf; in saa7134_s_ctrl()
907 dev->ctl_automute = ctrl->val; in saa7134_s_ctrl()
908 if (dev->tda9887_conf) { in saa7134_s_ctrl()
909 if (dev->ctl_automute) in saa7134_s_ctrl()
910 dev->tda9887_conf |= TDA9887_AUTOMUTE; in saa7134_s_ctrl()
912 dev->tda9887_conf &= ~TDA9887_AUTOMUTE; in saa7134_s_ctrl()
919 return -EINVAL; in saa7134_s_ctrl()
924 /* ------------------------------------------------------------------ */
935 mutex_lock(&dev->lock); in video_open()
936 if (vdev->vfl_type == VFL_TYPE_RADIO) { in video_open()
942 video_mux(dev, dev->ctl_input); in video_open()
944 mutex_unlock(&dev->lock); in video_open()
955 mutex_lock(&dev->lock); in video_release()
958 if (vdev->vfl_type == VFL_TYPE_RADIO) in video_release()
963 /* ts-capture will not work in planar mode, so turn it off Hac: 04.05*/ in video_release()
970 if (vdev->vfl_type == VFL_TYPE_RADIO) in video_release()
972 mutex_unlock(&dev->lock); in video_release()
984 cmd.nonblocking = file->f_flags & O_NONBLOCK; in radio_read()
987 cmd.result = -ENODEV; in radio_read()
989 mutex_lock(&dev->lock); in radio_read()
991 mutex_unlock(&dev->lock); in radio_read()
1005 mutex_lock(&dev->lock); in radio_poll()
1007 mutex_unlock(&dev->lock); in radio_poll()
1012 /* ------------------------------------------------------------------ */
1018 struct saa7134_tvnorm *norm = dev->tvnorm; in saa7134_try_get_set_fmt_vbi_cap()
1020 memset(&f->fmt.vbi.reserved, 0, sizeof(f->fmt.vbi.reserved)); in saa7134_try_get_set_fmt_vbi_cap()
1021 f->fmt.vbi.sampling_rate = 6750000 * 4; in saa7134_try_get_set_fmt_vbi_cap()
1022 f->fmt.vbi.samples_per_line = 2048 /* VBI_LINE_LENGTH */; in saa7134_try_get_set_fmt_vbi_cap()
1023 f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY; in saa7134_try_get_set_fmt_vbi_cap()
1024 f->fmt.vbi.offset = 64 * 4; in saa7134_try_get_set_fmt_vbi_cap()
1025 f->fmt.vbi.start[0] = norm->vbi_v_start_0; in saa7134_try_get_set_fmt_vbi_cap()
1026 f->fmt.vbi.count[0] = norm->vbi_v_stop_0 - norm->vbi_v_start_0 +1; in saa7134_try_get_set_fmt_vbi_cap()
1027 f->fmt.vbi.start[1] = norm->vbi_v_start_1; in saa7134_try_get_set_fmt_vbi_cap()
1028 f->fmt.vbi.count[1] = f->fmt.vbi.count[0]; in saa7134_try_get_set_fmt_vbi_cap()
1029 f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */ in saa7134_try_get_set_fmt_vbi_cap()
1039 f->fmt.pix.width = dev->width; in saa7134_g_fmt_vid_cap()
1040 f->fmt.pix.height = dev->height; in saa7134_g_fmt_vid_cap()
1041 f->fmt.pix.field = dev->field; in saa7134_g_fmt_vid_cap()
1042 f->fmt.pix.pixelformat = dev->fmt->fourcc; in saa7134_g_fmt_vid_cap()
1043 if (dev->fmt->planar) in saa7134_g_fmt_vid_cap()
1044 f->fmt.pix.bytesperline = f->fmt.pix.width; in saa7134_g_fmt_vid_cap()
1046 f->fmt.pix.bytesperline = in saa7134_g_fmt_vid_cap()
1047 (f->fmt.pix.width * dev->fmt->depth) / 8; in saa7134_g_fmt_vid_cap()
1048 f->fmt.pix.sizeimage = in saa7134_g_fmt_vid_cap()
1049 (f->fmt.pix.height * f->fmt.pix.width * dev->fmt->depth) / 8; in saa7134_g_fmt_vid_cap()
1050 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in saa7134_g_fmt_vid_cap()
1062 fmt = format_by_fourcc(f->fmt.pix.pixelformat); in saa7134_try_fmt_vid_cap()
1064 return -EINVAL; in saa7134_try_fmt_vid_cap()
1066 field = f->fmt.pix.field; in saa7134_try_fmt_vid_cap()
1067 maxw = min(dev->crop_current.width*4, dev->crop_bounds.width); in saa7134_try_fmt_vid_cap()
1068 maxh = min(dev->crop_current.height*4, dev->crop_bounds.height); in saa7134_try_fmt_vid_cap()
1071 field = (f->fmt.pix.height > maxh/2) in saa7134_try_fmt_vid_cap()
1085 f->fmt.pix.field = field; in saa7134_try_fmt_vid_cap()
1086 if (f->fmt.pix.width < 48) in saa7134_try_fmt_vid_cap()
1087 f->fmt.pix.width = 48; in saa7134_try_fmt_vid_cap()
1088 if (f->fmt.pix.height < 32) in saa7134_try_fmt_vid_cap()
1089 f->fmt.pix.height = 32; in saa7134_try_fmt_vid_cap()
1090 if (f->fmt.pix.width > maxw) in saa7134_try_fmt_vid_cap()
1091 f->fmt.pix.width = maxw; in saa7134_try_fmt_vid_cap()
1092 if (f->fmt.pix.height > maxh) in saa7134_try_fmt_vid_cap()
1093 f->fmt.pix.height = maxh; in saa7134_try_fmt_vid_cap()
1094 f->fmt.pix.width &= ~0x03; in saa7134_try_fmt_vid_cap()
1095 if (fmt->planar) in saa7134_try_fmt_vid_cap()
1096 f->fmt.pix.bytesperline = f->fmt.pix.width; in saa7134_try_fmt_vid_cap()
1098 f->fmt.pix.bytesperline = in saa7134_try_fmt_vid_cap()
1099 (f->fmt.pix.width * fmt->depth) / 8; in saa7134_try_fmt_vid_cap()
1100 f->fmt.pix.sizeimage = in saa7134_try_fmt_vid_cap()
1101 (f->fmt.pix.height * f->fmt.pix.width * fmt->depth) / 8; in saa7134_try_fmt_vid_cap()
1102 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in saa7134_try_fmt_vid_cap()
1117 dev->fmt = format_by_fourcc(f->fmt.pix.pixelformat); in saa7134_s_fmt_vid_cap()
1118 dev->width = f->fmt.pix.width; in saa7134_s_fmt_vid_cap()
1119 dev->height = f->fmt.pix.height; in saa7134_s_fmt_vid_cap()
1120 dev->field = f->fmt.pix.field; in saa7134_s_fmt_vid_cap()
1129 n = i->index; in saa7134_enum_input()
1131 return -EINVAL; in saa7134_enum_input()
1132 if (card_in(dev, i->index).type == SAA7134_NO_INPUT) in saa7134_enum_input()
1133 return -EINVAL; in saa7134_enum_input()
1134 i->index = n; in saa7134_enum_input()
1135 strscpy(i->name, saa7134_input_name[card_in(dev, n).type], in saa7134_enum_input()
1136 sizeof(i->name)); in saa7134_enum_input()
1140 i->type = V4L2_INPUT_TYPE_TUNER; in saa7134_enum_input()
1143 i->type = V4L2_INPUT_TYPE_CAMERA; in saa7134_enum_input()
1146 if (n == dev->ctl_input) { in saa7134_enum_input()
1151 i->status |= V4L2_IN_ST_NO_H_LOCK; in saa7134_enum_input()
1153 i->status |= V4L2_IN_ST_NO_SIGNAL; in saa7134_enum_input()
1155 i->status |= V4L2_IN_ST_MACROVISION; in saa7134_enum_input()
1157 i->std = SAA7134_NORMS; in saa7134_enum_input()
1166 *i = dev->ctl_input; in saa7134_g_input()
1176 return -EINVAL; in saa7134_s_input()
1178 return -EINVAL; in saa7134_s_input()
1189 strscpy(cap->driver, "saa7134", sizeof(cap->driver)); in saa7134_querycap()
1190 strscpy(cap->card, saa7134_boards[dev->board].name, in saa7134_querycap()
1191 sizeof(cap->card)); in saa7134_querycap()
1192 cap->capabilities = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING | in saa7134_querycap()
1195 if (dev->tuner_type != TUNER_ABSENT && dev->tuner_type != UNSET) in saa7134_querycap()
1196 cap->capabilities |= V4L2_CAP_TUNER; in saa7134_querycap()
1197 if (dev->has_rds) in saa7134_querycap()
1198 cap->capabilities |= V4L2_CAP_RDS_CAPTURE; in saa7134_querycap()
1219 return -EINVAL; in saa7134_s_std()
1221 if ((id & V4L2_STD_SECAM) && (secam[0] != '-')) { in saa7134_s_std()
1238 return -EINVAL; in saa7134_s_std()
1252 *id = dev->tvnorm->id; in saa7134_g_std()
1292 return -EINVAL; in saa7134_g_pixelaspect()
1294 if (dev->tvnorm->id & V4L2_STD_525_60) { in saa7134_g_pixelaspect()
1295 f->numerator = 11; in saa7134_g_pixelaspect()
1296 f->denominator = 10; in saa7134_g_pixelaspect()
1298 if (dev->tvnorm->id & V4L2_STD_625_50) { in saa7134_g_pixelaspect()
1299 f->numerator = 54; in saa7134_g_pixelaspect()
1300 f->denominator = 59; in saa7134_g_pixelaspect()
1309 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in saa7134_g_selection()
1310 return -EINVAL; in saa7134_g_selection()
1312 switch (sel->target) { in saa7134_g_selection()
1314 sel->r = dev->crop_current; in saa7134_g_selection()
1317 sel->r = dev->crop_defrect; in saa7134_g_selection()
1320 sel->r = dev->crop_bounds; in saa7134_g_selection()
1323 return -EINVAL; in saa7134_g_selection()
1331 struct v4l2_rect *b = &dev->crop_bounds; in saa7134_s_selection()
1332 struct v4l2_rect *c = &dev->crop_current; in saa7134_s_selection()
1334 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in saa7134_s_selection()
1335 return -EINVAL; in saa7134_s_selection()
1337 if (sel->target != V4L2_SEL_TGT_CROP) in saa7134_s_selection()
1338 return -EINVAL; in saa7134_s_selection()
1340 if (vb2_is_streaming(&dev->video_vbq)) in saa7134_s_selection()
1341 return -EBUSY; in saa7134_s_selection()
1343 *c = sel->r; in saa7134_s_selection()
1344 if (c->top < b->top) in saa7134_s_selection()
1345 c->top = b->top; in saa7134_s_selection()
1346 if (c->top > b->top + b->height) in saa7134_s_selection()
1347 c->top = b->top + b->height; in saa7134_s_selection()
1348 if (c->height > b->top - c->top + b->height) in saa7134_s_selection()
1349 c->height = b->top - c->top + b->height; in saa7134_s_selection()
1351 if (c->left < b->left) in saa7134_s_selection()
1352 c->left = b->left; in saa7134_s_selection()
1353 if (c->left > b->left + b->width) in saa7134_s_selection()
1354 c->left = b->left + b->width; in saa7134_s_selection()
1355 if (c->width > b->left - c->left + b->width) in saa7134_s_selection()
1356 c->width = b->left - c->left + b->width; in saa7134_s_selection()
1357 sel->r = *c; in saa7134_s_selection()
1367 if (0 != t->index) in saa7134_g_tuner()
1368 return -EINVAL; in saa7134_g_tuner()
1376 return -EINVAL; in saa7134_g_tuner()
1378 strscpy(t->name, "Television", sizeof(t->name)); in saa7134_g_tuner()
1379 t->type = V4L2_TUNER_ANALOG_TV; in saa7134_g_tuner()
1381 t->capability = V4L2_TUNER_CAP_NORM | in saa7134_g_tuner()
1385 t->rxsubchans = saa7134_tvaudio_getstereo(dev); in saa7134_g_tuner()
1386 t->audmode = saa7134_tvaudio_rx2mode(t->rxsubchans); in saa7134_g_tuner()
1389 t->signal = 0xffff; in saa7134_g_tuner()
1400 if (0 != t->index) in saa7134_s_tuner()
1401 return -EINVAL; in saa7134_s_tuner()
1403 mode = dev->thread.mode; in saa7134_s_tuner()
1408 if (mode != t->audmode) in saa7134_s_tuner()
1409 dev->thread.mode = t->audmode; in saa7134_s_tuner()
1420 if (0 != f->tuner) in saa7134_g_frequency()
1421 return -EINVAL; in saa7134_g_frequency()
1434 if (0 != f->tuner) in saa7134_s_frequency()
1435 return -EINVAL; in saa7134_s_frequency()
1447 if (f->index >= FORMATS) in saa7134_enum_fmt_vid_cap()
1448 return -EINVAL; in saa7134_enum_fmt_vid_cap()
1450 f->pixelformat = formats[f->index].fourcc; in saa7134_enum_fmt_vid_cap()
1461 reg->val = saa_readb(reg->reg & 0xffffff); in vidioc_g_register()
1462 reg->size = 1; in vidioc_g_register()
1471 saa_writeb(reg->reg & 0xffffff, reg->val); in vidioc_s_register()
1481 if (0 != t->index) in radio_g_tuner()
1482 return -EINVAL; in radio_g_tuner()
1484 strscpy(t->name, "Radio", sizeof(t->name)); in radio_g_tuner()
1487 t->audmode &= V4L2_TUNER_MODE_MONO | V4L2_TUNER_MODE_STEREO; in radio_g_tuner()
1488 if (dev->input->amux == TV) { in radio_g_tuner()
1489 t->signal = 0xf800 - ((saa_readb(0x581) & 0x1f) << 11); in radio_g_tuner()
1490 t->rxsubchans = (saa_readb(0x529) & 0x08) ? in radio_g_tuner()
1500 if (0 != t->index) in radio_s_tuner()
1501 return -EINVAL; in radio_s_tuner()
1575 /* ----------------------------------------------------------- */
1579 .name = "saa7134-video",
1586 .name = "saa7134-radio",
1638 struct v4l2_ctrl_handler *hdl = &dev->ctrl_handler; in saa7134_video_init1()
1647 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK; in saa7134_video_init1()
1657 V4L2_CID_HUE, -128, 127, 1, 0); in saa7134_video_init1()
1663 V4L2_CID_AUDIO_VOLUME, -15, 15, 1, 0); in saa7134_video_init1()
1668 if (hdl->error) in saa7134_video_init1()
1669 return hdl->error; in saa7134_video_init1()
1671 hdl = &dev->radio_ctrl_handler; in saa7134_video_init1()
1673 v4l2_ctrl_add_handler(hdl, &dev->ctrl_handler, in saa7134_video_init1()
1675 if (hdl->error) in saa7134_video_init1()
1676 return hdl->error; in saa7134_video_init1()
1678 dev->ctl_mute = 1; in saa7134_video_init1()
1680 if (dev->tda9887_conf && saa7134_ctrl_automute.def) in saa7134_video_init1()
1681 dev->tda9887_conf |= TDA9887_AUTOMUTE; in saa7134_video_init1()
1682 dev->automute = 0; in saa7134_video_init1()
1684 INIT_LIST_HEAD(&dev->video_q.queue); in saa7134_video_init1()
1685 timer_setup(&dev->video_q.timeout, saa7134_buffer_timeout, 0); in saa7134_video_init1()
1686 dev->video_q.dev = dev; in saa7134_video_init1()
1687 dev->fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24); in saa7134_video_init1()
1688 dev->width = 720; in saa7134_video_init1()
1689 dev->height = 576; in saa7134_video_init1()
1690 dev->field = V4L2_FIELD_INTERLACED; in saa7134_video_init1()
1692 if (saa7134_boards[dev->board].video_out) in saa7134_video_init1()
1695 q = &dev->video_vbq; in saa7134_video_init1()
1696 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in saa7134_video_init1()
1700 * of a page. A user-provided pointer can start anywhere in a page, so in saa7134_video_init1()
1701 * USERPTR support is a no-go unless the application knows about these in saa7134_video_init1()
1704 q->io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ; in saa7134_video_init1()
1706 q->io_modes |= VB2_USERPTR; in saa7134_video_init1()
1707 q->drv_priv = &dev->video_q; in saa7134_video_init1()
1708 q->ops = &vb2_qops; in saa7134_video_init1()
1709 q->gfp_flags = GFP_DMA32; in saa7134_video_init1()
1710 q->mem_ops = &vb2_dma_sg_memops; in saa7134_video_init1()
1711 q->buf_struct_size = sizeof(struct saa7134_buf); in saa7134_video_init1()
1712 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in saa7134_video_init1()
1713 q->lock = &dev->lock; in saa7134_video_init1()
1714 q->dev = &dev->pci->dev; in saa7134_video_init1()
1718 saa7134_pgtable_alloc(dev->pci, &dev->video_q.pt); in saa7134_video_init1()
1720 q = &dev->vbi_vbq; in saa7134_video_init1()
1721 q->type = V4L2_BUF_TYPE_VBI_CAPTURE; in saa7134_video_init1()
1723 q->io_modes = VB2_MMAP | VB2_READ; in saa7134_video_init1()
1725 q->io_modes |= VB2_USERPTR; in saa7134_video_init1()
1726 q->drv_priv = &dev->vbi_q; in saa7134_video_init1()
1727 q->ops = &saa7134_vbi_qops; in saa7134_video_init1()
1728 q->gfp_flags = GFP_DMA32; in saa7134_video_init1()
1729 q->mem_ops = &vb2_dma_sg_memops; in saa7134_video_init1()
1730 q->buf_struct_size = sizeof(struct saa7134_buf); in saa7134_video_init1()
1731 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in saa7134_video_init1()
1732 q->lock = &dev->lock; in saa7134_video_init1()
1733 q->dev = &dev->pci->dev; in saa7134_video_init1()
1737 saa7134_pgtable_alloc(dev->pci, &dev->vbi_q.pt); in saa7134_video_init1()
1744 del_timer_sync(&dev->video_q.timeout); in saa7134_video_fini()
1746 saa7134_pgtable_free(dev->pci, &dev->video_q.pt); in saa7134_video_fini()
1747 saa7134_pgtable_free(dev->pci, &dev->vbi_q.pt); in saa7134_video_fini()
1748 v4l2_ctrl_handler_free(&dev->ctrl_handler); in saa7134_video_fini()
1750 v4l2_ctrl_handler_free(&dev->radio_ctrl_handler); in saa7134_video_fini()
1756 int vo = saa7134_boards[dev->board].video_out; in saa7134_videoport_init()
1758 unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts; in saa7134_videoport_init()
1794 v4l2_ctrl_handler_setup(&dev->ctrl_handler); in saa7134_video_init2()
1796 saa7134_tvaudio_setvolume(dev,dev->ctl_volume); in saa7134_video_init2()
1812 dev->nosignal = (st1 & 0x40) || (st2 & 0x40) || !(st2 & 0x1); in saa7134_irq_video_signalchange()
1814 if (dev->nosignal) { in saa7134_irq_video_signalchange()
1815 /* no video signal -> mute audio */ in saa7134_irq_video_signalchange()
1816 if (dev->ctl_automute) in saa7134_irq_video_signalchange()
1817 dev->automute = 1; in saa7134_irq_video_signalchange()
1824 if ((st2 & 0x80) && !noninterlaced && !dev->nosignal) in saa7134_irq_video_signalchange()
1829 if (dev->mops && dev->mops->signal_change) in saa7134_irq_video_signalchange()
1830 dev->mops->signal_change(dev); in saa7134_irq_video_signalchange()
1838 spin_lock(&dev->slock); in saa7134_irq_video_done()
1839 if (dev->video_q.curr) { in saa7134_irq_video_done()
1840 field = dev->field; in saa7134_irq_video_done()
1844 dev->video_q.curr->top_seen = 1; in saa7134_irq_video_done()
1847 if (!dev->video_q.curr->top_seen) in saa7134_irq_video_done()
1856 saa7134_buffer_finish(dev, &dev->video_q, VB2_BUF_STATE_DONE); in saa7134_irq_video_done()
1858 saa7134_buffer_next(dev, &dev->video_q); in saa7134_irq_video_done()
1861 spin_unlock(&dev->slock); in saa7134_irq_video_done()