Lines Matching +full:field +full:- +full:even +full:- +full:active
1 // SPDX-License-Identifier: GPL-2.0-only
25 #include <media/v4l2-common.h>
26 #include <media/v4l2-device.h>
27 #include <media/v4l2-ctrls.h>
28 #include <media/v4l2-ioctl.h>
29 #include <media/v4l2-fh.h>
30 #include <media/v4l2-event.h>
31 #include <media/videobuf2-dma-contig.h>
86 * struct sta2x11_vip - All internal data for one instance of device
102 * @active: current active buffer
111 * All non-local data is accessed via this structure.
132 struct vip_buffer *active; /* current active buffer */ member
153 .field = V4L2_FIELD_INTERLACED,
161 .field = V4L2_FIELD_TOP,
169 .field = V4L2_FIELD_BOTTOM,
181 .field = V4L2_FIELD_INTERLACED,
189 .field = V4L2_FIELD_TOP,
197 .field = V4L2_FIELD_BOTTOM,
206 iowrite32((val), (vip->iomem)+(reg)); in reg_write()
211 return ioread32((vip->iomem)+(reg)); in reg_read()
218 if (vip->format.field == V4L2_FIELD_INTERLACED) in start_dma()
219 offset = vip->format.width * 2; in start_dma()
221 spin_lock_irq(&vip->slock); in start_dma()
224 /* Set Top and Bottom Field memory address */ in start_dma()
225 reg_write(vip, DVP_VTP, (u32)vip_buf->dma); in start_dma()
226 reg_write(vip, DVP_VBP, (u32)vip_buf->dma + offset); in start_dma()
227 spin_unlock_irq(&vip->slock); in start_dma()
234 spin_lock(&vip->lock); in vip_active_buf_next()
235 if (list_empty(&vip->buffer_list)) {/* No available buffer */ in vip_active_buf_next()
236 spin_unlock(&vip->lock); in vip_active_buf_next()
239 vip->active = list_first_entry(&vip->buffer_list, in vip_active_buf_next()
243 vip->tcount = 0; in vip_active_buf_next()
244 vip->bcount = 0; in vip_active_buf_next()
245 spin_unlock(&vip->lock); in vip_active_buf_next()
246 if (vb2_is_streaming(&vip->vb_vidq)) { /* streaming is on */ in vip_active_buf_next()
247 start_dma(vip, vip->active); /* start dma capture */ in vip_active_buf_next()
263 sizes[0] = vip->format.sizeimage; in queue_setup()
265 vip->sequence = 0; in queue_setup()
266 vip->active = NULL; in queue_setup()
267 vip->tcount = 0; in queue_setup()
268 vip->bcount = 0; in queue_setup()
277 vip_buf->dma = vb2_dma_contig_plane_dma_addr(vb, 0); in buffer_init()
278 INIT_LIST_HEAD(&vip_buf->list); in buffer_init()
285 struct sta2x11_vip *vip = vb2_get_drv_priv(vb->vb2_queue); in buffer_prepare()
289 size = vip->format.sizeimage; in buffer_prepare()
291 v4l2_err(&vip->v4l2_dev, "buffer too small (%lu < %lu)\n", in buffer_prepare()
293 return -EINVAL; in buffer_prepare()
296 vb2_set_plane_payload(&vip_buf->vb.vb2_buf, 0, size); in buffer_prepare()
303 struct sta2x11_vip *vip = vb2_get_drv_priv(vb->vb2_queue); in buffer_queue()
306 spin_lock(&vip->lock); in buffer_queue()
307 list_add_tail(&vip_buf->list, &vip->buffer_list); in buffer_queue()
308 if (!vip->active) { /* No active buffer, active the first one */ in buffer_queue()
309 vip->active = list_first_entry(&vip->buffer_list, in buffer_queue()
312 if (vb2_is_streaming(&vip->vb_vidq)) /* streaming is on */ in buffer_queue()
315 spin_unlock(&vip->lock); in buffer_queue()
320 struct sta2x11_vip *vip = vb2_get_drv_priv(vb->vb2_queue); in buffer_finish()
324 spin_lock(&vip->lock); in buffer_finish()
325 list_del_init(&vip_buf->list); in buffer_finish()
326 spin_unlock(&vip->lock); in buffer_finish()
328 if (vb2_is_streaming(vb->vb2_queue)) in buffer_finish()
336 spin_lock_irq(&vip->slock); in start_streaming()
339 spin_unlock_irq(&vip->slock); in start_streaming()
342 start_dma(vip, vip->active); in start_streaming()
358 /* Release all active buffers */ in stop_streaming()
359 spin_lock(&vip->lock); in stop_streaming()
360 list_for_each_entry_safe(vip_buf, node, &vip->buffer_list, list) { in stop_streaming()
361 vb2_buffer_done(&vip_buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); in stop_streaming()
362 list_del(&vip_buf->list); in stop_streaming()
364 spin_unlock(&vip->lock); in stop_streaming()
391 * vidioc_querycap - return capabilities of device
403 strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); in vidioc_querycap()
404 strscpy(cap->card, KBUILD_MODNAME, sizeof(cap->card)); in vidioc_querycap()
409 * vidioc_s_std - set video standard
418 * -EIO, no input signal detected
428 * The use of V4L2_STD_ALL to trigger a querystd is non-standard. in vidioc_s_std()
431 v4l2_subdev_call(vip->decoder, video, querystd, &std); in vidioc_s_std()
433 return -EIO; in vidioc_s_std()
436 if (vip->std != std) { in vidioc_s_std()
437 vip->std = std; in vidioc_s_std()
439 vip->format = formats_60[0]; in vidioc_s_std()
441 vip->format = formats_50[0]; in vidioc_s_std()
444 return v4l2_subdev_call(vip->decoder, video, s_std, std); in vidioc_s_std()
448 * vidioc_g_std - get video standard
461 *std = vip->std; in vidioc_g_std()
466 * vidioc_querystd - get possible video standards
479 return v4l2_subdev_call(vip->decoder, video, querystd, std); in vidioc_querystd()
485 if (inp->index > 1) in vidioc_enum_input()
486 return -EINVAL; in vidioc_enum_input()
488 inp->type = V4L2_INPUT_TYPE_CAMERA; in vidioc_enum_input()
489 inp->std = V4L2_STD_ALL; in vidioc_enum_input()
490 sprintf(inp->name, "Camera %u", inp->index); in vidioc_enum_input()
496 * vidioc_s_input - set input line
501 * the current active input line is set
505 * -EINVAL, line number out of range
513 return -EINVAL; in vidioc_s_input()
514 ret = v4l2_subdev_call(vip->decoder, video, s_routing, i, 0, 0); in vidioc_s_input()
517 vip->input = i; in vidioc_s_input()
523 * vidioc_g_input - return input line
528 * the current active input line is returned
536 *i = vip->input; in vidioc_g_input()
541 * vidioc_enum_fmt_vid_cap - return video capture format
555 if (f->index != 0) in vidioc_enum_fmt_vid_cap()
556 return -EINVAL; in vidioc_enum_fmt_vid_cap()
558 f->pixelformat = V4L2_PIX_FMT_UYVY; in vidioc_enum_fmt_vid_cap()
563 * vidioc_try_fmt_vid_cap - set video capture format
569 * field type. width is fixed to 720, no scaling.
575 * -EINVAL, pixel or field format not supported
584 if (V4L2_PIX_FMT_UYVY != f->fmt.pix.pixelformat) { in vidioc_try_fmt_vid_cap()
585 v4l2_warn(&vip->v4l2_dev, "Invalid format, only UYVY supported\n"); in vidioc_try_fmt_vid_cap()
586 return -EINVAL; in vidioc_try_fmt_vid_cap()
589 if (V4L2_STD_525_60 & vip->std) in vidioc_try_fmt_vid_cap()
594 switch (f->fmt.pix.field) { in vidioc_try_fmt_vid_cap()
597 if (interlace_lim < f->fmt.pix.height) in vidioc_try_fmt_vid_cap()
598 f->fmt.pix.field = V4L2_FIELD_INTERLACED; in vidioc_try_fmt_vid_cap()
600 f->fmt.pix.field = V4L2_FIELD_BOTTOM; in vidioc_try_fmt_vid_cap()
604 if (interlace_lim < f->fmt.pix.height) in vidioc_try_fmt_vid_cap()
605 f->fmt.pix.height = interlace_lim; in vidioc_try_fmt_vid_cap()
612 f->fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY; in vidioc_try_fmt_vid_cap()
613 f->fmt.pix.height &= ~1; in vidioc_try_fmt_vid_cap()
614 if (2 * interlace_lim < f->fmt.pix.height) in vidioc_try_fmt_vid_cap()
615 f->fmt.pix.height = 2 * interlace_lim; in vidioc_try_fmt_vid_cap()
616 if (200 > f->fmt.pix.height) in vidioc_try_fmt_vid_cap()
617 f->fmt.pix.height = 200; in vidioc_try_fmt_vid_cap()
618 f->fmt.pix.width = 720; in vidioc_try_fmt_vid_cap()
619 f->fmt.pix.bytesperline = f->fmt.pix.width * 2; in vidioc_try_fmt_vid_cap()
620 f->fmt.pix.sizeimage = f->fmt.pix.width * 2 * f->fmt.pix.height; in vidioc_try_fmt_vid_cap()
621 f->fmt.pix.colorspace = V4L2_COLORSPACE_SMPTE170M; in vidioc_try_fmt_vid_cap()
626 * vidioc_s_fmt_vid_cap - set current video format parameters
647 if (vb2_is_busy(&vip->vb_vidq)) { in vidioc_s_fmt_vid_cap()
649 v4l2_err(&vip->v4l2_dev, "device busy\n"); in vidioc_s_fmt_vid_cap()
650 return -EBUSY; in vidioc_s_fmt_vid_cap()
652 vip->format = f->fmt.pix; in vidioc_s_fmt_vid_cap()
653 switch (vip->format.field) { in vidioc_s_fmt_vid_cap()
655 t_stop = ((vip->format.height / 2 - 1) << 16) | in vidioc_s_fmt_vid_cap()
656 (2 * vip->format.width - 1); in vidioc_s_fmt_vid_cap()
658 pitch = 4 * vip->format.width; in vidioc_s_fmt_vid_cap()
661 t_stop = ((vip->format.height - 1) << 16) | in vidioc_s_fmt_vid_cap()
662 (2 * vip->format.width - 1); in vidioc_s_fmt_vid_cap()
663 b_stop = (0 << 16) | (2 * vip->format.width - 1); in vidioc_s_fmt_vid_cap()
664 pitch = 2 * vip->format.width; in vidioc_s_fmt_vid_cap()
667 t_stop = (0 << 16) | (2 * vip->format.width - 1); in vidioc_s_fmt_vid_cap()
668 b_stop = (vip->format.height << 16) | in vidioc_s_fmt_vid_cap()
669 (2 * vip->format.width - 1); in vidioc_s_fmt_vid_cap()
670 pitch = 2 * vip->format.width; in vidioc_s_fmt_vid_cap()
673 v4l2_err(&vip->v4l2_dev, "unknown field format\n"); in vidioc_s_fmt_vid_cap()
674 return -EINVAL; in vidioc_s_fmt_vid_cap()
677 spin_lock_irq(&vip->slock); in vidioc_s_fmt_vid_cap()
678 /* Y-X Top Field Offset */ in vidioc_s_fmt_vid_cap()
680 /* Y-X Bottom Field Offset */ in vidioc_s_fmt_vid_cap()
682 /* Y-X Top Field Stop*/ in vidioc_s_fmt_vid_cap()
684 /* Y-X Bottom Field Stop */ in vidioc_s_fmt_vid_cap()
688 spin_unlock_irq(&vip->slock); in vidioc_s_fmt_vid_cap()
694 * vidioc_g_fmt_vid_cap - get current video format parameters
708 f->fmt.pix = vip->format; in vidioc_g_fmt_vid_cap()
756 * vip_irq - interrupt routine
779 if (vip->overflow++ > 5) in vip_irq()
789 if ((++vip->tcount) < 2) in vip_irq()
792 vip->bcount++; in vip_irq()
796 if (vip->active) { /* Acquisition is over on this buffer */ in vip_irq()
799 /* Remove the active buffer from the list */ in vip_irq()
800 vip->active->vb.vb2_buf.timestamp = ktime_get_ns(); in vip_irq()
801 vip->active->vb.sequence = vip->sequence++; in vip_irq()
802 vb2_buffer_done(&vip->active->vb.vb2_buf, VB2_BUF_STATE_DONE); in vip_irq()
811 spin_lock_irq(&vip->slock); in sta2x11_vip_init_register()
820 spin_unlock_irq(&vip->slock); in sta2x11_vip_init_register()
824 spin_lock_irq(&vip->slock); in sta2x11_vip_clear_register()
833 spin_unlock_irq(&vip->slock); in sta2x11_vip_clear_register()
839 err = dma_set_coherent_mask(&vip->pdev->dev, DMA_BIT_MASK(29)); in sta2x11_vip_init_buffer()
841 v4l2_err(&vip->v4l2_dev, "Cannot configure coherent mask"); in sta2x11_vip_init_buffer()
844 memset(&vip->vb_vidq, 0, sizeof(struct vb2_queue)); in sta2x11_vip_init_buffer()
845 vip->vb_vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in sta2x11_vip_init_buffer()
846 vip->vb_vidq.io_modes = VB2_MMAP | VB2_READ; in sta2x11_vip_init_buffer()
847 vip->vb_vidq.drv_priv = vip; in sta2x11_vip_init_buffer()
848 vip->vb_vidq.buf_struct_size = sizeof(struct vip_buffer); in sta2x11_vip_init_buffer()
849 vip->vb_vidq.ops = &vip_video_qops; in sta2x11_vip_init_buffer()
850 vip->vb_vidq.mem_ops = &vb2_dma_contig_memops; in sta2x11_vip_init_buffer()
851 vip->vb_vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in sta2x11_vip_init_buffer()
852 vip->vb_vidq.dev = &vip->pdev->dev; in sta2x11_vip_init_buffer()
853 vip->vb_vidq.lock = &vip->v4l_lock; in sta2x11_vip_init_buffer()
854 err = vb2_queue_init(&vip->vb_vidq); in sta2x11_vip_init_buffer()
857 INIT_LIST_HEAD(&vip->buffer_list); in sta2x11_vip_init_buffer()
858 spin_lock_init(&vip->lock); in sta2x11_vip_init_buffer()
868 v4l2_ctrl_handler_init(&vip->ctrl_hdl, 0); in sta2x11_vip_init_controls()
870 vip->v4l2_dev.ctrl_handler = &vip->ctrl_hdl; in sta2x11_vip_init_controls()
871 if (vip->ctrl_hdl.error) { in sta2x11_vip_init_controls()
872 int err = vip->ctrl_hdl.error; in sta2x11_vip_init_controls()
874 v4l2_ctrl_handler_free(&vip->ctrl_hdl); in sta2x11_vip_init_controls()
882 * vip_gpio_reserve - reserve gpio pin
893 int ret = -ENODEV; in vip_gpio_reserve()
923 * vip_gpio_release - release gpio pin
941 * sta2x11_vip_init_one - init one instance of video device
955 * -ENOMEM, no memory
957 * -ENODEV, device could not be detected or registered
966 /* Check if hardware support 26-bit DMA */ in sta2x11_vip_init_one()
967 if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(26))) { in sta2x11_vip_init_one()
968 dev_err(&pdev->dev, "26-bit DMA addressing not available\n"); in sta2x11_vip_init_one()
969 return -EINVAL; in sta2x11_vip_init_one()
977 config = dev_get_platdata(&pdev->dev); in sta2x11_vip_init_one()
979 dev_info(&pdev->dev, "VIP slot disabled\n"); in sta2x11_vip_init_one()
980 ret = -EINVAL; in sta2x11_vip_init_one()
985 ret = vip_gpio_reserve(&pdev->dev, config->pwr_pin, 0, in sta2x11_vip_init_one()
986 config->pwr_name); in sta2x11_vip_init_one()
990 ret = vip_gpio_reserve(&pdev->dev, config->reset_pin, 0, in sta2x11_vip_init_one()
991 config->reset_name); in sta2x11_vip_init_one()
993 vip_gpio_release(&pdev->dev, config->pwr_pin, in sta2x11_vip_init_one()
994 config->pwr_name); in sta2x11_vip_init_one()
998 if (gpio_is_valid(config->pwr_pin)) { in sta2x11_vip_init_one()
1001 gpio_direction_output(config->pwr_pin, 1); in sta2x11_vip_init_one()
1004 if (gpio_is_valid(config->reset_pin)) { in sta2x11_vip_init_one()
1007 gpio_direction_output(config->reset_pin, 1); in sta2x11_vip_init_one()
1014 ret = -ENOMEM; in sta2x11_vip_init_one()
1017 vip->pdev = pdev; in sta2x11_vip_init_one()
1018 vip->std = V4L2_STD_PAL; in sta2x11_vip_init_one()
1019 vip->format = formats_50[0]; in sta2x11_vip_init_one()
1020 vip->config = config; in sta2x11_vip_init_one()
1021 mutex_init(&vip->v4l_lock); in sta2x11_vip_init_one()
1026 ret = v4l2_device_register(&pdev->dev, &vip->v4l2_dev); in sta2x11_vip_init_one()
1030 dev_dbg(&pdev->dev, "BAR #0 at 0x%lx 0x%lx irq %d\n", in sta2x11_vip_init_one()
1032 (unsigned long)pci_resource_len(pdev, 0), pdev->irq); in sta2x11_vip_init_one()
1040 vip->iomem = pci_iomap(pdev, 0, 0x100); in sta2x11_vip_init_one()
1041 if (!vip->iomem) { in sta2x11_vip_init_one()
1042 ret = -ENOMEM; in sta2x11_vip_init_one()
1053 spin_lock_init(&vip->slock); in sta2x11_vip_init_one()
1055 ret = request_irq(pdev->irq, vip_irq, IRQF_SHARED, KBUILD_MODNAME, vip); in sta2x11_vip_init_one()
1057 dev_err(&pdev->dev, "request_irq failed\n"); in sta2x11_vip_init_one()
1058 ret = -ENODEV; in sta2x11_vip_init_one()
1063 vip->video_dev = video_dev_template; in sta2x11_vip_init_one()
1064 vip->video_dev.v4l2_dev = &vip->v4l2_dev; in sta2x11_vip_init_one()
1065 vip->video_dev.queue = &vip->vb_vidq; in sta2x11_vip_init_one()
1066 vip->video_dev.lock = &vip->v4l_lock; in sta2x11_vip_init_one()
1067 video_set_drvdata(&vip->video_dev, vip); in sta2x11_vip_init_one()
1069 ret = video_register_device(&vip->video_dev, VFL_TYPE_VIDEO, -1); in sta2x11_vip_init_one()
1074 vip->adapter = i2c_get_adapter(vip->config->i2c_id); in sta2x11_vip_init_one()
1075 if (!vip->adapter) { in sta2x11_vip_init_one()
1076 ret = -ENODEV; in sta2x11_vip_init_one()
1077 dev_err(&pdev->dev, "no I2C adapter found\n"); in sta2x11_vip_init_one()
1081 vip->decoder = v4l2_i2c_new_subdev(&vip->v4l2_dev, vip->adapter, in sta2x11_vip_init_one()
1082 "adv7180", vip->config->i2c_addr, in sta2x11_vip_init_one()
1084 if (!vip->decoder) { in sta2x11_vip_init_one()
1085 ret = -ENODEV; in sta2x11_vip_init_one()
1086 dev_err(&pdev->dev, "no decoder found\n"); in sta2x11_vip_init_one()
1090 i2c_put_adapter(vip->adapter); in sta2x11_vip_init_one()
1091 v4l2_subdev_call(vip->decoder, core, init, 0); in sta2x11_vip_init_one()
1095 dev_info(&pdev->dev, "STA2X11 Video Input Port (VIP) loaded\n"); in sta2x11_vip_init_one()
1099 video_set_drvdata(&vip->video_dev, NULL); in sta2x11_vip_init_one()
1101 vb2_video_unregister_device(&vip->video_dev); in sta2x11_vip_init_one()
1102 free_irq(pdev->irq, vip); in sta2x11_vip_init_one()
1106 pci_iounmap(pdev, vip->iomem); in sta2x11_vip_init_one()
1110 v4l2_device_unregister(&vip->v4l2_dev); in sta2x11_vip_init_one()
1114 vip_gpio_release(&pdev->dev, config->reset_pin, config->reset_name); in sta2x11_vip_init_one()
1115 vip_gpio_release(&pdev->dev, config->pwr_pin, config->pwr_name); in sta2x11_vip_init_one()
1125 * sta2x11_vip_remove_one - release device
1144 video_set_drvdata(&vip->video_dev, NULL); in sta2x11_vip_remove_one()
1145 vb2_video_unregister_device(&vip->video_dev); in sta2x11_vip_remove_one()
1146 free_irq(pdev->irq, vip); in sta2x11_vip_remove_one()
1148 pci_iounmap(pdev, vip->iomem); in sta2x11_vip_remove_one()
1151 v4l2_device_unregister(&vip->v4l2_dev); in sta2x11_vip_remove_one()
1153 vip_gpio_release(&pdev->dev, vip->config->pwr_pin, in sta2x11_vip_remove_one()
1154 vip->config->pwr_name); in sta2x11_vip_remove_one()
1155 vip_gpio_release(&pdev->dev, vip->config->reset_pin, in sta2x11_vip_remove_one()
1156 vip->config->reset_name); in sta2x11_vip_remove_one()
1166 * sta2x11_vip_suspend - set device into power save mode
1172 * even if device could not be disabled. (workaround for hardware problem)
1182 spin_lock_irqsave(&vip->slock, flags); in sta2x11_vip_suspend()
1183 vip->register_save_area[0] = reg_read(vip, DVP_CTL); in sta2x11_vip_suspend()
1184 reg_write(vip, DVP_CTL, vip->register_save_area[0] & DVP_CTL_DIS); in sta2x11_vip_suspend()
1185 vip->register_save_area[SAVE_COUNT] = reg_read(vip, DVP_ITM); in sta2x11_vip_suspend()
1188 vip->register_save_area[i] = reg_read(vip, 4 * i); in sta2x11_vip_suspend()
1190 vip->register_save_area[SAVE_COUNT + IRQ_COUNT + i] = in sta2x11_vip_suspend()
1192 spin_unlock_irqrestore(&vip->slock, flags); in sta2x11_vip_suspend()
1194 vip->disabled = 1; in sta2x11_vip_suspend()
1201 * sta2x11_vip_resume - resume device operation
1218 vip->disabled = 0; in sta2x11_vip_resume()
1220 spin_lock_irqsave(&vip->slock, flags); in sta2x11_vip_resume()
1222 reg_write(vip, 4 * i, vip->register_save_area[i]); in sta2x11_vip_resume()
1225 vip->register_save_area[SAVE_COUNT + IRQ_COUNT + i]); in sta2x11_vip_resume()
1226 reg_write(vip, DVP_CTL, vip->register_save_area[0]); in sta2x11_vip_resume()
1227 reg_write(vip, DVP_ITM, vip->register_save_area[SAVE_COUNT]); in sta2x11_vip_resume()
1228 spin_unlock_irqrestore(&vip->slock, flags); in sta2x11_vip_resume()