Lines Matching +full:sdtv +full:- +full:standards
5 * This skeleton PCI driver assumes that the card has an S-Video connector as
33 #include <linux/v4l2-dv-timings.h>
34 #include <media/v4l2-device.h>
35 #include <media/v4l2-dev.h>
36 #include <media/v4l2-ioctl.h>
37 #include <media/v4l2-dv-timings.h>
38 #include <media/v4l2-ctrls.h>
39 #include <media/v4l2-event.h>
40 #include <media/videobuf2-v4l2.h>
41 #include <media/videobuf2-dma-contig.h>
48 * struct skeleton - All internal data for one instance of device
50 * @v4l2_dev: top-level v4l2 device struct
54 * @std: current SDTV standard
57 * @input: current video input (0 = SDTV, 1 = HDTV)
112 V4L2_DV_BT_STD_CEA861, /* Supported standards */
119 * Supported SDTV standards. This does the same job as skel_timings_cap, but
140 spin_lock(&skel->qlock); in skeleton_irq()
141 list_del(&new_buf->list); in skeleton_irq()
142 spin_unlock(&skel->qlock); in skeleton_irq()
143 new_buf->vb.vb2_buf.timestamp = ktime_get_ns(); in skeleton_irq()
144 new_buf->vb.sequence = skel->sequence++; in skeleton_irq()
145 new_buf->vb.field = skel->field; in skeleton_irq()
146 if (skel->format.field == V4L2_FIELD_ALTERNATE) { in skeleton_irq()
147 if (skel->field == V4L2_FIELD_BOTTOM) in skeleton_irq()
148 skel->field = V4L2_FIELD_TOP; in skeleton_irq()
149 else if (skel->field == V4L2_FIELD_TOP) in skeleton_irq()
150 skel->field = V4L2_FIELD_BOTTOM; in skeleton_irq()
152 vb2_buffer_done(&new_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); in skeleton_irq()
171 skel->field = skel->format.field; in queue_setup()
172 if (skel->field == V4L2_FIELD_ALTERNATE) { in queue_setup()
178 return -EINVAL; in queue_setup()
179 skel->field = V4L2_FIELD_TOP; in queue_setup()
182 if (vq->num_buffers + *nbuffers < 3) in queue_setup()
183 *nbuffers = 3 - vq->num_buffers; in queue_setup()
186 return sizes[0] < skel->format.sizeimage ? -EINVAL : 0; in queue_setup()
188 sizes[0] = skel->format.sizeimage; in queue_setup()
198 struct skeleton *skel = vb2_get_drv_priv(vb->vb2_queue); in buffer_prepare()
199 unsigned long size = skel->format.sizeimage; in buffer_prepare()
202 dev_err(&skel->pdev->dev, "buffer too small (%lu < %lu)\n", in buffer_prepare()
204 return -EINVAL; in buffer_prepare()
217 struct skeleton *skel = vb2_get_drv_priv(vb->vb2_queue); in buffer_queue()
221 spin_lock_irqsave(&skel->qlock, flags); in buffer_queue()
222 list_add_tail(&buf->list, &skel->buf_list); in buffer_queue()
226 spin_unlock_irqrestore(&skel->qlock, flags); in buffer_queue()
235 spin_lock_irqsave(&skel->qlock, flags); in return_all_buffers()
236 list_for_each_entry_safe(buf, node, &skel->buf_list, list) { in return_all_buffers()
237 vb2_buffer_done(&buf->vb.vb2_buf, state); in return_all_buffers()
238 list_del(&buf->list); in return_all_buffers()
240 spin_unlock_irqrestore(&skel->qlock, flags); in return_all_buffers()
245 * queued. If not, then return -ENOBUFS and the vb2 framework will call
254 skel->sequence = 0; in start_streaming()
283 * The vb2 queue ops. Note that since q->lock is set we can use the standard
284 * vb2_ops_wait_prepare/finish helper functions. If q->lock would be NULL,
306 strlcpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); in skeleton_querycap()
307 strlcpy(cap->card, "V4L2 PCI Skeleton", sizeof(cap->card)); in skeleton_querycap()
308 snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s", in skeleton_querycap()
309 pci_name(skel->pdev)); in skeleton_querycap()
315 * not only in VIDIOC_TRY/S_FMT, but also elsewhere if changes to the SDTV
322 pix->pixelformat = V4L2_PIX_FMT_YUYV; in skeleton_fill_pix_format()
323 if (skel->input == 0) { in skeleton_fill_pix_format()
324 /* S-Video input */ in skeleton_fill_pix_format()
325 pix->width = 720; in skeleton_fill_pix_format()
326 pix->height = (skel->std & V4L2_STD_525_60) ? 480 : 576; in skeleton_fill_pix_format()
327 pix->field = V4L2_FIELD_INTERLACED; in skeleton_fill_pix_format()
328 pix->colorspace = V4L2_COLORSPACE_SMPTE170M; in skeleton_fill_pix_format()
331 pix->width = skel->timings.bt.width; in skeleton_fill_pix_format()
332 pix->height = skel->timings.bt.height; in skeleton_fill_pix_format()
333 if (skel->timings.bt.interlaced) { in skeleton_fill_pix_format()
334 pix->field = V4L2_FIELD_ALTERNATE; in skeleton_fill_pix_format()
335 pix->height /= 2; in skeleton_fill_pix_format()
337 pix->field = V4L2_FIELD_NONE; in skeleton_fill_pix_format()
339 pix->colorspace = V4L2_COLORSPACE_REC709; in skeleton_fill_pix_format()
346 pix->bytesperline = pix->width * 2; in skeleton_fill_pix_format()
347 pix->sizeimage = pix->bytesperline * pix->height; in skeleton_fill_pix_format()
348 pix->priv = 0; in skeleton_fill_pix_format()
355 struct v4l2_pix_format *pix = &f->fmt.pix; in skeleton_try_fmt_vid_cap()
359 * pixelformat will return -EINVAL for video receivers. Webcam drivers, in skeleton_try_fmt_vid_cap()
363 if (pix->pixelformat != V4L2_PIX_FMT_YUYV) in skeleton_try_fmt_vid_cap()
364 return -EINVAL; in skeleton_try_fmt_vid_cap()
383 if (vb2_is_busy(&skel->queue)) in skeleton_s_fmt_vid_cap()
384 return -EBUSY; in skeleton_s_fmt_vid_cap()
387 skel->format = f->fmt.pix; in skeleton_s_fmt_vid_cap()
396 f->fmt.pix = skel->format; in skeleton_g_fmt_vid_cap()
403 if (f->index != 0) in skeleton_enum_fmt_vid_cap()
404 return -EINVAL; in skeleton_enum_fmt_vid_cap()
406 f->pixelformat = V4L2_PIX_FMT_YUYV; in skeleton_enum_fmt_vid_cap()
415 if (skel->input) in skeleton_s_std()
416 return -ENODATA; in skeleton_s_std()
423 if (std == skel->std) in skeleton_s_std()
430 if (vb2_is_busy(&skel->queue)) in skeleton_s_std()
431 return -EBUSY; in skeleton_s_std()
435 skel->std = std; in skeleton_s_std()
438 skeleton_fill_pix_format(skel, &skel->format); in skeleton_s_std()
447 if (skel->input) in skeleton_g_std()
448 return -ENODATA; in skeleton_g_std()
450 *std = skel->std; in skeleton_g_std()
458 * supported standards by this input), and this function should just AND
466 if (skel->input) in skeleton_querystd()
467 return -ENODATA; in skeleton_querystd()
479 /* Use signal information to reduce the number of possible standards */ in skeleton_querystd()
493 /* S_DV_TIMINGS is not supported on the S-Video input */ in skeleton_s_dv_timings()
494 if (skel->input == 0) in skeleton_s_dv_timings()
495 return -ENODATA; in skeleton_s_dv_timings()
499 return -EINVAL; in skeleton_s_dv_timings()
501 /* Check if the timings are part of the CEA-861 timings. */ in skeleton_s_dv_timings()
504 return -EINVAL; in skeleton_s_dv_timings()
507 if (v4l2_match_dv_timings(timings, &skel->timings, 0, false)) in skeleton_s_dv_timings()
514 if (vb2_is_busy(&skel->queue)) in skeleton_s_dv_timings()
515 return -EBUSY; in skeleton_s_dv_timings()
520 skel->timings = *timings; in skeleton_s_dv_timings()
523 skeleton_fill_pix_format(skel, &skel->format); in skeleton_s_dv_timings()
532 /* G_DV_TIMINGS is not supported on the S-Video input */ in skeleton_g_dv_timings()
533 if (skel->input == 0) in skeleton_g_dv_timings()
534 return -ENODATA; in skeleton_g_dv_timings()
536 *timings = skel->timings; in skeleton_g_dv_timings()
545 /* ENUM_DV_TIMINGS is not supported on the S-Video input */ in skeleton_enum_dv_timings()
546 if (skel->input == 0) in skeleton_enum_dv_timings()
547 return -ENODATA; in skeleton_enum_dv_timings()
556 * If no signal is detected, then return -ENOLINK. If the hardware cannot
557 * lock to the signal, then return -ENOLCK. If the signal is out of range
560 * pixelclocks above a certain frequency), then -ERANGE is returned.
567 /* QUERY_DV_TIMINGS is not supported on the S-Video input */ in skeleton_query_dv_timings()
568 if (skel->input == 0) in skeleton_query_dv_timings()
569 return -ENODATA; in skeleton_query_dv_timings()
578 return -ENOLINK; in skeleton_query_dv_timings()
580 return -ENOLCK; in skeleton_query_dv_timings()
582 return -ERANGE; in skeleton_query_dv_timings()
585 v4l2_print_dv_timings(skel->v4l2_dev.name, "query_dv_timings:", in skeleton_query_dv_timings()
596 /* DV_TIMINGS_CAP is not supported on the S-Video input */ in skeleton_dv_timings_cap()
597 if (skel->input == 0) in skeleton_dv_timings_cap()
598 return -ENODATA; in skeleton_dv_timings_cap()
606 if (i->index > 1) in skeleton_enum_input()
607 return -EINVAL; in skeleton_enum_input()
609 i->type = V4L2_INPUT_TYPE_CAMERA; in skeleton_enum_input()
610 if (i->index == 0) { in skeleton_enum_input()
611 i->std = SKEL_TVNORMS; in skeleton_enum_input()
612 strlcpy(i->name, "S-Video", sizeof(i->name)); in skeleton_enum_input()
613 i->capabilities = V4L2_IN_CAP_STD; in skeleton_enum_input()
615 i->std = 0; in skeleton_enum_input()
616 strlcpy(i->name, "HDMI", sizeof(i->name)); in skeleton_enum_input()
617 i->capabilities = V4L2_IN_CAP_DV_TIMINGS; in skeleton_enum_input()
627 return -EINVAL; in skeleton_s_input()
633 if (vb2_is_busy(&skel->queue)) in skeleton_s_input()
634 return -EBUSY; in skeleton_s_input()
636 skel->input = i; in skeleton_s_input()
640 * ENUMSTD will return -ENODATA. in skeleton_s_input()
642 skel->vdev.tvnorms = i ? 0 : SKEL_TVNORMS; in skeleton_s_input()
645 skeleton_fill_pix_format(skel, &skel->format); in skeleton_s_input()
653 *i = skel->input; in skeleton_g_input()
661 container_of(ctrl->handler, struct skeleton, ctrl_handler);*/ in skeleton_s_ctrl()
663 switch (ctrl->id) { in skeleton_s_ctrl()
665 /* TODO: set brightness to ctrl->val */ in skeleton_s_ctrl()
668 /* TODO: set contrast to ctrl->val */ in skeleton_s_ctrl()
671 /* TODO: set saturation to ctrl->val */ in skeleton_s_ctrl()
674 /* TODO: set hue to ctrl->val */ in skeleton_s_ctrl()
677 return -EINVAL; in skeleton_s_ctrl()
682 /* ------------------------------------------------------------------
684 ------------------------------------------------------------------*/
695 * receive -EBUSY if they attempt to call the same streaming ioctls).
771 dev_err(&pdev->dev, "no suitable DMA available.\n"); in skeleton_probe()
776 skel = devm_kzalloc(&pdev->dev, sizeof(struct skeleton), GFP_KERNEL); in skeleton_probe()
778 ret = -ENOMEM; in skeleton_probe()
783 ret = devm_request_irq(&pdev->dev, pdev->irq, in skeleton_probe()
786 dev_err(&pdev->dev, "request_irq failed\n"); in skeleton_probe()
789 skel->pdev = pdev; in skeleton_probe()
791 /* Fill in the initial format-related settings */ in skeleton_probe()
792 skel->timings = timings_def; in skeleton_probe()
793 skel->std = V4L2_STD_625_50; in skeleton_probe()
794 skeleton_fill_pix_format(skel, &skel->format); in skeleton_probe()
796 /* Initialize the top-level structure */ in skeleton_probe()
797 ret = v4l2_device_register(&pdev->dev, &skel->v4l2_dev); in skeleton_probe()
801 mutex_init(&skel->lock); in skeleton_probe()
804 hdl = &skel->ctrl_handler; in skeleton_probe()
813 V4L2_CID_HUE, -128, 127, 1, 0); in skeleton_probe()
814 if (hdl->error) { in skeleton_probe()
815 ret = hdl->error; in skeleton_probe()
818 skel->v4l2_dev.ctrl_handler = hdl; in skeleton_probe()
821 q = &skel->queue; in skeleton_probe()
822 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in skeleton_probe()
823 q->io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ; in skeleton_probe()
824 q->dev = &pdev->dev; in skeleton_probe()
825 q->drv_priv = skel; in skeleton_probe()
826 q->buf_struct_size = sizeof(struct skel_buffer); in skeleton_probe()
827 q->ops = &skel_qops; in skeleton_probe()
828 q->mem_ops = &vb2_dma_contig_memops; in skeleton_probe()
829 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in skeleton_probe()
835 q->min_buffers_needed = 2; in skeleton_probe()
838 * as the main serialization lock, but if some of the non-streaming in skeleton_probe()
845 q->lock = &skel->lock; in skeleton_probe()
847 * Since this driver can only do 32-bit DMA we must make sure that in skeleton_probe()
848 * the vb2 core will allocate the buffers in 32-bit DMA memory. in skeleton_probe()
850 q->gfp_flags = GFP_DMA32; in skeleton_probe()
855 INIT_LIST_HEAD(&skel->buf_list); in skeleton_probe()
856 spin_lock_init(&skel->qlock); in skeleton_probe()
859 vdev = &skel->vdev; in skeleton_probe()
860 strlcpy(vdev->name, KBUILD_MODNAME, sizeof(vdev->name)); in skeleton_probe()
863 * function. The release callback must be non-NULL. in skeleton_probe()
865 vdev->release = video_device_release_empty; in skeleton_probe()
866 vdev->fops = &skel_fops, in skeleton_probe()
867 vdev->ioctl_ops = &skel_ioctl_ops, in skeleton_probe()
868 vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | in skeleton_probe()
872 * lock. Exception: if q->lock is set, then the streaming ioctls in skeleton_probe()
875 vdev->lock = &skel->lock; in skeleton_probe()
876 vdev->queue = q; in skeleton_probe()
877 vdev->v4l2_dev = &skel->v4l2_dev; in skeleton_probe()
878 /* Supported SDTV standards, if any */ in skeleton_probe()
879 vdev->tvnorms = SKEL_TVNORMS; in skeleton_probe()
882 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); in skeleton_probe()
886 dev_info(&pdev->dev, "V4L2 PCI Skeleton Driver loaded\n"); in skeleton_probe()
890 v4l2_ctrl_handler_free(&skel->ctrl_handler); in skeleton_probe()
891 v4l2_device_unregister(&skel->v4l2_dev); in skeleton_probe()
902 video_unregister_device(&skel->vdev); in skeleton_remove()
903 v4l2_ctrl_handler_free(&skel->ctrl_handler); in skeleton_remove()
904 v4l2_device_unregister(&skel->v4l2_dev); in skeleton_remove()
905 pci_disable_device(skel->pdev); in skeleton_remove()