Lines Matching full:cru
3 * Driver for Renesas RZ/G2L CRU
21 #include "rzg2l-cru.h"
23 /* HW CRU Registers Definition */
25 /* CRU Control Register */
29 /* CRU Interrupt Enable Register */
33 /* CRU Interrupt Status Register */
37 /* CRU Reset Register */
41 /* Memory Bank Base Address (Lower) Register for CRU Image Data */
44 /* Memory Bank Base Address (Higher) Register for CRU Image Data */
47 /* Memory Bank Enable Register for CRU Image Data */
51 /* Memory Bank Status Register for CRU Image Data */
55 /* AXI Master FIFO Pointer Register for CRU Image Data */
60 /* AXI Master Transfer Stop Register for CRU Image Data */
64 /* AXI Master Transfer Stop Status Register for CRU Image Data */
68 /* CRU Image Processing Enable Register */
72 /* CRU Image Processing Main Control Register */
80 /* CRU Module Status Register */
84 /* CRU Data Output Mode Register */
108 static void rzg2l_cru_write(struct rzg2l_cru_dev *cru, u32 offset, u32 value) in rzg2l_cru_write() argument
110 iowrite32(value, cru->base + offset); in rzg2l_cru_write()
113 static u32 rzg2l_cru_read(struct rzg2l_cru_dev *cru, u32 offset) in rzg2l_cru_read() argument
115 return ioread32(cru->base + offset); in rzg2l_cru_read()
119 static void return_unused_buffers(struct rzg2l_cru_dev *cru, in return_unused_buffers() argument
126 spin_lock_irqsave(&cru->qlock, flags); in return_unused_buffers()
127 for (i = 0; i < cru->num_buf; i++) { in return_unused_buffers()
128 if (cru->queue_buf[i]) { in return_unused_buffers()
129 vb2_buffer_done(&cru->queue_buf[i]->vb2_buf, in return_unused_buffers()
131 cru->queue_buf[i] = NULL; in return_unused_buffers()
135 list_for_each_entry_safe(buf, node, &cru->buf_list, list) { in return_unused_buffers()
139 spin_unlock_irqrestore(&cru->qlock, flags); in return_unused_buffers()
146 struct rzg2l_cru_dev *cru = vb2_get_drv_priv(vq); in rzg2l_cru_queue_setup() local
150 return sizes[0] < cru->format.sizeimage ? -EINVAL : 0; in rzg2l_cru_queue_setup()
153 sizes[0] = cru->format.sizeimage; in rzg2l_cru_queue_setup()
160 struct rzg2l_cru_dev *cru = vb2_get_drv_priv(vb->vb2_queue); in rzg2l_cru_buffer_prepare() local
161 unsigned long size = cru->format.sizeimage; in rzg2l_cru_buffer_prepare()
164 dev_err(cru->dev, "buffer too small (%lu < %lu)\n", in rzg2l_cru_buffer_prepare()
177 struct rzg2l_cru_dev *cru = vb2_get_drv_priv(vb->vb2_queue); in rzg2l_cru_buffer_queue() local
180 spin_lock_irqsave(&cru->qlock, flags); in rzg2l_cru_buffer_queue()
182 list_add_tail(to_buf_list(vbuf), &cru->buf_list); in rzg2l_cru_buffer_queue()
184 spin_unlock_irqrestore(&cru->qlock, flags); in rzg2l_cru_buffer_queue()
187 static int rzg2l_cru_mc_validate_format(struct rzg2l_cru_dev *cru, in rzg2l_cru_mc_validate_format() argument
220 if (fmt.format.width != cru->format.width || in rzg2l_cru_mc_validate_format()
221 fmt.format.height != cru->format.height) in rzg2l_cru_mc_validate_format()
227 static void rzg2l_cru_set_slot_addr(struct rzg2l_cru_dev *cru, in rzg2l_cru_set_slot_addr() argument
238 rzg2l_cru_write(cru, AMnMBxADDRL(slot), addr); in rzg2l_cru_set_slot_addr()
239 rzg2l_cru_write(cru, AMnMBxADDRH(slot), 0); in rzg2l_cru_set_slot_addr()
248 static void rzg2l_cru_fill_hw_slot(struct rzg2l_cru_dev *cru, int slot) in rzg2l_cru_fill_hw_slot() argument
255 if (WARN_ON(cru->queue_buf[slot])) in rzg2l_cru_fill_hw_slot()
258 dev_dbg(cru->dev, "Filling HW slot: %d\n", slot); in rzg2l_cru_fill_hw_slot()
260 if (list_empty(&cru->buf_list)) { in rzg2l_cru_fill_hw_slot()
261 cru->queue_buf[slot] = NULL; in rzg2l_cru_fill_hw_slot()
262 phys_addr = cru->scratch_phys; in rzg2l_cru_fill_hw_slot()
265 buf = list_entry(cru->buf_list.next, in rzg2l_cru_fill_hw_slot()
269 cru->queue_buf[slot] = vbuf; in rzg2l_cru_fill_hw_slot()
275 rzg2l_cru_set_slot_addr(cru, slot, phys_addr); in rzg2l_cru_fill_hw_slot()
278 static void rzg2l_cru_initialize_axi(struct rzg2l_cru_dev *cru) in rzg2l_cru_initialize_axi() argument
286 rzg2l_cru_write(cru, AMnMBVALID, AMnMBVALID_MBVALID(cru->num_buf - 1)); in rzg2l_cru_initialize_axi()
288 for (slot = 0; slot < cru->num_buf; slot++) in rzg2l_cru_initialize_axi()
289 rzg2l_cru_fill_hw_slot(cru, slot); in rzg2l_cru_initialize_axi()
292 static void rzg2l_cru_csi2_setup(struct rzg2l_cru_dev *cru, bool *input_is_yuv, in rzg2l_cru_csi2_setup() argument
308 icnmc |= (rzg2l_cru_read(cru, ICnMC) & ~ICnMC_INF_MASK); in rzg2l_cru_csi2_setup()
311 icnmc |= ICnMC_VCSEL(cru->csi.channel); in rzg2l_cru_csi2_setup()
313 rzg2l_cru_write(cru, ICnMC, icnmc); in rzg2l_cru_csi2_setup()
316 static int rzg2l_cru_initialize_image_conv(struct rzg2l_cru_dev *cru, in rzg2l_cru_initialize_image_conv() argument
323 rzg2l_cru_csi2_setup(cru, &input_is_yuv, ip_sd_fmt); in rzg2l_cru_initialize_image_conv()
326 switch (cru->format.pixelformat) { in rzg2l_cru_initialize_image_conv()
332 dev_err(cru->dev, "Invalid pixelformat (0x%x)\n", in rzg2l_cru_initialize_image_conv()
333 cru->format.pixelformat); in rzg2l_cru_initialize_image_conv()
339 rzg2l_cru_write(cru, ICnMC, in rzg2l_cru_initialize_image_conv()
340 rzg2l_cru_read(cru, ICnMC) | ICnMC_CSCTHR); in rzg2l_cru_initialize_image_conv()
342 rzg2l_cru_write(cru, ICnMC, in rzg2l_cru_initialize_image_conv()
343 rzg2l_cru_read(cru, ICnMC) & (~ICnMC_CSCTHR)); in rzg2l_cru_initialize_image_conv()
346 rzg2l_cru_write(cru, ICnDMR, icndmr); in rzg2l_cru_initialize_image_conv()
351 void rzg2l_cru_stop_image_processing(struct rzg2l_cru_dev *cru) in rzg2l_cru_stop_image_processing() argument
358 spin_lock_irqsave(&cru->qlock, flags); in rzg2l_cru_stop_image_processing()
361 rzg2l_cru_write(cru, CRUnIE, 0); in rzg2l_cru_stop_image_processing()
362 rzg2l_cru_write(cru, CRUnINTS, 0x001F0F0F); in rzg2l_cru_stop_image_processing()
365 rzg2l_cru_write(cru, ICnEN, 0); in rzg2l_cru_stop_image_processing()
368 while ((rzg2l_cru_read(cru, ICnMS) & ICnMS_IA) && retries++ < RZG2L_RETRIES) { in rzg2l_cru_stop_image_processing()
369 spin_unlock_irqrestore(&cru->qlock, flags); in rzg2l_cru_stop_image_processing()
371 spin_lock_irqsave(&cru->qlock, flags); in rzg2l_cru_stop_image_processing()
374 icnms = rzg2l_cru_read(cru, ICnMS) & ICnMS_IA; in rzg2l_cru_stop_image_processing()
376 dev_err(cru->dev, "Failed stop HW, something is seriously broken\n"); in rzg2l_cru_stop_image_processing()
378 cru->state = RZG2L_CRU_DMA_STOPPED; in rzg2l_cru_stop_image_processing()
382 amnfifopntr = rzg2l_cru_read(cru, AMnFIFOPNTR); in rzg2l_cru_stop_image_processing()
395 dev_err(cru->dev, "Failed to empty FIFO\n"); in rzg2l_cru_stop_image_processing()
398 rzg2l_cru_write(cru, AMnAXISTP, AMnAXISTP_AXI_STOP); in rzg2l_cru_stop_image_processing()
402 if (rzg2l_cru_read(cru, AMnAXISTPACK) & in rzg2l_cru_stop_image_processing()
411 dev_err(cru->dev, "Failed to stop AXI bus\n"); in rzg2l_cru_stop_image_processing()
414 rzg2l_cru_write(cru, AMnAXISTP, 0); in rzg2l_cru_stop_image_processing()
416 /* Reset the CRU (AXI-master) */ in rzg2l_cru_stop_image_processing()
417 reset_control_assert(cru->aresetn); in rzg2l_cru_stop_image_processing()
420 rzg2l_cru_write(cru, CRUnRST, 0); in rzg2l_cru_stop_image_processing()
422 spin_unlock_irqrestore(&cru->qlock, flags); in rzg2l_cru_stop_image_processing()
425 int rzg2l_cru_start_image_processing(struct rzg2l_cru_dev *cru) in rzg2l_cru_start_image_processing() argument
427 struct v4l2_mbus_framefmt *fmt = rzg2l_cru_ip_get_src_fmt(cru); in rzg2l_cru_start_image_processing()
431 spin_lock_irqsave(&cru->qlock, flags); in rzg2l_cru_start_image_processing()
434 ret = rzg2l_cru_initialize_image_conv(cru, fmt); in rzg2l_cru_start_image_processing()
436 spin_unlock_irqrestore(&cru->qlock, flags); in rzg2l_cru_start_image_processing()
441 rzg2l_cru_write(cru, CRUnCTRL, CRUnCTRL_VINSEL(0)); in rzg2l_cru_start_image_processing()
444 rzg2l_cru_write(cru, CRUnRST, CRUnRST_VRESETN); in rzg2l_cru_start_image_processing()
447 rzg2l_cru_write(cru, CRUnIE, 0); in rzg2l_cru_start_image_processing()
448 rzg2l_cru_write(cru, CRUnINTS, 0x001f000f); in rzg2l_cru_start_image_processing()
451 rzg2l_cru_initialize_axi(cru); in rzg2l_cru_start_image_processing()
454 rzg2l_cru_write(cru, CRUnIE, CRUnIE_EFE); in rzg2l_cru_start_image_processing()
457 rzg2l_cru_write(cru, ICnEN, ICnEN_ICEN); in rzg2l_cru_start_image_processing()
459 spin_unlock_irqrestore(&cru->qlock, flags); in rzg2l_cru_start_image_processing()
464 void rzg2l_cru_vclk_unprepare(struct rzg2l_cru_dev *cru) in rzg2l_cru_vclk_unprepare() argument
466 clk_disable_unprepare(cru->vclk); in rzg2l_cru_vclk_unprepare()
469 int rzg2l_cru_vclk_prepare(struct rzg2l_cru_dev *cru) in rzg2l_cru_vclk_prepare() argument
471 return clk_prepare_enable(cru->vclk); in rzg2l_cru_vclk_prepare()
474 static int rzg2l_cru_set_stream(struct rzg2l_cru_dev *cru, int on) in rzg2l_cru_set_stream() argument
481 pad = media_pad_remote_pad_first(&cru->pad); in rzg2l_cru_set_stream()
500 video_device_pipeline_stop(&cru->vdev); in rzg2l_cru_set_stream()
502 pm_runtime_put_sync(cru->dev); in rzg2l_cru_set_stream()
503 clk_disable_unprepare(cru->vclk); in rzg2l_cru_set_stream()
508 ret = pm_runtime_resume_and_get(cru->dev); in rzg2l_cru_set_stream()
512 ret = clk_prepare_enable(cru->vclk); in rzg2l_cru_set_stream()
516 ret = rzg2l_cru_mc_validate_format(cru, sd, pad); in rzg2l_cru_set_stream()
520 pipe = media_entity_pipeline(&sd->entity) ? : &cru->vdev.pipe; in rzg2l_cru_set_stream()
521 ret = video_device_pipeline_start(&cru->vdev, pipe); in rzg2l_cru_set_stream()
543 video_device_pipeline_stop(&cru->vdev); in rzg2l_cru_set_stream()
546 clk_disable_unprepare(cru->vclk); in rzg2l_cru_set_stream()
549 pm_runtime_put_sync(cru->dev); in rzg2l_cru_set_stream()
554 static void rzg2l_cru_stop_streaming(struct rzg2l_cru_dev *cru) in rzg2l_cru_stop_streaming() argument
556 cru->state = RZG2L_CRU_DMA_STOPPING; in rzg2l_cru_stop_streaming()
558 rzg2l_cru_set_stream(cru, 0); in rzg2l_cru_stop_streaming()
563 struct rzg2l_cru_dev *cru = data; in rzg2l_cru_irq() local
570 spin_lock_irqsave(&cru->qlock, flags); in rzg2l_cru_irq()
572 irq_status = rzg2l_cru_read(cru, CRUnINTS); in rzg2l_cru_irq()
578 rzg2l_cru_write(cru, CRUnINTS, rzg2l_cru_read(cru, CRUnINTS)); in rzg2l_cru_irq()
581 if (cru->state == RZG2L_CRU_DMA_STOPPED) { in rzg2l_cru_irq()
582 dev_dbg(cru->dev, "IRQ while state stopped\n"); in rzg2l_cru_irq()
587 if (cru->state == RZG2L_CRU_DMA_STOPPING) { in rzg2l_cru_irq()
589 dev_dbg(cru->dev, "IRQ while state stopping\n"); in rzg2l_cru_irq()
594 amnmbs = rzg2l_cru_read(cru, AMnMBS); in rzg2l_cru_irq()
602 slot = cru->num_buf - 1; in rzg2l_cru_irq()
610 if (cru->state == RZG2L_CRU_DMA_STARTING) { in rzg2l_cru_irq()
612 dev_dbg(cru->dev, "Starting sync slot: %d\n", slot); in rzg2l_cru_irq()
616 dev_dbg(cru->dev, "Capture start synced!\n"); in rzg2l_cru_irq()
617 cru->state = RZG2L_CRU_DMA_RUNNING; in rzg2l_cru_irq()
621 if (cru->queue_buf[slot]) { in rzg2l_cru_irq()
622 cru->queue_buf[slot]->field = cru->format.field; in rzg2l_cru_irq()
623 cru->queue_buf[slot]->sequence = cru->sequence; in rzg2l_cru_irq()
624 cru->queue_buf[slot]->vb2_buf.timestamp = ktime_get_ns(); in rzg2l_cru_irq()
625 vb2_buffer_done(&cru->queue_buf[slot]->vb2_buf, in rzg2l_cru_irq()
627 cru->queue_buf[slot] = NULL; in rzg2l_cru_irq()
630 dev_dbg(cru->dev, "Dropping frame %u\n", cru->sequence); in rzg2l_cru_irq()
633 cru->sequence++; in rzg2l_cru_irq()
636 rzg2l_cru_fill_hw_slot(cru, slot); in rzg2l_cru_irq()
639 spin_unlock_irqrestore(&cru->qlock, flags); in rzg2l_cru_irq()
646 struct rzg2l_cru_dev *cru = vb2_get_drv_priv(vq); in rzg2l_cru_start_streaming_vq() local
650 ret = reset_control_deassert(cru->aresetn); in rzg2l_cru_start_streaming_vq()
652 dev_err(cru->dev, "failed to deassert aresetn\n"); in rzg2l_cru_start_streaming_vq()
656 ret = reset_control_deassert(cru->presetn); in rzg2l_cru_start_streaming_vq()
658 reset_control_assert(cru->aresetn); in rzg2l_cru_start_streaming_vq()
659 dev_err(cru->dev, "failed to deassert presetn\n"); in rzg2l_cru_start_streaming_vq()
663 ret = request_irq(cru->image_conv_irq, rzg2l_cru_irq, in rzg2l_cru_start_streaming_vq()
664 IRQF_SHARED, KBUILD_MODNAME, cru); in rzg2l_cru_start_streaming_vq()
666 dev_err(cru->dev, "failed to request irq\n"); in rzg2l_cru_start_streaming_vq()
671 cru->scratch = dma_alloc_coherent(cru->dev, cru->format.sizeimage, in rzg2l_cru_start_streaming_vq()
672 &cru->scratch_phys, GFP_KERNEL); in rzg2l_cru_start_streaming_vq()
673 if (!cru->scratch) { in rzg2l_cru_start_streaming_vq()
674 return_unused_buffers(cru, VB2_BUF_STATE_QUEUED); in rzg2l_cru_start_streaming_vq()
675 dev_err(cru->dev, "Failed to allocate scratch buffer\n"); in rzg2l_cru_start_streaming_vq()
680 cru->sequence = 0; in rzg2l_cru_start_streaming_vq()
682 ret = rzg2l_cru_set_stream(cru, 1); in rzg2l_cru_start_streaming_vq()
684 return_unused_buffers(cru, VB2_BUF_STATE_QUEUED); in rzg2l_cru_start_streaming_vq()
688 cru->state = RZG2L_CRU_DMA_STARTING; in rzg2l_cru_start_streaming_vq()
689 dev_dbg(cru->dev, "Starting to capture\n"); in rzg2l_cru_start_streaming_vq()
694 dma_free_coherent(cru->dev, cru->format.sizeimage, cru->scratch, in rzg2l_cru_start_streaming_vq()
695 cru->scratch_phys); in rzg2l_cru_start_streaming_vq()
697 free_irq(cru->image_conv_irq, cru); in rzg2l_cru_start_streaming_vq()
700 reset_control_assert(cru->presetn); in rzg2l_cru_start_streaming_vq()
701 reset_control_assert(cru->aresetn); in rzg2l_cru_start_streaming_vq()
708 struct rzg2l_cru_dev *cru = vb2_get_drv_priv(vq); in rzg2l_cru_stop_streaming_vq() local
710 rzg2l_cru_stop_streaming(cru); in rzg2l_cru_stop_streaming_vq()
713 dma_free_coherent(cru->dev, cru->format.sizeimage, in rzg2l_cru_stop_streaming_vq()
714 cru->scratch, cru->scratch_phys); in rzg2l_cru_stop_streaming_vq()
716 free_irq(cru->image_conv_irq, cru); in rzg2l_cru_stop_streaming_vq()
717 reset_control_assert(cru->presetn); in rzg2l_cru_stop_streaming_vq()
719 return_unused_buffers(cru, VB2_BUF_STATE_ERROR); in rzg2l_cru_stop_streaming_vq()
732 void rzg2l_cru_dma_unregister(struct rzg2l_cru_dev *cru) in rzg2l_cru_dma_unregister() argument
734 mutex_destroy(&cru->lock); in rzg2l_cru_dma_unregister()
736 v4l2_device_unregister(&cru->v4l2_dev); in rzg2l_cru_dma_unregister()
737 vb2_queue_release(&cru->queue); in rzg2l_cru_dma_unregister()
740 int rzg2l_cru_dma_register(struct rzg2l_cru_dev *cru) in rzg2l_cru_dma_register() argument
742 struct vb2_queue *q = &cru->queue; in rzg2l_cru_dma_register()
747 ret = v4l2_device_register(cru->dev, &cru->v4l2_dev); in rzg2l_cru_dma_register()
751 mutex_init(&cru->lock); in rzg2l_cru_dma_register()
752 INIT_LIST_HEAD(&cru->buf_list); in rzg2l_cru_dma_register()
754 spin_lock_init(&cru->qlock); in rzg2l_cru_dma_register()
756 cru->state = RZG2L_CRU_DMA_STOPPED; in rzg2l_cru_dma_register()
759 cru->queue_buf[i] = NULL; in rzg2l_cru_dma_register()
764 q->lock = &cru->lock; in rzg2l_cru_dma_register()
765 q->drv_priv = cru; in rzg2l_cru_dma_register()
771 q->dev = cru->dev; in rzg2l_cru_dma_register()
775 dev_err(cru->dev, "failed to initialize VB2 queue\n"); in rzg2l_cru_dma_register()
782 mutex_destroy(&cru->lock); in rzg2l_cru_dma_register()
783 v4l2_device_unregister(&cru->v4l2_dev); in rzg2l_cru_dma_register()
826 static void rzg2l_cru_format_align(struct rzg2l_cru_dev *cru, in rzg2l_cru_format_align() argument
845 /* Limit to CRU capabilities */ in rzg2l_cru_format_align()
852 dev_dbg(cru->dev, "Format %ux%u bpl: %u size: %u\n", in rzg2l_cru_format_align()
856 static void rzg2l_cru_try_format(struct rzg2l_cru_dev *cru, in rzg2l_cru_try_format() argument
871 rzg2l_cru_format_align(cru, pix); in rzg2l_cru_try_format()
886 struct rzg2l_cru_dev *cru = video_drvdata(file); in rzg2l_cru_try_fmt_vid_cap() local
888 rzg2l_cru_try_format(cru, &f->fmt.pix); in rzg2l_cru_try_fmt_vid_cap()
896 struct rzg2l_cru_dev *cru = video_drvdata(file); in rzg2l_cru_s_fmt_vid_cap() local
898 if (vb2_is_busy(&cru->queue)) in rzg2l_cru_s_fmt_vid_cap()
901 rzg2l_cru_try_format(cru, &f->fmt.pix); in rzg2l_cru_s_fmt_vid_cap()
903 cru->format = f->fmt.pix; in rzg2l_cru_s_fmt_vid_cap()
911 struct rzg2l_cru_dev *cru = video_drvdata(file); in rzg2l_cru_g_fmt_vid_cap() local
913 f->fmt.pix = cru->format; in rzg2l_cru_g_fmt_vid_cap()
953 struct rzg2l_cru_dev *cru = video_drvdata(file); in rzg2l_cru_open() local
956 ret = mutex_lock_interruptible(&cru->lock); in rzg2l_cru_open()
960 file->private_data = cru; in rzg2l_cru_open()
965 mutex_unlock(&cru->lock); in rzg2l_cru_open()
970 mutex_unlock(&cru->lock); in rzg2l_cru_open()
977 struct rzg2l_cru_dev *cru = video_drvdata(file); in rzg2l_cru_release() local
980 mutex_lock(&cru->lock); in rzg2l_cru_release()
985 mutex_unlock(&cru->lock); in rzg2l_cru_release()
1000 static void rzg2l_cru_v4l2_init(struct rzg2l_cru_dev *cru) in rzg2l_cru_v4l2_init() argument
1002 struct video_device *vdev = &cru->vdev; in rzg2l_cru_v4l2_init()
1004 vdev->v4l2_dev = &cru->v4l2_dev; in rzg2l_cru_v4l2_init()
1005 vdev->queue = &cru->queue; in rzg2l_cru_v4l2_init()
1006 snprintf(vdev->name, sizeof(vdev->name), "CRU output"); in rzg2l_cru_v4l2_init()
1008 vdev->lock = &cru->lock; in rzg2l_cru_v4l2_init()
1015 cru->format.pixelformat = RZG2L_CRU_DEFAULT_FORMAT; in rzg2l_cru_v4l2_init()
1016 cru->format.width = RZG2L_CRU_DEFAULT_WIDTH; in rzg2l_cru_v4l2_init()
1017 cru->format.height = RZG2L_CRU_DEFAULT_HEIGHT; in rzg2l_cru_v4l2_init()
1018 cru->format.field = RZG2L_CRU_DEFAULT_FIELD; in rzg2l_cru_v4l2_init()
1019 cru->format.colorspace = RZG2L_CRU_DEFAULT_COLORSPACE; in rzg2l_cru_v4l2_init()
1020 rzg2l_cru_format_align(cru, &cru->format); in rzg2l_cru_v4l2_init()
1023 void rzg2l_cru_video_unregister(struct rzg2l_cru_dev *cru) in rzg2l_cru_video_unregister() argument
1025 media_device_unregister(&cru->mdev); in rzg2l_cru_video_unregister()
1026 video_unregister_device(&cru->vdev); in rzg2l_cru_video_unregister()
1029 int rzg2l_cru_video_register(struct rzg2l_cru_dev *cru) in rzg2l_cru_video_register() argument
1031 struct video_device *vdev = &cru->vdev; in rzg2l_cru_video_register()
1034 if (video_is_registered(&cru->vdev)) { in rzg2l_cru_video_register()
1037 entity = &cru->vdev.entity; in rzg2l_cru_video_register()
1039 entity->graph_obj.mdev = &cru->mdev; in rzg2l_cru_video_register()
1043 rzg2l_cru_v4l2_init(cru); in rzg2l_cru_video_register()
1044 video_set_drvdata(vdev, cru); in rzg2l_cru_video_register()
1047 dev_err(cru->dev, "Failed to register video device\n"); in rzg2l_cru_video_register()
1051 ret = media_device_register(&cru->mdev); in rzg2l_cru_video_register()
1053 video_unregister_device(&cru->vdev); in rzg2l_cru_video_register()