Lines Matching full:video

76 sun6i_video_remote_subdev(struct sun6i_video *video, u32 *pad)  in sun6i_video_remote_subdev()  argument
80 remote = media_entity_remote_pad(&video->pad); in sun6i_video_remote_subdev()
97 struct sun6i_video *video = vb2_get_drv_priv(vq); in sun6i_video_queue_setup() local
98 unsigned int size = video->fmt.fmt.pix.sizeimage; in sun6i_video_queue_setup()
114 struct sun6i_video *video = vb2_get_drv_priv(vb->vb2_queue); in sun6i_video_buffer_prepare() local
115 unsigned long size = video->fmt.fmt.pix.sizeimage; in sun6i_video_buffer_prepare()
118 v4l2_err(video->vdev.v4l2_dev, "buffer too small (%lu < %lu)\n", in sun6i_video_buffer_prepare()
127 vbuf->field = video->fmt.fmt.pix.field; in sun6i_video_buffer_prepare()
134 struct sun6i_video *video = vb2_get_drv_priv(vq); in sun6i_video_start_streaming() local
142 video->sequence = 0; in sun6i_video_start_streaming()
144 ret = media_pipeline_start(&video->vdev.entity, &video->vdev.pipe); in sun6i_video_start_streaming()
148 if (video->mbus_code == 0) { in sun6i_video_start_streaming()
153 subdev = sun6i_video_remote_subdev(video, NULL); in sun6i_video_start_streaming()
157 config.pixelformat = video->fmt.fmt.pix.pixelformat; in sun6i_video_start_streaming()
158 config.code = video->mbus_code; in sun6i_video_start_streaming()
159 config.field = video->fmt.fmt.pix.field; in sun6i_video_start_streaming()
160 config.width = video->fmt.fmt.pix.width; in sun6i_video_start_streaming()
161 config.height = video->fmt.fmt.pix.height; in sun6i_video_start_streaming()
163 ret = sun6i_csi_update_config(video->csi, &config); in sun6i_video_start_streaming()
167 spin_lock_irqsave(&video->dma_queue_lock, flags); in sun6i_video_start_streaming()
169 buf = list_first_entry(&video->dma_queue, in sun6i_video_start_streaming()
172 sun6i_csi_update_buf_addr(video->csi, buf->dma_addr); in sun6i_video_start_streaming()
174 sun6i_csi_set_stream(video->csi, true); in sun6i_video_start_streaming()
195 sun6i_csi_update_buf_addr(video->csi, next_buf->dma_addr); in sun6i_video_start_streaming()
197 spin_unlock_irqrestore(&video->dma_queue_lock, flags); in sun6i_video_start_streaming()
199 ret = v4l2_subdev_call(subdev, video, s_stream, 1); in sun6i_video_start_streaming()
206 sun6i_csi_set_stream(video->csi, false); in sun6i_video_start_streaming()
208 media_pipeline_stop(&video->vdev.entity); in sun6i_video_start_streaming()
210 spin_lock_irqsave(&video->dma_queue_lock, flags); in sun6i_video_start_streaming()
211 list_for_each_entry(buf, &video->dma_queue, list) in sun6i_video_start_streaming()
213 INIT_LIST_HEAD(&video->dma_queue); in sun6i_video_start_streaming()
214 spin_unlock_irqrestore(&video->dma_queue_lock, flags); in sun6i_video_start_streaming()
221 struct sun6i_video *video = vb2_get_drv_priv(vq); in sun6i_video_stop_streaming() local
226 subdev = sun6i_video_remote_subdev(video, NULL); in sun6i_video_stop_streaming()
228 v4l2_subdev_call(subdev, video, s_stream, 0); in sun6i_video_stop_streaming()
230 sun6i_csi_set_stream(video->csi, false); in sun6i_video_stop_streaming()
232 media_pipeline_stop(&video->vdev.entity); in sun6i_video_stop_streaming()
235 spin_lock_irqsave(&video->dma_queue_lock, flags); in sun6i_video_stop_streaming()
236 list_for_each_entry(buf, &video->dma_queue, list) in sun6i_video_stop_streaming()
238 INIT_LIST_HEAD(&video->dma_queue); in sun6i_video_stop_streaming()
239 spin_unlock_irqrestore(&video->dma_queue_lock, flags); in sun6i_video_stop_streaming()
247 struct sun6i_video *video = vb2_get_drv_priv(vb->vb2_queue); in sun6i_video_buffer_queue() local
250 spin_lock_irqsave(&video->dma_queue_lock, flags); in sun6i_video_buffer_queue()
252 list_add_tail(&buf->list, &video->dma_queue); in sun6i_video_buffer_queue()
253 spin_unlock_irqrestore(&video->dma_queue_lock, flags); in sun6i_video_buffer_queue()
256 void sun6i_video_frame_done(struct sun6i_video *video) in sun6i_video_frame_done() argument
262 spin_lock(&video->dma_queue_lock); in sun6i_video_frame_done()
264 buf = list_first_entry(&video->dma_queue, in sun6i_video_frame_done()
266 if (list_is_last(&buf->list, &video->dma_queue)) { in sun6i_video_frame_done()
267 dev_dbg(video->csi->dev, "Frame dropped!\n"); in sun6i_video_frame_done()
279 sun6i_csi_update_buf_addr(video->csi, next_buf->dma_addr); in sun6i_video_frame_done()
280 dev_dbg(video->csi->dev, "Frame dropped!\n"); in sun6i_video_frame_done()
287 vbuf->sequence = video->sequence; in sun6i_video_frame_done()
291 if (!list_is_last(&next_buf->list, &video->dma_queue)) { in sun6i_video_frame_done()
294 sun6i_csi_update_buf_addr(video->csi, next_buf->dma_addr); in sun6i_video_frame_done()
296 dev_dbg(video->csi->dev, "Next frame will be dropped!\n"); in sun6i_video_frame_done()
300 video->sequence++; in sun6i_video_frame_done()
301 spin_unlock(&video->dma_queue_lock); in sun6i_video_frame_done()
317 struct sun6i_video *video = video_drvdata(file); in vidioc_querycap() local
319 strscpy(cap->driver, "sun6i-video", sizeof(cap->driver)); in vidioc_querycap()
320 strscpy(cap->card, video->vdev.name, sizeof(cap->card)); in vidioc_querycap()
322 video->csi->dev->of_node->name); in vidioc_querycap()
343 struct sun6i_video *video = video_drvdata(file); in vidioc_g_fmt_vid_cap() local
345 *fmt = video->fmt; in vidioc_g_fmt_vid_cap()
350 static int sun6i_video_try_fmt(struct sun6i_video *video, in sun6i_video_try_fmt() argument
377 static int sun6i_video_set_fmt(struct sun6i_video *video, struct v4l2_format *f) in sun6i_video_set_fmt() argument
381 ret = sun6i_video_try_fmt(video, f); in sun6i_video_set_fmt()
385 video->fmt = *f; in sun6i_video_set_fmt()
393 struct sun6i_video *video = video_drvdata(file); in vidioc_s_fmt_vid_cap() local
395 if (vb2_is_busy(&video->vb2_vidq)) in vidioc_s_fmt_vid_cap()
398 return sun6i_video_set_fmt(video, f); in vidioc_s_fmt_vid_cap()
404 struct sun6i_video *video = video_drvdata(file); in vidioc_try_fmt_vid_cap() local
406 return sun6i_video_try_fmt(video, f); in vidioc_try_fmt_vid_cap()
467 struct sun6i_video *video = video_drvdata(file); in sun6i_video_open() local
470 if (mutex_lock_interruptible(&video->lock)) in sun6i_video_open()
477 ret = v4l2_pipeline_pm_get(&video->vdev.entity); in sun6i_video_open()
485 ret = sun6i_csi_set_power(video->csi, true); in sun6i_video_open()
489 mutex_unlock(&video->lock); in sun6i_video_open()
495 mutex_unlock(&video->lock); in sun6i_video_open()
501 struct sun6i_video *video = video_drvdata(file); in sun6i_video_close() local
504 mutex_lock(&video->lock); in sun6i_video_close()
510 v4l2_pipeline_pm_put(&video->vdev.entity); in sun6i_video_close()
513 sun6i_csi_set_power(video->csi, false); in sun6i_video_close()
515 mutex_unlock(&video->lock); in sun6i_video_close()
551 struct sun6i_video *video = video_get_drvdata(vdev); in sun6i_video_link_validate() local
555 video->mbus_code = 0; in sun6i_video_link_validate()
558 dev_info(video->csi->dev, in sun6i_video_link_validate()
559 "video node %s pad not connected\n", vdev->name); in sun6i_video_link_validate()
567 if (!sun6i_csi_is_format_supported(video->csi, in sun6i_video_link_validate()
568 video->fmt.fmt.pix.pixelformat, in sun6i_video_link_validate()
570 dev_err(video->csi->dev, in sun6i_video_link_validate()
572 video->fmt.fmt.pix.pixelformat, in sun6i_video_link_validate()
577 if (source_fmt.format.width != video->fmt.fmt.pix.width || in sun6i_video_link_validate()
578 source_fmt.format.height != video->fmt.fmt.pix.height) { in sun6i_video_link_validate()
579 dev_err(video->csi->dev, in sun6i_video_link_validate()
581 video->fmt.fmt.pix.width, video->fmt.fmt.pix.height, in sun6i_video_link_validate()
586 video->mbus_code = source_fmt.format.code; in sun6i_video_link_validate()
595 int sun6i_video_init(struct sun6i_video *video, struct sun6i_csi *csi, in sun6i_video_init() argument
598 struct video_device *vdev = &video->vdev; in sun6i_video_init()
599 struct vb2_queue *vidq = &video->vb2_vidq; in sun6i_video_init()
603 video->csi = csi; in sun6i_video_init()
606 video->pad.flags = MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT; in sun6i_video_init()
608 ret = media_entity_pads_init(&vdev->entity, 1, &video->pad); in sun6i_video_init()
612 mutex_init(&video->lock); in sun6i_video_init()
614 INIT_LIST_HEAD(&video->dma_queue); in sun6i_video_init()
615 spin_lock_init(&video->dma_queue_lock); in sun6i_video_init()
617 video->sequence = 0; in sun6i_video_init()
625 sun6i_video_set_fmt(video, &fmt); in sun6i_video_init()
630 vidq->drv_priv = video; in sun6i_video_init()
635 vidq->lock = &video->lock; in sun6i_video_init()
646 /* Register video device */ in sun6i_video_init()
655 vdev->lock = &video->lock; in sun6i_video_init()
657 video_set_drvdata(vdev, video); in sun6i_video_init()
669 media_entity_cleanup(&video->vdev.entity); in sun6i_video_init()
670 mutex_destroy(&video->lock); in sun6i_video_init()
674 void sun6i_video_cleanup(struct sun6i_video *video) in sun6i_video_cleanup() argument
676 vb2_video_unregister_device(&video->vdev); in sun6i_video_cleanup()
677 media_entity_cleanup(&video->vdev.entity); in sun6i_video_cleanup()
678 mutex_destroy(&video->lock); in sun6i_video_cleanup()