Lines Matching +full:input +full:- +full:depth
1 // SPDX-License-Identifier: GPL-2.0-or-later
28 * bttv - Bt848 frame grabber driver
29 * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)
30 * & Marcus Metzler (mocm@thp.uni-koeln.de)
42 #include <linux/i2c-algo-bit.h>
47 #include <media/v4l2-common.h>
48 #include <media/v4l2-ioctl.h>
49 #include <media/v4l2-event.h>
62 .name = "15-bit RGB LE",
65 .depth = 15,
70 .name = "15-bit RGB BE",
73 .depth = 15,
77 .name = "16-bit RGB LE",
80 .depth = 16,
85 .name = "16-bit RGB BE",
88 .depth = 16,
92 .name = "24-bit RGB",
95 .depth = 24,
99 .name = "32-bit RGB LE",
102 .depth = 32,
106 .name = "32-bit RGB BE",
109 .depth = 32,
116 .depth = 16,
123 .depth = 16,
127 .name = "Hardware-encoded Motion-JPEG",
130 .depth = 0,
141 * we calculate the nearest higher power-of-two, which
146 __u8 div = settings->ver_dcm * settings->hor_dcm * settings->tmp_dcm; in zoran_v4l2_calc_bufsize()
150 num--; in zoran_v4l2_calc_bufsize()
174 pci_dbg(zr->pci_dev, "%s - wrong frame size (%dx%d)\n", __func__, width, height); in zoran_v4l_set_format()
175 return -EINVAL; in zoran_v4l_set_format()
178 bpp = (format->depth + 7) / 8; in zoran_v4l_set_format()
180 zr->buffer_size = height * width * bpp; in zoran_v4l_set_format()
183 if (height * width * bpp > zr->buffer_size) { in zoran_v4l_set_format()
184 pci_dbg(zr->pci_dev, "%s - video buffer size (%d kB) is too small\n", in zoran_v4l_set_format()
185 __func__, zr->buffer_size >> 10); in zoran_v4l_set_format()
186 return -EINVAL; in zoran_v4l_set_format()
189 /* The video front end needs 4-byte alinged line sizes */ in zoran_v4l_set_format()
192 pci_dbg(zr->pci_dev, "%s - wrong frame alignment\n", __func__); in zoran_v4l_set_format()
193 return -EINVAL; in zoran_v4l_set_format()
196 zr->v4l_settings.width = width; in zoran_v4l_set_format()
197 zr->v4l_settings.height = height; in zoran_v4l_set_format()
198 zr->v4l_settings.format = format; in zoran_v4l_set_format()
199 zr->v4l_settings.bytesperline = bpp * zr->v4l_settings.width; in zoran_v4l_set_format()
206 if (!(norm & zr->card.norms)) { in zoran_set_norm()
207 pci_dbg(zr->pci_dev, "%s - unsupported norm %llx\n", __func__, norm); in zoran_set_norm()
208 return -EINVAL; in zoran_set_norm()
212 zr->timing = zr->card.tvn[ZR_NORM_SECAM]; in zoran_set_norm()
214 zr->timing = zr->card.tvn[ZR_NORM_NTSC]; in zoran_set_norm()
216 zr->timing = zr->card.tvn[ZR_NORM_PAL]; in zoran_set_norm()
222 zr->norm = norm; in zoran_set_norm()
227 static int zoran_set_input(struct zoran *zr, int input) in zoran_set_input() argument
229 if (input == zr->input) in zoran_set_input()
232 if (input < 0 || input >= zr->card.inputs) { in zoran_set_input()
233 pci_dbg(zr->pci_dev, "%s - unsupported input %d\n", __func__, input); in zoran_set_input()
234 return -EINVAL; in zoran_set_input()
237 zr->input = input; in zoran_set_input()
239 decoder_call(zr, video, s_routing, zr->card.input[input].muxsel, 0, 0); in zoran_set_input()
252 strscpy(cap->card, ZR_DEVNAME(zr), sizeof(cap->card)); in zoran_querycap()
253 strscpy(cap->driver, "zoran", sizeof(cap->driver)); in zoran_querycap()
254 snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", pci_name(zr->pci_dev)); in zoran_querycap()
262 if (fmt->index >= ARRAY_SIZE(zoran_formats)) in zoran_enum_fmt()
263 return -EINVAL; in zoran_enum_fmt()
264 if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in zoran_enum_fmt()
265 return -EINVAL; in zoran_enum_fmt()
268 if (zoran_formats[i].flags & flag && num++ == fmt->index) { in zoran_enum_fmt()
269 strscpy(fmt->description, zoran_formats[i].name, in zoran_enum_fmt()
270 sizeof(fmt->description)); in zoran_enum_fmt()
271 /* fmt struct pre-zeroed, so adding '\0' not needed */ in zoran_enum_fmt()
272 fmt->pixelformat = zoran_formats[i].fourcc; in zoran_enum_fmt()
274 fmt->flags |= V4L2_FMT_FLAG_COMPRESSED; in zoran_enum_fmt()
278 return -EINVAL; in zoran_enum_fmt()
294 fmt->fmt.pix.width = zr->jpg_settings.img_width / zr->jpg_settings.hor_dcm; in zoran_g_fmt_vid_out()
295 fmt->fmt.pix.height = zr->jpg_settings.img_height * 2 / in zoran_g_fmt_vid_out()
296 (zr->jpg_settings.ver_dcm * zr->jpg_settings.tmp_dcm); in zoran_g_fmt_vid_out()
297 fmt->fmt.pix.sizeimage = zr->buffer_size; in zoran_g_fmt_vid_out()
298 fmt->fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; in zoran_g_fmt_vid_out()
299 if (zr->jpg_settings.tmp_dcm == 1) in zoran_g_fmt_vid_out()
300 fmt->fmt.pix.field = (zr->jpg_settings.odd_even ? in zoran_g_fmt_vid_out()
303 fmt->fmt.pix.field = (zr->jpg_settings.odd_even ? in zoran_g_fmt_vid_out()
305 fmt->fmt.pix.bytesperline = 0; in zoran_g_fmt_vid_out()
306 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in zoran_g_fmt_vid_out()
316 if (zr->map_mode != ZORAN_MAP_MODE_RAW) in zoran_g_fmt_vid_cap()
318 fmt->fmt.pix.width = zr->v4l_settings.width; in zoran_g_fmt_vid_cap()
319 fmt->fmt.pix.height = zr->v4l_settings.height; in zoran_g_fmt_vid_cap()
320 fmt->fmt.pix.sizeimage = zr->buffer_size; in zoran_g_fmt_vid_cap()
321 fmt->fmt.pix.pixelformat = zr->v4l_settings.format->fourcc; in zoran_g_fmt_vid_cap()
322 fmt->fmt.pix.colorspace = zr->v4l_settings.format->colorspace; in zoran_g_fmt_vid_cap()
323 fmt->fmt.pix.bytesperline = zr->v4l_settings.bytesperline; in zoran_g_fmt_vid_cap()
324 if (BUZ_MAX_HEIGHT < (zr->v4l_settings.height * 2)) in zoran_g_fmt_vid_cap()
325 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED; in zoran_g_fmt_vid_cap()
327 fmt->fmt.pix.field = V4L2_FIELD_TOP; in zoran_g_fmt_vid_cap()
338 if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG) in zoran_try_fmt_vid_out()
339 return -EINVAL; in zoran_try_fmt_vid_out()
341 settings = zr->jpg_settings; in zoran_try_fmt_vid_out()
344 if ((fmt->fmt.pix.height * 2) > BUZ_MAX_HEIGHT) in zoran_try_fmt_vid_out()
349 if (fmt->fmt.pix.height <= zr->jpg_settings.img_height / 2) in zoran_try_fmt_vid_out()
353 if (fmt->fmt.pix.width <= zr->jpg_settings.img_width / 4) in zoran_try_fmt_vid_out()
355 else if (fmt->fmt.pix.width <= zr->jpg_settings.img_width / 2) in zoran_try_fmt_vid_out()
378 fmt->fmt.pix.width = settings.img_width / settings.hor_dcm; in zoran_try_fmt_vid_out()
379 fmt->fmt.pix.height = settings.img_height * 2 / in zoran_try_fmt_vid_out()
382 fmt->fmt.pix.field = (zr->jpg_settings.odd_even ? in zoran_try_fmt_vid_out()
385 fmt->fmt.pix.field = (zr->jpg_settings.odd_even ? in zoran_try_fmt_vid_out()
388 fmt->fmt.pix.sizeimage = zoran_v4l2_calc_bufsize(&settings); in zoran_try_fmt_vid_out()
389 fmt->fmt.pix.bytesperline = 0; in zoran_try_fmt_vid_out()
390 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in zoran_try_fmt_vid_out()
401 if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) in zoran_try_fmt_vid_cap()
405 if (zoran_formats[i].fourcc == fmt->fmt.pix.pixelformat) in zoran_try_fmt_vid_cap()
410 return -EINVAL; in zoran_try_fmt_vid_cap()
413 fmt->fmt.pix.pixelformat = zoran_formats[i].fourcc; in zoran_try_fmt_vid_cap()
414 fmt->fmt.pix.colorspace = zoran_formats[i].colorspace; in zoran_try_fmt_vid_cap()
415 if (BUZ_MAX_HEIGHT < (fmt->fmt.pix.height * 2)) in zoran_try_fmt_vid_cap()
416 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED; in zoran_try_fmt_vid_cap()
418 fmt->fmt.pix.field = V4L2_FIELD_TOP; in zoran_try_fmt_vid_cap()
420 bpp = DIV_ROUND_UP(zoran_formats[i].depth, 8); in zoran_try_fmt_vid_cap()
421 v4l_bound_align_image(&fmt->fmt.pix.width, BUZ_MIN_WIDTH, BUZ_MAX_WIDTH, in zoran_try_fmt_vid_cap()
423 &fmt->fmt.pix.height, BUZ_MIN_HEIGHT, BUZ_MAX_HEIGHT, in zoran_try_fmt_vid_cap()
425 fmt->fmt.pix.bytesperline = fmt->fmt.pix.width * bpp; in zoran_try_fmt_vid_cap()
426 fmt->fmt.pix.sizeimage = fmt->fmt.pix.bytesperline * fmt->fmt.pix.height; in zoran_try_fmt_vid_cap()
434 __le32 printformat = __cpu_to_le32(fmt->fmt.pix.pixelformat); in zoran_s_fmt_vid_out()
438 pci_dbg(zr->pci_dev, "size=%dx%d, fmt=0x%x (%4.4s)\n", in zoran_s_fmt_vid_out()
439 fmt->fmt.pix.width, fmt->fmt.pix.height, in zoran_s_fmt_vid_out()
440 fmt->fmt.pix.pixelformat, in zoran_s_fmt_vid_out()
442 if (fmt->fmt.pix.pixelformat != V4L2_PIX_FMT_MJPEG) in zoran_s_fmt_vid_out()
443 return -EINVAL; in zoran_s_fmt_vid_out()
445 if (!fmt->fmt.pix.height || !fmt->fmt.pix.width) in zoran_s_fmt_vid_out()
446 return -EINVAL; in zoran_s_fmt_vid_out()
448 settings = zr->jpg_settings; in zoran_s_fmt_vid_out()
451 if (fmt->fmt.pix.height * 2 > BUZ_MAX_HEIGHT) in zoran_s_fmt_vid_out()
456 if (fmt->fmt.pix.height <= zr->jpg_settings.img_height / 2) in zoran_s_fmt_vid_out()
460 if (fmt->fmt.pix.width <= zr->jpg_settings.img_width / 4) in zoran_s_fmt_vid_out()
462 else if (fmt->fmt.pix.width <= zr->jpg_settings.img_width / 2) in zoran_s_fmt_vid_out()
485 zr->jpg_settings = settings; in zoran_s_fmt_vid_out()
487 if (fmt->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) in zoran_s_fmt_vid_out()
488 zr->map_mode = ZORAN_MAP_MODE_JPG_REC; in zoran_s_fmt_vid_out()
490 zr->map_mode = ZORAN_MAP_MODE_JPG_PLAY; in zoran_s_fmt_vid_out()
492 zr->buffer_size = zoran_v4l2_calc_bufsize(&zr->jpg_settings); in zoran_s_fmt_vid_out()
495 fmt->fmt.pix.width = settings.img_width / settings.hor_dcm; in zoran_s_fmt_vid_out()
496 fmt->fmt.pix.height = settings.img_height * 2 / in zoran_s_fmt_vid_out()
499 fmt->fmt.pix.field = (zr->jpg_settings.odd_even ? in zoran_s_fmt_vid_out()
502 fmt->fmt.pix.field = (zr->jpg_settings.odd_even ? in zoran_s_fmt_vid_out()
504 fmt->fmt.pix.bytesperline = 0; in zoran_s_fmt_vid_out()
505 fmt->fmt.pix.sizeimage = zr->buffer_size; in zoran_s_fmt_vid_out()
506 fmt->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in zoran_s_fmt_vid_out()
518 if (fmt->fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG) in zoran_s_fmt_vid_cap()
522 if (fmt->fmt.pix.pixelformat == zoran_formats[i].fourcc) in zoran_s_fmt_vid_cap()
525 pci_dbg(zr->pci_dev, "VIDIOC_S_FMT - unknown/unsupported format 0x%x\n", in zoran_s_fmt_vid_cap()
526 fmt->fmt.pix.pixelformat); in zoran_s_fmt_vid_cap()
528 return -EINVAL; in zoran_s_fmt_vid_cap()
531 fmt->fmt.pix.pixelformat = zoran_formats[i].fourcc; in zoran_s_fmt_vid_cap()
532 if (fmt->fmt.pix.height > BUZ_MAX_HEIGHT) in zoran_s_fmt_vid_cap()
533 fmt->fmt.pix.height = BUZ_MAX_HEIGHT; in zoran_s_fmt_vid_cap()
534 if (fmt->fmt.pix.width > BUZ_MAX_WIDTH) in zoran_s_fmt_vid_cap()
535 fmt->fmt.pix.width = BUZ_MAX_WIDTH; in zoran_s_fmt_vid_cap()
536 if (fmt->fmt.pix.height < BUZ_MIN_HEIGHT) in zoran_s_fmt_vid_cap()
537 fmt->fmt.pix.height = BUZ_MIN_HEIGHT; in zoran_s_fmt_vid_cap()
538 if (fmt->fmt.pix.width < BUZ_MIN_WIDTH) in zoran_s_fmt_vid_cap()
539 fmt->fmt.pix.width = BUZ_MIN_WIDTH; in zoran_s_fmt_vid_cap()
541 zr->map_mode = ZORAN_MAP_MODE_RAW; in zoran_s_fmt_vid_cap()
543 res = zoran_v4l_set_format(zr, fmt->fmt.pix.width, fmt->fmt.pix.height, in zoran_s_fmt_vid_cap()
549 fmt->fmt.pix.bytesperline = zr->v4l_settings.bytesperline; in zoran_s_fmt_vid_cap()
550 fmt->fmt.pix.sizeimage = zr->buffer_size; in zoran_s_fmt_vid_cap()
551 fmt->fmt.pix.colorspace = zr->v4l_settings.format->colorspace; in zoran_s_fmt_vid_cap()
552 if (BUZ_MAX_HEIGHT < (zr->v4l_settings.height * 2)) in zoran_s_fmt_vid_cap()
553 fmt->fmt.pix.field = V4L2_FIELD_INTERLACED; in zoran_s_fmt_vid_cap()
555 fmt->fmt.pix.field = V4L2_FIELD_TOP; in zoran_s_fmt_vid_cap()
563 *std = zr->norm; in zoran_g_std()
572 if (zr->norm == std) in zoran_s_std()
575 if (zr->running != ZORAN_MAP_MODE_NONE) in zoran_s_std()
576 return -EBUSY; in zoran_s_std()
587 if (inp->index >= zr->card.inputs) in zoran_enum_input()
588 return -EINVAL; in zoran_enum_input()
590 strscpy(inp->name, zr->card.input[inp->index].name, sizeof(inp->name)); in zoran_enum_input()
591 inp->type = V4L2_INPUT_TYPE_CAMERA; in zoran_enum_input()
592 inp->std = V4L2_STD_NTSC | V4L2_STD_PAL | V4L2_STD_SECAM; in zoran_enum_input()
595 decoder_call(zr, video, g_input_status, &inp->status); in zoran_enum_input()
599 static int zoran_g_input(struct file *file, void *__fh, unsigned int *input) in zoran_g_input() argument
603 *input = zr->input; in zoran_g_input()
608 static int zoran_s_input(struct file *file, void *__fh, unsigned int input) in zoran_s_input() argument
613 if (zr->running != ZORAN_MAP_MODE_NONE) in zoran_s_input()
614 return -EBUSY; in zoran_s_input()
616 res = zoran_set_input(zr, input); in zoran_s_input()
620 /* cropping (sub-frame capture) */
625 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && in zoran_g_selection()
626 sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) { in zoran_g_selection()
627 pci_dbg(zr->pci_dev, "%s invalid selection type combination\n", __func__); in zoran_g_selection()
628 return -EINVAL; in zoran_g_selection()
631 switch (sel->target) { in zoran_g_selection()
633 sel->r.top = zr->jpg_settings.img_y; in zoran_g_selection()
634 sel->r.left = zr->jpg_settings.img_x; in zoran_g_selection()
635 sel->r.width = zr->jpg_settings.img_width; in zoran_g_selection()
636 sel->r.height = zr->jpg_settings.img_height; in zoran_g_selection()
639 sel->r.top = 0; in zoran_g_selection()
640 sel->r.left = 0; in zoran_g_selection()
641 sel->r.width = BUZ_MIN_WIDTH; in zoran_g_selection()
642 sel->r.height = BUZ_MIN_HEIGHT; in zoran_g_selection()
645 sel->r.top = 0; in zoran_g_selection()
646 sel->r.left = 0; in zoran_g_selection()
647 sel->r.width = BUZ_MAX_WIDTH; in zoran_g_selection()
648 sel->r.height = BUZ_MAX_HEIGHT; in zoran_g_selection()
651 return -EINVAL; in zoran_g_selection()
662 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && in zoran_s_selection()
663 sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in zoran_s_selection()
664 return -EINVAL; in zoran_s_selection()
666 if (!sel->r.width || !sel->r.height) in zoran_s_selection()
667 return -EINVAL; in zoran_s_selection()
669 if (sel->target != V4L2_SEL_TGT_CROP) in zoran_s_selection()
670 return -EINVAL; in zoran_s_selection()
672 if (zr->map_mode == ZORAN_MAP_MODE_RAW) { in zoran_s_selection()
673 pci_dbg(zr->pci_dev, "VIDIOC_S_SELECTION - subcapture only supported for compressed capture\n"); in zoran_s_selection()
674 return -EINVAL; in zoran_s_selection()
677 settings = zr->jpg_settings; in zoran_s_selection()
680 settings.img_x = sel->r.left; in zoran_s_selection()
681 settings.img_y = sel->r.top; in zoran_s_selection()
682 settings.img_width = sel->r.width; in zoran_s_selection()
683 settings.img_height = sel->r.height; in zoran_s_selection()
691 zr->jpg_settings = settings; in zoran_s_selection()
746 unsigned int size = zr->buffer_size; in zr_vb2_queue_setup()
748 pci_dbg(zr->pci_dev, "%s nbuf=%u nplanes=%u", __func__, *nbuffers, *nplanes); in zr_vb2_queue_setup()
750 zr->buf_in_reserve = 0; in zr_vb2_queue_setup()
752 if (*nbuffers < vq->min_queued_buffers) in zr_vb2_queue_setup()
753 *nbuffers = vq->min_queued_buffers; in zr_vb2_queue_setup()
757 return -EINVAL; in zr_vb2_queue_setup()
770 struct zoran *zr = vb2_get_drv_priv(vb->vb2_queue); in zr_vb2_queue()
774 spin_lock_irqsave(&zr->queued_bufs_lock, flags); in zr_vb2_queue()
775 list_add_tail(&buf->queue, &zr->queued_bufs); in zr_vb2_queue()
776 zr->buf_in_reserve++; in zr_vb2_queue()
777 spin_unlock_irqrestore(&zr->queued_bufs_lock, flags); in zr_vb2_queue()
778 if (zr->running == ZORAN_MAP_MODE_JPG_REC) in zr_vb2_queue()
780 zr->queued++; in zr_vb2_queue()
785 struct zoran *zr = vb2_get_drv_priv(vb->vb2_queue); in zr_vb2_prepare()
787 if (vb2_plane_size(vb, 0) < zr->buffer_size) in zr_vb2_prepare()
788 return -EINVAL; in zr_vb2_prepare()
789 zr->prepared++; in zr_vb2_prepare()
802 if (zr->running == ZORAN_MAP_MODE_NONE) in zr_set_buf()
805 if (zr->inuse[0]) { in zr_set_buf()
806 buf = zr->inuse[0]; in zr_set_buf()
807 buf->vbuf.vb2_buf.timestamp = ktime_get_ns(); in zr_set_buf()
808 buf->vbuf.sequence = zr->vbseq++; in zr_set_buf()
809 vbuf = &buf->vbuf; in zr_set_buf()
811 buf->vbuf.field = V4L2_FIELD_INTERLACED; in zr_set_buf()
812 if (BUZ_MAX_HEIGHT < (zr->v4l_settings.height * 2)) in zr_set_buf()
813 buf->vbuf.field = V4L2_FIELD_INTERLACED; in zr_set_buf()
815 buf->vbuf.field = V4L2_FIELD_TOP; in zr_set_buf()
816 vb2_set_plane_payload(&buf->vbuf.vb2_buf, 0, zr->buffer_size); in zr_set_buf()
817 vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_DONE); in zr_set_buf()
818 zr->inuse[0] = NULL; in zr_set_buf()
821 spin_lock_irqsave(&zr->queued_bufs_lock, flags); in zr_set_buf()
822 if (list_empty(&zr->queued_bufs)) { in zr_set_buf()
824 vb2_queue_error(zr->video_dev->queue); in zr_set_buf()
825 spin_unlock_irqrestore(&zr->queued_bufs_lock, flags); in zr_set_buf()
826 return -EINVAL; in zr_set_buf()
828 buf = list_first_entry_or_null(&zr->queued_bufs, struct zr_buffer, queue); in zr_set_buf()
831 vb2_queue_error(zr->video_dev->queue); in zr_set_buf()
832 spin_unlock_irqrestore(&zr->queued_bufs_lock, flags); in zr_set_buf()
833 return -EINVAL; in zr_set_buf()
835 list_del(&buf->queue); in zr_set_buf()
836 zr->buf_in_reserve--; in zr_set_buf()
837 spin_unlock_irqrestore(&zr->queued_bufs_lock, flags); in zr_set_buf()
839 vbuf = &buf->vbuf; in zr_set_buf()
840 vbuf->vb2_buf.state = VB2_BUF_STATE_ACTIVE; in zr_set_buf()
841 phys_addr = vb2_dma_contig_plane_dma_addr(&vbuf->vb2_buf, 0); in zr_set_buf()
844 return -EINVAL; in zr_set_buf()
846 zr->inuse[0] = buf; in zr_set_buf()
850 if (zr->v4l_settings.height > BUZ_MAX_HEIGHT / 2) in zr_set_buf()
851 reg += zr->v4l_settings.bytesperline; in zr_set_buf()
855 if (zr->v4l_settings.height > BUZ_MAX_HEIGHT / 2) in zr_set_buf()
856 reg += zr->v4l_settings.bytesperline; in zr_set_buf()
869 struct zoran *zr = vq->drv_priv; in zr_vb2_start_streaming()
873 zr->stat_com[j] = cpu_to_le32(1); in zr_vb2_start_streaming()
874 zr->inuse[j] = NULL; in zr_vb2_start_streaming()
876 zr->vbseq = 0; in zr_vb2_start_streaming()
878 if (zr->map_mode != ZORAN_MAP_MODE_RAW) { in zr_vb2_start_streaming()
879 pci_dbg(zr->pci_dev, "START JPG\n"); in zr_vb2_start_streaming()
882 if (zr->map_mode == ZORAN_MAP_MODE_JPG_REC) in zr_vb2_start_streaming()
888 zr->running = zr->map_mode; in zr_vb2_start_streaming()
893 pci_dbg(zr->pci_dev, "START RAW\n"); in zr_vb2_start_streaming()
899 zr->running = zr->map_mode; in zr_vb2_start_streaming()
906 struct zoran *zr = vq->drv_priv; in zr_vb2_stop_streaming()
912 if (zr->map_mode != ZORAN_MAP_MODE_RAW) in zr_vb2_stop_streaming()
915 zr->running = ZORAN_MAP_MODE_NONE; in zr_vb2_stop_streaming()
925 zr->stat_com[j] = cpu_to_le32(1); in zr_vb2_stop_streaming()
926 if (!zr->inuse[j]) in zr_vb2_stop_streaming()
928 buf = zr->inuse[j]; in zr_vb2_stop_streaming()
929 pci_dbg(zr->pci_dev, "%s clean buf %d\n", __func__, j); in zr_vb2_stop_streaming()
930 vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_ERROR); in zr_vb2_stop_streaming()
931 zr->inuse[j] = NULL; in zr_vb2_stop_streaming()
934 spin_lock_irqsave(&zr->queued_bufs_lock, flags); in zr_vb2_stop_streaming()
935 while (!list_empty(&zr->queued_bufs)) { in zr_vb2_stop_streaming()
936 buf = list_entry(zr->queued_bufs.next, struct zr_buffer, queue); in zr_vb2_stop_streaming()
937 list_del(&buf->queue); in zr_vb2_stop_streaming()
938 vb2_buffer_done(&buf->vbuf.vb2_buf, VB2_BUF_STATE_ERROR); in zr_vb2_stop_streaming()
939 zr->buf_in_reserve--; in zr_vb2_stop_streaming()
941 spin_unlock_irqrestore(&zr->queued_bufs_lock, flags); in zr_vb2_stop_streaming()
942 if (zr->buf_in_reserve) in zr_vb2_stop_streaming()
943 pci_dbg(zr->pci_dev, "Buffer remaining %d\n", zr->buf_in_reserve); in zr_vb2_stop_streaming()
944 zr->map_mode = ZORAN_MAP_MODE_RAW; in zr_vb2_stop_streaming()
961 spin_lock_init(&zr->queued_bufs_lock); in zoran_queue_init()
962 INIT_LIST_HEAD(&zr->queued_bufs); in zoran_queue_init()
964 vq->dev = &zr->pci_dev->dev; in zoran_queue_init()
965 vq->type = dir; in zoran_queue_init()
967 vq->io_modes = VB2_DMABUF | VB2_MMAP; in zoran_queue_init()
968 vq->drv_priv = zr; in zoran_queue_init()
969 vq->buf_struct_size = sizeof(struct zr_buffer); in zoran_queue_init()
970 vq->ops = &zr_video_qops; in zoran_queue_init()
971 vq->mem_ops = &vb2_dma_contig_memops; in zoran_queue_init()
972 vq->gfp_flags = GFP_DMA32; in zoran_queue_init()
973 vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in zoran_queue_init()
974 vq->min_queued_buffers = 9; in zoran_queue_init()
975 vq->lock = &zr->lock; in zoran_queue_init()
979 zr->video_dev->queue = vq; in zoran_queue_init()
985 vb2_queue_release(zr->video_dev->queue); in zoran_queue_exit()