Lines Matching refs:cap

120 static void c3_isp_cap_wrmifx3_buff(struct c3_isp_capture *cap)  in c3_isp_cap_wrmifx3_buff()  argument
125 if (cap->buff) { in c3_isp_cap_wrmifx3_buff()
126 y_dma_addr = cap->buff->dma_addr[C3_ISP_PLANE_Y]; in c3_isp_cap_wrmifx3_buff()
127 uv_dma_addr = cap->buff->dma_addr[C3_ISP_PLANE_UV]; in c3_isp_cap_wrmifx3_buff()
129 y_dma_addr = cap->dummy_buff.dma_addr; in c3_isp_cap_wrmifx3_buff()
130 uv_dma_addr = cap->dummy_buff.dma_addr; in c3_isp_cap_wrmifx3_buff()
133 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_buff()
134 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_CH0_BADDR, cap->id), in c3_isp_cap_wrmifx3_buff()
137 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_buff()
138 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_CH1_BADDR, cap->id), in c3_isp_cap_wrmifx3_buff()
142 static void c3_isp_cap_wrmifx3_format(struct c3_isp_capture *cap) in c3_isp_cap_wrmifx3_format() argument
144 struct v4l2_pix_format_mplane *pix_mp = &cap->format.pix_mp; in c3_isp_cap_wrmifx3_format()
145 const struct c3_isp_cap_format_info *info = cap->format.info; in c3_isp_cap_wrmifx3_format()
150 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_format()
151 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_FMT_SIZE, cap->id), in c3_isp_cap_wrmifx3_format()
155 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
156 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_FMT_CTRL, cap->id), in c3_isp_cap_wrmifx3_format()
159 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
160 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_FMT_CTRL, cap->id), in c3_isp_cap_wrmifx3_format()
164 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
165 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_FMT_CTRL, cap->id), in c3_isp_cap_wrmifx3_format()
168 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
169 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_FMT_CTRL, cap->id), in c3_isp_cap_wrmifx3_format()
175 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
176 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_CH0_CTRL0, cap->id), in c3_isp_cap_wrmifx3_format()
180 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
181 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_CH0_CTRL1, cap->id), in c3_isp_cap_wrmifx3_format()
185 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_format()
186 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_WIN_LUMA_H, cap->id), in c3_isp_cap_wrmifx3_format()
189 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_format()
190 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_WIN_LUMA_V, cap->id), in c3_isp_cap_wrmifx3_format()
195 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
196 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_CH1_CTRL0, cap->id), in c3_isp_cap_wrmifx3_format()
200 c3_isp_update_bits(cap->isp, in c3_isp_cap_wrmifx3_format()
201 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_CH1_CTRL1, cap->id), in c3_isp_cap_wrmifx3_format()
206 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_format()
207 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_WIN_CHROM_H, cap->id), in c3_isp_cap_wrmifx3_format()
211 c3_isp_write(cap->isp, in c3_isp_cap_wrmifx3_format()
212 C3_ISP_WRMIFX3_REG(ISP_WRMIFX3_0_WIN_CHROM_V, cap->id), in c3_isp_cap_wrmifx3_format()
216 static int c3_isp_cap_dummy_buff_create(struct c3_isp_capture *cap) in c3_isp_cap_dummy_buff_create() argument
218 struct c3_isp_dummy_buffer *dummy_buff = &cap->dummy_buff; in c3_isp_cap_dummy_buff_create()
219 struct v4l2_pix_format_mplane *pix_mp = &cap->format.pix_mp; in c3_isp_cap_dummy_buff_create()
229 dummy_buff->vaddr = dma_alloc_attrs(cap->isp->dev, dummy_buff->size, in c3_isp_cap_dummy_buff_create()
238 static void c3_isp_cap_dummy_buff_destroy(struct c3_isp_capture *cap) in c3_isp_cap_dummy_buff_destroy() argument
240 dma_free_attrs(cap->isp->dev, cap->dummy_buff.size, in c3_isp_cap_dummy_buff_destroy()
241 cap->dummy_buff.vaddr, cap->dummy_buff.dma_addr, in c3_isp_cap_dummy_buff_destroy()
245 static void c3_isp_cap_cfg_buff(struct c3_isp_capture *cap) in c3_isp_cap_cfg_buff() argument
247 cap->buff = list_first_entry_or_null(&cap->pending, in c3_isp_cap_cfg_buff()
250 c3_isp_cap_wrmifx3_buff(cap); in c3_isp_cap_cfg_buff()
252 if (cap->buff) in c3_isp_cap_cfg_buff()
253 list_del(&cap->buff->list); in c3_isp_cap_cfg_buff()
256 static void c3_isp_cap_start(struct c3_isp_capture *cap) in c3_isp_cap_start() argument
261 scoped_guard(spinlock_irqsave, &cap->buff_lock) in c3_isp_cap_start()
262 c3_isp_cap_cfg_buff(cap); in c3_isp_cap_start()
264 c3_isp_cap_wrmifx3_format(cap); in c3_isp_cap_start()
266 if (cap->id == C3_ISP_CAP_DEV_0) { in c3_isp_cap_start()
269 } else if (cap->id == C3_ISP_CAP_DEV_1) { in c3_isp_cap_start()
277 c3_isp_update_bits(cap->isp, ISP_TOP_PATH_EN, mask, val); in c3_isp_cap_start()
280 static void c3_isp_cap_stop(struct c3_isp_capture *cap) in c3_isp_cap_stop() argument
285 if (cap->id == C3_ISP_CAP_DEV_0) { in c3_isp_cap_stop()
288 } else if (cap->id == C3_ISP_CAP_DEV_1) { in c3_isp_cap_stop()
296 c3_isp_update_bits(cap->isp, ISP_TOP_PATH_EN, mask, val); in c3_isp_cap_stop()
299 static void c3_isp_cap_done(struct c3_isp_capture *cap) in c3_isp_cap_done() argument
301 struct c3_isp_cap_buffer *buff = cap->buff; in c3_isp_cap_done()
303 guard(spinlock_irqsave)(&cap->buff_lock); in c3_isp_cap_done()
306 buff->vb.sequence = cap->isp->frm_sequence; in c3_isp_cap_done()
312 c3_isp_cap_cfg_buff(cap); in c3_isp_cap_done()
366 static void c3_isp_cap_return_buffers(struct c3_isp_capture *cap, in c3_isp_cap_return_buffers() argument
371 guard(spinlock_irqsave)(&cap->buff_lock); in c3_isp_cap_return_buffers()
373 if (cap->buff) { in c3_isp_cap_return_buffers()
374 vb2_buffer_done(&cap->buff->vb.vb2_buf, state); in c3_isp_cap_return_buffers()
375 cap->buff = NULL; in c3_isp_cap_return_buffers()
378 while (!list_empty(&cap->pending)) { in c3_isp_cap_return_buffers()
379 buff = list_first_entry(&cap->pending, in c3_isp_cap_return_buffers()
387 struct v4l2_capability *cap) in c3_isp_cap_querycap() argument
389 strscpy(cap->driver, C3_ISP_DRIVER_NAME, sizeof(cap->driver)); in c3_isp_cap_querycap()
390 strscpy(cap->card, "AML C3 ISP", sizeof(cap->card)); in c3_isp_cap_querycap()
428 struct c3_isp_capture *cap = video_drvdata(file); in c3_isp_cap_g_fmt_mplane() local
430 f->fmt.pix_mp = cap->format.pix_mp; in c3_isp_cap_g_fmt_mplane()
438 struct c3_isp_capture *cap = video_drvdata(file); in c3_isp_cap_s_fmt_mplane() local
442 cap->format.pix_mp = f->fmt.pix_mp; in c3_isp_cap_s_fmt_mplane()
443 cap->format.info = c3_cap_find_fmt(f->fmt.pix_mp.pixelformat); in c3_isp_cap_s_fmt_mplane()
513 struct c3_isp_capture *cap = video_get_drvdata(vdev); in c3_isp_cap_link_validate() local
524 if (src_fmt.format.width != cap->format.pix_mp.width || in c3_isp_cap_link_validate()
525 src_fmt.format.height != cap->format.pix_mp.height || in c3_isp_cap_link_validate()
526 src_fmt.format.code != cap->format.info->mbus_code) { in c3_isp_cap_link_validate()
527 dev_err(cap->isp->dev, in c3_isp_cap_link_validate()
532 src_fmt.format.height, cap->format.info->mbus_code, in c3_isp_cap_link_validate()
533 cap->format.pix_mp.width, cap->format.pix_mp.height); in c3_isp_cap_link_validate()
551 struct c3_isp_capture *cap = vb2_get_drv_priv(q); in c3_isp_vb2_queue_setup() local
552 const struct v4l2_pix_format_mplane *pix_mp = &cap->format.pix_mp; in c3_isp_vb2_queue_setup()
578 struct c3_isp_capture *cap = vb2_get_drv_priv(vb->vb2_queue); in c3_isp_vb2_buf_queue() local
580 guard(spinlock_irqsave)(&cap->buff_lock); in c3_isp_vb2_buf_queue()
582 list_add_tail(&buf->list, &cap->pending); in c3_isp_vb2_buf_queue()
587 struct c3_isp_capture *cap = vb2_get_drv_priv(vb->vb2_queue); in c3_isp_vb2_buf_prepare() local
590 for (unsigned int i = 0; i < cap->format.pix_mp.num_planes; i++) { in c3_isp_vb2_buf_prepare()
591 size = cap->format.pix_mp.plane_fmt[i].sizeimage; in c3_isp_vb2_buf_prepare()
593 dev_err(cap->isp->dev, in c3_isp_vb2_buf_prepare()
607 struct c3_isp_capture *cap = vb2_get_drv_priv(vb->vb2_queue); in c3_isp_vb2_buf_init() local
612 for (unsigned int i = 0; i < cap->format.pix_mp.num_planes; i++) in c3_isp_vb2_buf_init()
621 struct c3_isp_capture *cap = vb2_get_drv_priv(q); in c3_isp_vb2_start_streaming() local
624 ret = video_device_pipeline_start(&cap->vdev, &cap->isp->pipe); in c3_isp_vb2_start_streaming()
626 dev_err(cap->isp->dev, in c3_isp_vb2_start_streaming()
627 "Failed to start cap%u pipeline: %d\n", cap->id, ret); in c3_isp_vb2_start_streaming()
631 ret = c3_isp_cap_dummy_buff_create(cap); in c3_isp_vb2_start_streaming()
635 ret = pm_runtime_resume_and_get(cap->isp->dev); in c3_isp_vb2_start_streaming()
639 c3_isp_cap_start(cap); in c3_isp_vb2_start_streaming()
641 ret = v4l2_subdev_enable_streams(&cap->rsz->sd, C3_ISP_RSZ_PAD_SOURCE, in c3_isp_vb2_start_streaming()
649 pm_runtime_put(cap->isp->dev); in c3_isp_vb2_start_streaming()
651 c3_isp_cap_dummy_buff_destroy(cap); in c3_isp_vb2_start_streaming()
653 video_device_pipeline_stop(&cap->vdev); in c3_isp_vb2_start_streaming()
655 c3_isp_cap_return_buffers(cap, VB2_BUF_STATE_QUEUED); in c3_isp_vb2_start_streaming()
661 struct c3_isp_capture *cap = vb2_get_drv_priv(q); in c3_isp_vb2_stop_streaming() local
663 c3_isp_cap_stop(cap); in c3_isp_vb2_stop_streaming()
665 c3_isp_cap_return_buffers(cap, VB2_BUF_STATE_ERROR); in c3_isp_vb2_stop_streaming()
667 v4l2_subdev_disable_streams(&cap->rsz->sd, C3_ISP_RSZ_PAD_SOURCE, in c3_isp_vb2_stop_streaming()
670 pm_runtime_put(cap->isp->dev); in c3_isp_vb2_stop_streaming()
672 c3_isp_cap_dummy_buff_destroy(cap); in c3_isp_vb2_stop_streaming()
674 video_device_pipeline_stop(&cap->vdev); in c3_isp_vb2_stop_streaming()
686 static int c3_isp_register_capture(struct c3_isp_capture *cap) in c3_isp_register_capture() argument
688 struct video_device *vdev = &cap->vdev; in c3_isp_register_capture()
689 struct vb2_queue *vb2_q = &cap->vb2_q; in c3_isp_register_capture()
692 snprintf(vdev->name, sizeof(vdev->name), "c3-isp-cap%u", cap->id); in c3_isp_register_capture()
695 vdev->v4l2_dev = &cap->isp->v4l2_dev; in c3_isp_register_capture()
697 vdev->lock = &cap->lock; in c3_isp_register_capture()
704 video_set_drvdata(vdev, cap); in c3_isp_register_capture()
706 vb2_q->drv_priv = cap; in c3_isp_register_capture()
713 vb2_q->dev = cap->isp->dev; in c3_isp_register_capture()
714 vb2_q->lock = &cap->lock; in c3_isp_register_capture()
720 cap->pad.flags = MEDIA_PAD_FL_SINK; in c3_isp_register_capture()
721 ret = media_entity_pads_init(&vdev->entity, 1, &cap->pad); in c3_isp_register_capture()
727 dev_err(cap->isp->dev, in c3_isp_register_capture()
739 mutex_destroy(&cap->lock); in c3_isp_register_capture()
747 struct c3_isp_capture *cap; in c3_isp_captures_register() local
750 cap = &isp->caps[i]; in c3_isp_captures_register()
751 memset(cap, 0, sizeof(*cap)); in c3_isp_captures_register()
753 cap->format.pix_mp.width = C3_ISP_DEFAULT_WIDTH; in c3_isp_captures_register()
754 cap->format.pix_mp.height = C3_ISP_DEFAULT_HEIGHT; in c3_isp_captures_register()
755 cap->format.pix_mp.field = V4L2_FIELD_NONE; in c3_isp_captures_register()
756 cap->format.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M; in c3_isp_captures_register()
757 cap->format.pix_mp.colorspace = V4L2_COLORSPACE_SRGB; in c3_isp_captures_register()
758 cap->format.info = in c3_isp_captures_register()
759 c3_cap_find_fmt(cap->format.pix_mp.pixelformat); in c3_isp_captures_register()
761 c3_cap_try_fmt(&cap->format.pix_mp); in c3_isp_captures_register()
763 cap->id = i; in c3_isp_captures_register()
764 cap->rsz = &isp->resizers[i]; in c3_isp_captures_register()
765 cap->isp = isp; in c3_isp_captures_register()
766 INIT_LIST_HEAD(&cap->pending); in c3_isp_captures_register()
767 spin_lock_init(&cap->buff_lock); in c3_isp_captures_register()
768 mutex_init(&cap->lock); in c3_isp_captures_register()
770 ret = c3_isp_register_capture(cap); in c3_isp_captures_register()
772 cap->isp = NULL; in c3_isp_captures_register()
773 mutex_destroy(&cap->lock); in c3_isp_captures_register()
785 struct c3_isp_capture *cap; in c3_isp_captures_unregister() local
788 cap = &isp->caps[i]; in c3_isp_captures_unregister()
790 if (!cap->isp) in c3_isp_captures_unregister()
792 vb2_queue_release(&cap->vb2_q); in c3_isp_captures_unregister()
793 media_entity_cleanup(&cap->vdev.entity); in c3_isp_captures_unregister()
794 video_unregister_device(&cap->vdev); in c3_isp_captures_unregister()
795 mutex_destroy(&cap->lock); in c3_isp_captures_unregister()