• Home
  • Raw
  • Download

Lines Matching refs:dma

62 static int xvip_dma_verify_format(struct xvip_dma *dma)  in xvip_dma_verify_format()  argument
68 subdev = xvip_dma_remote_subdev(&dma->pad, &fmt.pad); in xvip_dma_verify_format()
77 if (dma->fmtinfo->code != fmt.format.code || in xvip_dma_verify_format()
78 dma->format.height != fmt.format.height || in xvip_dma_verify_format()
79 dma->format.width != fmt.format.width || in xvip_dma_verify_format()
80 dma->format.colorspace != fmt.format.colorspace) in xvip_dma_verify_format()
103 struct xvip_dma *dma = pipe->output; in xvip_pipeline_start_stop() local
109 entity = &dma->video.entity; in xvip_pipeline_start_stop()
194 struct xvip_dma *dma; in xvip_pipeline_validate() local
199 dma = to_xvip_dma(media_entity_to_video_device(entity)); in xvip_pipeline_validate()
201 if (dma->pad.flags & MEDIA_PAD_FL_SINK) { in xvip_pipeline_validate()
202 pipe->output = dma; in xvip_pipeline_validate()
254 struct xvip_dma *dma) in xvip_pipeline_prepare() argument
262 ret = xvip_pipeline_validate(pipe, dma); in xvip_pipeline_prepare()
290 struct xvip_dma *dma; member
298 struct xvip_dma *dma = buf->dma; in xvip_dma_complete() local
300 spin_lock(&dma->queued_lock); in xvip_dma_complete()
302 spin_unlock(&dma->queued_lock); in xvip_dma_complete()
305 buf->buf.sequence = dma->sequence++; in xvip_dma_complete()
307 vb2_set_plane_payload(&buf->buf.vb2_buf, 0, dma->format.sizeimage); in xvip_dma_complete()
317 struct xvip_dma *dma = vb2_get_drv_priv(vq); in xvip_dma_queue_setup() local
320 if (fmt && fmt->fmt.pix.sizeimage < dma->format.sizeimage) in xvip_dma_queue_setup()
325 sizes[0] = fmt ? fmt->fmt.pix.sizeimage : dma->format.sizeimage; in xvip_dma_queue_setup()
326 alloc_ctxs[0] = dma->alloc_ctx; in xvip_dma_queue_setup()
334 struct xvip_dma *dma = vb2_get_drv_priv(vb->vb2_queue); in xvip_dma_buffer_prepare() local
337 buf->dma = dma; in xvip_dma_buffer_prepare()
345 struct xvip_dma *dma = vb2_get_drv_priv(vb->vb2_queue); in xvip_dma_buffer_queue() local
351 if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { in xvip_dma_buffer_queue()
353 dma->xt.dir = DMA_DEV_TO_MEM; in xvip_dma_buffer_queue()
354 dma->xt.src_sgl = false; in xvip_dma_buffer_queue()
355 dma->xt.dst_sgl = true; in xvip_dma_buffer_queue()
356 dma->xt.dst_start = addr; in xvip_dma_buffer_queue()
359 dma->xt.dir = DMA_MEM_TO_DEV; in xvip_dma_buffer_queue()
360 dma->xt.src_sgl = true; in xvip_dma_buffer_queue()
361 dma->xt.dst_sgl = false; in xvip_dma_buffer_queue()
362 dma->xt.src_start = addr; in xvip_dma_buffer_queue()
365 dma->xt.frame_size = 1; in xvip_dma_buffer_queue()
366 dma->sgl[0].size = dma->format.width * dma->fmtinfo->bpp; in xvip_dma_buffer_queue()
367 dma->sgl[0].icg = dma->format.bytesperline - dma->sgl[0].size; in xvip_dma_buffer_queue()
368 dma->xt.numf = dma->format.height; in xvip_dma_buffer_queue()
370 desc = dmaengine_prep_interleaved_dma(dma->dma, &dma->xt, flags); in xvip_dma_buffer_queue()
372 dev_err(dma->xdev->dev, "Failed to prepare DMA transfer\n"); in xvip_dma_buffer_queue()
379 spin_lock_irq(&dma->queued_lock); in xvip_dma_buffer_queue()
380 list_add_tail(&buf->queue, &dma->queued_bufs); in xvip_dma_buffer_queue()
381 spin_unlock_irq(&dma->queued_lock); in xvip_dma_buffer_queue()
385 if (vb2_is_streaming(&dma->queue)) in xvip_dma_buffer_queue()
386 dma_async_issue_pending(dma->dma); in xvip_dma_buffer_queue()
391 struct xvip_dma *dma = vb2_get_drv_priv(vq); in xvip_dma_start_streaming() local
396 dma->sequence = 0; in xvip_dma_start_streaming()
405 pipe = dma->video.entity.pipe in xvip_dma_start_streaming()
406 ? to_xvip_pipeline(&dma->video.entity) : &dma->pipe; in xvip_dma_start_streaming()
408 ret = media_entity_pipeline_start(&dma->video.entity, &pipe->pipe); in xvip_dma_start_streaming()
415 ret = xvip_dma_verify_format(dma); in xvip_dma_start_streaming()
419 ret = xvip_pipeline_prepare(pipe, dma); in xvip_dma_start_streaming()
426 dma_async_issue_pending(dma->dma); in xvip_dma_start_streaming()
434 media_entity_pipeline_stop(&dma->video.entity); in xvip_dma_start_streaming()
438 spin_lock_irq(&dma->queued_lock); in xvip_dma_start_streaming()
439 list_for_each_entry_safe(buf, nbuf, &dma->queued_bufs, queue) { in xvip_dma_start_streaming()
443 spin_unlock_irq(&dma->queued_lock); in xvip_dma_start_streaming()
450 struct xvip_dma *dma = vb2_get_drv_priv(vq); in xvip_dma_stop_streaming() local
451 struct xvip_pipeline *pipe = to_xvip_pipeline(&dma->video.entity); in xvip_dma_stop_streaming()
458 dmaengine_terminate_all(dma->dma); in xvip_dma_stop_streaming()
462 media_entity_pipeline_stop(&dma->video.entity); in xvip_dma_stop_streaming()
465 spin_lock_irq(&dma->queued_lock); in xvip_dma_stop_streaming()
466 list_for_each_entry_safe(buf, nbuf, &dma->queued_bufs, queue) { in xvip_dma_stop_streaming()
470 spin_unlock_irq(&dma->queued_lock); in xvip_dma_stop_streaming()
491 struct xvip_dma *dma = to_xvip_dma(vfh->vdev); in xvip_dma_querycap() local
494 | dma->xdev->v4l2_caps; in xvip_dma_querycap()
496 if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) in xvip_dma_querycap()
502 strlcpy(cap->card, dma->video.name, sizeof(cap->card)); in xvip_dma_querycap()
504 dma->xdev->dev->of_node->name, dma->port); in xvip_dma_querycap()
518 struct xvip_dma *dma = to_xvip_dma(vfh->vdev); in xvip_dma_enum_format() local
523 f->pixelformat = dma->format.pixelformat; in xvip_dma_enum_format()
524 strlcpy(f->description, dma->fmtinfo->description, in xvip_dma_enum_format()
534 struct xvip_dma *dma = to_xvip_dma(vfh->vdev); in xvip_dma_get_format() local
536 format->fmt.pix = dma->format; in xvip_dma_get_format()
542 __xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix, in __xvip_dma_try_format() argument
568 align = lcm(dma->align, info->bpp); in __xvip_dma_try_format()
582 max_bpl = rounddown(XVIP_DMA_MAX_WIDTH, dma->align); in __xvip_dma_try_format()
583 bpl = rounddown(pix->bytesperline, dma->align); in __xvip_dma_try_format()
596 struct xvip_dma *dma = to_xvip_dma(vfh->vdev); in xvip_dma_try_format() local
598 __xvip_dma_try_format(dma, &format->fmt.pix, NULL); in xvip_dma_try_format()
606 struct xvip_dma *dma = to_xvip_dma(vfh->vdev); in xvip_dma_set_format() local
609 __xvip_dma_try_format(dma, &format->fmt.pix, &info); in xvip_dma_set_format()
611 if (vb2_is_busy(&dma->queue)) in xvip_dma_set_format()
614 dma->format = format->fmt.pix; in xvip_dma_set_format()
615 dma->fmtinfo = info; in xvip_dma_set_format()
656 int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma, in xvip_dma_init() argument
662 dma->xdev = xdev; in xvip_dma_init()
663 dma->port = port; in xvip_dma_init()
664 mutex_init(&dma->lock); in xvip_dma_init()
665 mutex_init(&dma->pipe.lock); in xvip_dma_init()
666 INIT_LIST_HEAD(&dma->queued_bufs); in xvip_dma_init()
667 spin_lock_init(&dma->queued_lock); in xvip_dma_init()
669 dma->fmtinfo = xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT); in xvip_dma_init()
670 dma->format.pixelformat = dma->fmtinfo->fourcc; in xvip_dma_init()
671 dma->format.colorspace = V4L2_COLORSPACE_SRGB; in xvip_dma_init()
672 dma->format.field = V4L2_FIELD_NONE; in xvip_dma_init()
673 dma->format.width = XVIP_DMA_DEF_WIDTH; in xvip_dma_init()
674 dma->format.height = XVIP_DMA_DEF_HEIGHT; in xvip_dma_init()
675 dma->format.bytesperline = dma->format.width * dma->fmtinfo->bpp; in xvip_dma_init()
676 dma->format.sizeimage = dma->format.bytesperline * dma->format.height; in xvip_dma_init()
679 dma->pad.flags = type == V4L2_BUF_TYPE_VIDEO_CAPTURE in xvip_dma_init()
682 ret = media_entity_init(&dma->video.entity, 1, &dma->pad, 0); in xvip_dma_init()
687 dma->video.fops = &xvip_dma_fops; in xvip_dma_init()
688 dma->video.v4l2_dev = &xdev->v4l2_dev; in xvip_dma_init()
689 dma->video.queue = &dma->queue; in xvip_dma_init()
690 snprintf(dma->video.name, sizeof(dma->video.name), "%s %s %u", in xvip_dma_init()
694 dma->video.vfl_type = VFL_TYPE_GRABBER; in xvip_dma_init()
695 dma->video.vfl_dir = type == V4L2_BUF_TYPE_VIDEO_CAPTURE in xvip_dma_init()
697 dma->video.release = video_device_release_empty; in xvip_dma_init()
698 dma->video.ioctl_ops = &xvip_dma_ioctl_ops; in xvip_dma_init()
699 dma->video.lock = &dma->lock; in xvip_dma_init()
701 video_set_drvdata(&dma->video, dma); in xvip_dma_init()
704 dma->alloc_ctx = vb2_dma_contig_init_ctx(dma->xdev->dev); in xvip_dma_init()
705 if (IS_ERR(dma->alloc_ctx)) { in xvip_dma_init()
706 ret = PTR_ERR(dma->alloc_ctx); in xvip_dma_init()
717 dma->queue.type = type; in xvip_dma_init()
718 dma->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; in xvip_dma_init()
719 dma->queue.lock = &dma->lock; in xvip_dma_init()
720 dma->queue.drv_priv = dma; in xvip_dma_init()
721 dma->queue.buf_struct_size = sizeof(struct xvip_dma_buffer); in xvip_dma_init()
722 dma->queue.ops = &xvip_dma_queue_qops; in xvip_dma_init()
723 dma->queue.mem_ops = &vb2_dma_contig_memops; in xvip_dma_init()
724 dma->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC in xvip_dma_init()
726 ret = vb2_queue_init(&dma->queue); in xvip_dma_init()
728 dev_err(dma->xdev->dev, "failed to initialize VB2 queue\n"); in xvip_dma_init()
734 dma->dma = dma_request_slave_channel(dma->xdev->dev, name); in xvip_dma_init()
735 if (dma->dma == NULL) { in xvip_dma_init()
736 dev_err(dma->xdev->dev, "no VDMA channel found\n"); in xvip_dma_init()
741 dma->align = 1 << dma->dma->device->copy_align; in xvip_dma_init()
743 ret = video_register_device(&dma->video, VFL_TYPE_GRABBER, -1); in xvip_dma_init()
745 dev_err(dma->xdev->dev, "failed to register video device\n"); in xvip_dma_init()
752 xvip_dma_cleanup(dma); in xvip_dma_init()
756 void xvip_dma_cleanup(struct xvip_dma *dma) in xvip_dma_cleanup() argument
758 if (video_is_registered(&dma->video)) in xvip_dma_cleanup()
759 video_unregister_device(&dma->video); in xvip_dma_cleanup()
761 if (dma->dma) in xvip_dma_cleanup()
762 dma_release_channel(dma->dma); in xvip_dma_cleanup()
764 if (!IS_ERR_OR_NULL(dma->alloc_ctx)) in xvip_dma_cleanup()
765 vb2_dma_contig_cleanup_ctx(dma->alloc_ctx); in xvip_dma_cleanup()
767 media_entity_cleanup(&dma->video.entity); in xvip_dma_cleanup()
769 mutex_destroy(&dma->lock); in xvip_dma_cleanup()
770 mutex_destroy(&dma->pipe.lock); in xvip_dma_cleanup()