Lines Matching defs:csi

67 	struct ti_csi2rx_dev		*csi;
215 static int ti_csi2rx_start_dma(struct ti_csi2rx_dev *csi,
305 struct ti_csi2rx_dev *csi = video_drvdata(file);
307 *f = csi->v_fmt;
336 struct ti_csi2rx_dev *csi = video_drvdata(file);
337 struct vb2_queue *q = &csi->vidq;
347 csi->v_fmt = *f;
412 struct ti_csi2rx_dev *csi = dev_get_drvdata(notifier->v4l2_dev->dev);
414 csi->source = subdev;
421 struct ti_csi2rx_dev *csi = dev_get_drvdata(notifier->v4l2_dev->dev);
422 struct video_device *vdev = &csi->vdev;
429 ret = v4l2_create_fwnode_links_to_pad(csi->source, &csi->pad,
437 ret = v4l2_device_register_subdev_nodes(&csi->v4l2_dev);
449 static int ti_csi2rx_notifier_register(struct ti_csi2rx_dev *csi)
456 node = of_get_child_by_name(csi->dev->of_node, "csi-bridge");
466 v4l2_async_nf_init(&csi->notifier, &csi->v4l2_dev);
467 csi->notifier.ops = &csi_async_notifier_ops;
469 asc = v4l2_async_nf_add_fwnode(&csi->notifier, fwnode,
473 v4l2_async_nf_cleanup(&csi->notifier);
477 ret = v4l2_async_nf_register(&csi->notifier);
479 v4l2_async_nf_cleanup(&csi->notifier);
486 static void ti_csi2rx_setup_shim(struct ti_csi2rx_dev *csi)
491 fmt = find_format_by_fourcc(csi->v_fmt.fmt.pix.pixelformat);
495 writel(reg, csi->shim + SHIM_CNTL);
533 writel(reg, csi->shim + SHIM_DMACNTX);
537 writel(reg, csi->shim + SHIM_PSI_CFG0);
558 static int ti_csi2rx_drain_dma(struct ti_csi2rx_dev *csi)
567 desc = dmaengine_prep_slave_single(csi->dma.chan, csi->dma.drain.paddr,
568 csi->dma.drain.len, DMA_DEV_TO_MEM,
583 dma_async_issue_pending(csi->dma.chan);
587 dmaengine_terminate_sync(csi->dma.chan);
588 dev_dbg(csi->dev, "DMA transfer timed out for drain buffer\n");
599 struct ti_csi2rx_dev *csi = buf->csi;
600 struct ti_csi2rx_dma *dma = &csi->dma;
608 buf->vb.sequence = csi->sequence++;
620 if (ti_csi2rx_start_dma(csi, buf)) {
621 dev_err(csi->dev, "Failed to queue the next buffer for DMA\n");
634 static int ti_csi2rx_start_dma(struct ti_csi2rx_dev *csi,
639 size_t len = csi->v_fmt.fmt.pix.sizeimage;
644 desc = dmaengine_prep_slave_single(csi->dma.chan, addr, len,
658 dma_async_issue_pending(csi->dma.chan);
663 static void ti_csi2rx_stop_dma(struct ti_csi2rx_dev *csi)
665 struct ti_csi2rx_dma *dma = &csi->dma;
671 state = csi->dma.state;
682 ret = ti_csi2rx_drain_dma(csi);
684 dev_warn(csi->dev,
688 ret = dmaengine_terminate_sync(csi->dma.chan);
690 dev_err(csi->dev, "Failed to stop DMA: %d\n", ret);
693 static void ti_csi2rx_cleanup_buffers(struct ti_csi2rx_dev *csi,
696 struct ti_csi2rx_dma *dma = &csi->dma;
701 list_for_each_entry_safe(buf, tmp, &csi->dma.queue, list) {
705 list_for_each_entry_safe(buf, tmp, &csi->dma.submitted, list) {
716 struct ti_csi2rx_dev *csi = vb2_get_drv_priv(q);
717 unsigned int size = csi->v_fmt.fmt.pix.sizeimage;
733 struct ti_csi2rx_dev *csi = vb2_get_drv_priv(vb->vb2_queue);
734 unsigned long size = csi->v_fmt.fmt.pix.sizeimage;
737 dev_err(csi->dev, "Data will not fit into plane\n");
747 struct ti_csi2rx_dev *csi = vb2_get_drv_priv(vb->vb2_queue);
749 struct ti_csi2rx_dma *dma = &csi->dma;
755 buf->csi = csi;
784 ret = ti_csi2rx_drain_dma(csi);
786 dev_warn(csi->dev,
789 ret = ti_csi2rx_start_dma(csi, buf);
791 dev_err(csi->dev, "Failed to start DMA: %d\n", ret);
806 struct ti_csi2rx_dev *csi = vb2_get_drv_priv(vq);
807 struct ti_csi2rx_dma *dma = &csi->dma;
819 ret = video_device_pipeline_start(&csi->vdev, &csi->pipe);
823 ti_csi2rx_setup_shim(csi);
825 csi->sequence = 0;
830 ret = ti_csi2rx_start_dma(csi, buf);
832 dev_err(csi->dev, "Failed to start DMA: %d\n", ret);
841 ret = v4l2_subdev_call(csi->source, video, s_stream, 1);
848 ti_csi2rx_stop_dma(csi);
850 video_device_pipeline_stop(&csi->vdev);
851 writel(0, csi->shim + SHIM_CNTL);
852 writel(0, csi->shim + SHIM_DMACNTX);
854 ti_csi2rx_cleanup_buffers(csi, VB2_BUF_STATE_QUEUED);
860 struct ti_csi2rx_dev *csi = vb2_get_drv_priv(vq);
863 video_device_pipeline_stop(&csi->vdev);
865 writel(0, csi->shim + SHIM_CNTL);
866 writel(0, csi->shim + SHIM_DMACNTX);
868 ret = v4l2_subdev_call(csi->source, video, s_stream, 0);
870 dev_err(csi->dev, "Failed to stop subdev stream\n");
872 ti_csi2rx_stop_dma(csi);
873 ti_csi2rx_cleanup_buffers(csi, VB2_BUF_STATE_ERROR);
886 static int ti_csi2rx_init_vb2q(struct ti_csi2rx_dev *csi)
888 struct vb2_queue *q = &csi->vidq;
893 q->drv_priv = csi;
898 q->dev = dmaengine_get_dma_device(csi->dma.chan);
899 q->lock = &csi->mutex;
906 csi->vdev.queue = q;
915 struct ti_csi2rx_dev *csi = container_of(vdev, struct ti_csi2rx_dev, vdev);
916 struct v4l2_pix_format *csi_fmt = &csi->v_fmt.fmt.pix;
924 ret = v4l2_subdev_call_state_active(csi->source, pad,
930 dev_dbg(csi->dev, "Width does not match (source %u, sink %u)\n",
936 dev_dbg(csi->dev, "Height does not match (source %u, sink %u)\n",
943 dev_dbg(csi->dev, "Field does not match (source %u, sink %u)\n",
950 dev_dbg(csi->dev, "Media bus format 0x%x not supported\n",
956 dev_dbg(csi->dev,
969 static int ti_csi2rx_init_dma(struct ti_csi2rx_dev *csi)
976 INIT_LIST_HEAD(&csi->dma.queue);
977 INIT_LIST_HEAD(&csi->dma.submitted);
978 spin_lock_init(&csi->dma.lock);
980 csi->dma.state = TI_CSI2RX_DMA_STOPPED;
982 csi->dma.chan = dma_request_chan(csi->dev, "rx0");
983 if (IS_ERR(csi->dma.chan))
984 return PTR_ERR(csi->dma.chan);
986 ret = dmaengine_slave_config(csi->dma.chan, &cfg);
988 dma_release_channel(csi->dma.chan);
992 csi->dma.drain.len = DRAIN_BUFFER_SIZE;
993 csi->dma.drain.vaddr = dma_alloc_coherent(csi->dev, csi->dma.drain.len,
994 &csi->dma.drain.paddr,
996 if (!csi->dma.drain.vaddr)
1002 static int ti_csi2rx_v4l2_init(struct ti_csi2rx_dev *csi)
1004 struct media_device *mdev = &csi->mdev;
1005 struct video_device *vdev = &csi->vdev;
1007 struct v4l2_pix_format *pix_fmt = &csi->v_fmt.fmt.pix;
1022 ti_csi2rx_fill_fmt(fmt, &csi->v_fmt);
1024 mdev->dev = csi->dev;
1031 vdev->v4l2_dev = &csi->v4l2_dev;
1038 vdev->lock = &csi->mutex;
1039 video_set_drvdata(vdev, csi);
1041 csi->pad.flags = MEDIA_PAD_FL_SINK;
1043 ret = media_entity_pads_init(&csi->vdev.entity, 1, &csi->pad);
1047 csi->v4l2_dev.mdev = mdev;
1049 ret = v4l2_device_register(csi->dev, &csi->v4l2_dev);
1055 v4l2_device_unregister(&csi->v4l2_dev);
1063 static void ti_csi2rx_cleanup_dma(struct ti_csi2rx_dev *csi)
1065 dma_free_coherent(csi->dev, csi->dma.drain.len,
1066 csi->dma.drain.vaddr, csi->dma.drain.paddr);
1067 csi->dma.drain.vaddr = NULL;
1068 dma_release_channel(csi->dma.chan);
1071 static void ti_csi2rx_cleanup_v4l2(struct ti_csi2rx_dev *csi)
1073 media_device_unregister(&csi->mdev);
1074 v4l2_device_unregister(&csi->v4l2_dev);
1075 media_device_cleanup(&csi->mdev);
1078 static void ti_csi2rx_cleanup_subdev(struct ti_csi2rx_dev *csi)
1080 v4l2_async_nf_unregister(&csi->notifier);
1081 v4l2_async_nf_cleanup(&csi->notifier);
1084 static void ti_csi2rx_cleanup_vb2q(struct ti_csi2rx_dev *csi)
1086 vb2_queue_release(&csi->vidq);
1091 struct ti_csi2rx_dev *csi;
1094 csi = devm_kzalloc(&pdev->dev, sizeof(*csi), GFP_KERNEL);
1095 if (!csi)
1098 csi->dev = &pdev->dev;
1099 platform_set_drvdata(pdev, csi);
1101 mutex_init(&csi->mutex);
1102 csi->shim = devm_platform_ioremap_resource(pdev, 0);
1103 if (IS_ERR(csi->shim)) {
1104 ret = PTR_ERR(csi->shim);
1108 ret = ti_csi2rx_init_dma(csi);
1112 ret = ti_csi2rx_v4l2_init(csi);
1116 ret = ti_csi2rx_init_vb2q(csi);
1120 ret = ti_csi2rx_notifier_register(csi);
1124 ret = of_platform_populate(csi->dev->of_node, NULL, NULL, csi->dev);
1126 dev_err(csi->dev, "Failed to create children: %d\n", ret);
1133 ti_csi2rx_cleanup_subdev(csi);
1135 ti_csi2rx_cleanup_vb2q(csi);
1137 ti_csi2rx_cleanup_v4l2(csi);
1139 ti_csi2rx_cleanup_dma(csi);
1141 mutex_destroy(&csi->mutex);
1147 struct ti_csi2rx_dev *csi = platform_get_drvdata(pdev);
1149 video_unregister_device(&csi->vdev);
1151 ti_csi2rx_cleanup_vb2q(csi);
1152 ti_csi2rx_cleanup_subdev(csi);
1153 ti_csi2rx_cleanup_v4l2(csi);
1154 ti_csi2rx_cleanup_dma(csi);
1156 mutex_destroy(&csi->mutex);