Lines Matching +full:mi +full:- +full:v

1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
3 * Rockchip ISP1 Driver - V4l capture device
13 #include <media/v4l2-common.h>
14 #include <media/v4l2-event.h>
15 #include <media/v4l2-fh.h>
16 #include <media/v4l2-ioctl.h>
17 #include <media/v4l2-mc.h>
18 #include <media/v4l2-subdev.h>
19 #include <media/videobuf2-dma-contig.h>
21 #include "rkisp1-common.h"
87 } mi; member
383 .mi = {
399 .mi = {
421 const struct rkisp1_capture_fmt_cfg *fmts = cap->config->fmts; in rkisp1_cap_enum_mbus_codes()
429 for (i = 0; i < cap->config->fmt_size; i++) { in rkisp1_cap_enum_mbus_codes()
434 if (n++ == code->index) { in rkisp1_cap_enum_mbus_codes()
435 code->code = curr_mbus; in rkisp1_cap_enum_mbus_codes()
439 return -EINVAL; in rkisp1_cap_enum_mbus_codes()
442 /* ----------------------------------------------------------------------------
443 * Stream operations for self-picture path (sp) and main-picture path (mp)
448 u32 mi_ctrl = rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL); in rkisp1_mi_config_ctrl()
459 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_CTRL, mi_ctrl); in rkisp1_mi_config_ctrl()
470 if (!component && pixm->num_planes == 1) in rkisp1_pixfmt_comp_size()
471 return pixm->plane_fmt[0].bytesperline * pixm->height; in rkisp1_pixfmt_comp_size()
472 return pixm->plane_fmt[component].sizeimage; in rkisp1_pixfmt_comp_size()
477 u32 mi_imsc = rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_IMSC); in rkisp1_irq_frame_end_enable()
480 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_IMSC, mi_imsc); in rkisp1_irq_frame_end_enable()
485 const struct v4l2_pix_format_mplane *pixm = &cap->pix.fmt; in rkisp1_mp_config()
486 struct rkisp1_device *rkisp1 = cap->rkisp1; in rkisp1_mp_config()
489 rkisp1_write(rkisp1, cap->config->mi.y_size_init, in rkisp1_mp_config()
491 rkisp1_write(rkisp1, cap->config->mi.cb_size_init, in rkisp1_mp_config()
493 rkisp1_write(rkisp1, cap->config->mi.cr_size_init, in rkisp1_mp_config()
497 rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_LLENGTH, cap->stride); in rkisp1_mp_config()
498 rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_PIC_WIDTH, pixm->width); in rkisp1_mp_config()
499 rkisp1_write(rkisp1, RKISP1_CIF_MI_MP_Y_PIC_HEIGHT, pixm->height); in rkisp1_mp_config()
501 cap->stride * pixm->height); in rkisp1_mp_config()
507 if (cap->pix.info->comp_planes == 2) { in rkisp1_mp_config()
509 if (cap->pix.cfg->uv_swap) in rkisp1_mp_config()
517 * U/V swapping with the MI_XTD_FORMAT_CTRL register only works for in rkisp1_mp_config()
523 if (cap->pix.cfg->yc_swap || cap->pix.cfg->byte_swap) in rkisp1_mp_config()
532 cap->pix.cfg->output_format); in rkisp1_mp_config()
539 reg |= cap->pix.cfg->write_format; in rkisp1_mp_config()
549 const struct v4l2_pix_format_mplane *pixm = &cap->pix.fmt; in rkisp1_sp_config()
550 struct rkisp1_device *rkisp1 = cap->rkisp1; in rkisp1_sp_config()
553 rkisp1_write(rkisp1, cap->config->mi.y_size_init, in rkisp1_sp_config()
555 rkisp1_write(rkisp1, cap->config->mi.cb_size_init, in rkisp1_sp_config()
557 rkisp1_write(rkisp1, cap->config->mi.cr_size_init, in rkisp1_sp_config()
560 rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_LLENGTH, cap->stride); in rkisp1_sp_config()
561 rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_PIC_WIDTH, pixm->width); in rkisp1_sp_config()
562 rkisp1_write(rkisp1, RKISP1_CIF_MI_SP_Y_PIC_HEIGHT, pixm->height); in rkisp1_sp_config()
564 cap->stride * pixm->height); in rkisp1_sp_config()
569 if (cap->pix.info->comp_planes == 2) { in rkisp1_sp_config()
571 if (cap->pix.cfg->uv_swap) in rkisp1_sp_config()
579 * U/V swapping with the MI_XTD_FORMAT_CTRL register only works for in rkisp1_sp_config()
585 if (cap->pix.cfg->yc_swap) in rkisp1_sp_config()
596 mi_ctrl |= cap->pix.cfg->write_format | in rkisp1_sp_config()
598 cap->pix.cfg->output_format | in rkisp1_sp_config()
605 u32 mi_ctrl = rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL); in rkisp1_mp_disable()
609 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_CTRL, mi_ctrl); in rkisp1_mp_disable()
614 u32 mi_ctrl = rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL); in rkisp1_sp_disable()
617 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_CTRL, mi_ctrl); in rkisp1_sp_disable()
626 mi_ctrl = rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL); in rkisp1_mp_enable()
627 if (v4l2_is_format_bayer(cap->pix.info)) in rkisp1_mp_enable()
633 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_CTRL, mi_ctrl); in rkisp1_mp_enable()
638 u32 mi_ctrl = rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL); in rkisp1_sp_enable()
641 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_CTRL, mi_ctrl); in rkisp1_sp_enable()
646 if (!cap->is_streaming) in rkisp1_mp_sp_stop()
648 rkisp1_write(cap->rkisp1, RKISP1_CIF_MI_ICR, RKISP1_CIF_MI_FRAME(cap)); in rkisp1_mp_sp_stop()
649 cap->ops->disable(cap); in rkisp1_mp_sp_stop()
657 return !(rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL_SHD) & en); in rkisp1_mp_is_stopped()
662 return !(rkisp1_read(cap->rkisp1, RKISP1_CIF_MI_CTRL_SHD) & in rkisp1_sp_is_stopped()
668 u32 dpcl = rkisp1_read(cap->rkisp1, RKISP1_CIF_VI_DPCL); in rkisp1_mp_set_data_path()
672 rkisp1_write(cap->rkisp1, RKISP1_CIF_VI_DPCL, dpcl); in rkisp1_mp_set_data_path()
677 u32 dpcl = rkisp1_read(cap->rkisp1, RKISP1_CIF_VI_DPCL); in rkisp1_sp_set_data_path()
680 rkisp1_write(cap->rkisp1, RKISP1_CIF_VI_DPCL, dpcl); in rkisp1_sp_set_data_path()
701 /* ----------------------------------------------------------------------------
707 const struct v4l2_pix_format_mplane *pixm = &cap->pix.fmt; in rkisp1_dummy_buf_create()
708 struct rkisp1_dummy_buffer *dummy_buf = &cap->buf.dummy; in rkisp1_dummy_buf_create()
710 dummy_buf->size = max3(rkisp1_pixfmt_comp_size(pixm, RKISP1_PLANE_Y), in rkisp1_dummy_buf_create()
715 dummy_buf->vaddr = dma_alloc_attrs(cap->rkisp1->dev, in rkisp1_dummy_buf_create()
716 dummy_buf->size, in rkisp1_dummy_buf_create()
717 &dummy_buf->dma_addr, in rkisp1_dummy_buf_create()
720 if (!dummy_buf->vaddr) in rkisp1_dummy_buf_create()
721 return -ENOMEM; in rkisp1_dummy_buf_create()
728 dma_free_attrs(cap->rkisp1->dev, in rkisp1_dummy_buf_destroy()
729 cap->buf.dummy.size, cap->buf.dummy.vaddr, in rkisp1_dummy_buf_destroy()
730 cap->buf.dummy.dma_addr, DMA_ATTR_NO_KERNEL_MAPPING); in rkisp1_dummy_buf_destroy()
735 u8 shift = rkisp1_has_feature(cap->rkisp1, DMA_34BIT) ? 2 : 0; in rkisp1_set_next_buf()
737 cap->buf.curr = cap->buf.next; in rkisp1_set_next_buf()
738 cap->buf.next = NULL; in rkisp1_set_next_buf()
740 if (!list_empty(&cap->buf.queue)) { in rkisp1_set_next_buf()
743 cap->buf.next = list_first_entry(&cap->buf.queue, struct rkisp1_buffer, queue); in rkisp1_set_next_buf()
744 list_del(&cap->buf.next->queue); in rkisp1_set_next_buf()
746 buff_addr = cap->buf.next->buff_addr; in rkisp1_set_next_buf()
748 rkisp1_write(cap->rkisp1, cap->config->mi.y_base_ad_init, in rkisp1_set_next_buf()
753 * set the U and V planes to the dummy buffer in rkisp1_set_next_buf()
755 if (cap->pix.cfg->fourcc == V4L2_PIX_FMT_GREY) { in rkisp1_set_next_buf()
756 rkisp1_write(cap->rkisp1, in rkisp1_set_next_buf()
757 cap->config->mi.cb_base_ad_init, in rkisp1_set_next_buf()
758 cap->buf.dummy.dma_addr >> shift); in rkisp1_set_next_buf()
759 rkisp1_write(cap->rkisp1, in rkisp1_set_next_buf()
760 cap->config->mi.cr_base_ad_init, in rkisp1_set_next_buf()
761 cap->buf.dummy.dma_addr >> shift); in rkisp1_set_next_buf()
763 rkisp1_write(cap->rkisp1, in rkisp1_set_next_buf()
764 cap->config->mi.cb_base_ad_init, in rkisp1_set_next_buf()
766 rkisp1_write(cap->rkisp1, in rkisp1_set_next_buf()
767 cap->config->mi.cr_base_ad_init, in rkisp1_set_next_buf()
775 rkisp1_write(cap->rkisp1, cap->config->mi.y_base_ad_init, in rkisp1_set_next_buf()
776 cap->buf.dummy.dma_addr >> shift); in rkisp1_set_next_buf()
777 rkisp1_write(cap->rkisp1, cap->config->mi.cb_base_ad_init, in rkisp1_set_next_buf()
778 cap->buf.dummy.dma_addr >> shift); in rkisp1_set_next_buf()
779 rkisp1_write(cap->rkisp1, cap->config->mi.cr_base_ad_init, in rkisp1_set_next_buf()
780 cap->buf.dummy.dma_addr >> shift); in rkisp1_set_next_buf()
784 rkisp1_write(cap->rkisp1, cap->config->mi.y_offs_cnt_init, 0); in rkisp1_set_next_buf()
785 rkisp1_write(cap->rkisp1, cap->config->mi.cb_offs_cnt_init, 0); in rkisp1_set_next_buf()
786 rkisp1_write(cap->rkisp1, cap->config->mi.cr_offs_cnt_init, 0); in rkisp1_set_next_buf()
791 * is processing and we should set up buffer for next-next frame,
796 struct rkisp1_isp *isp = &cap->rkisp1->isp; in rkisp1_handle_buffer()
799 spin_lock(&cap->buf.lock); in rkisp1_handle_buffer()
800 curr_buf = cap->buf.curr; in rkisp1_handle_buffer()
803 curr_buf->vb.sequence = isp->frame_sequence; in rkisp1_handle_buffer()
804 curr_buf->vb.vb2_buf.timestamp = ktime_get_boottime_ns(); in rkisp1_handle_buffer()
805 curr_buf->vb.field = V4L2_FIELD_NONE; in rkisp1_handle_buffer()
806 vb2_buffer_done(&curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); in rkisp1_handle_buffer()
808 cap->rkisp1->debug.frame_drop[cap->id]++; in rkisp1_handle_buffer()
812 spin_unlock(&cap->buf.lock); in rkisp1_handle_buffer()
823 if (!rkisp1->irqs_enabled) in rkisp1_capture_isr()
833 struct rkisp1_capture *cap = &rkisp1->capture_devs[i]; in rkisp1_capture_isr()
837 if (!cap->is_stopping) { in rkisp1_capture_isr()
849 if (!cap->ops->is_stopped(cap)) { in rkisp1_capture_isr()
850 cap->ops->stop(cap); in rkisp1_capture_isr()
853 cap->is_stopping = false; in rkisp1_capture_isr()
854 cap->is_streaming = false; in rkisp1_capture_isr()
855 wake_up(&cap->done); in rkisp1_capture_isr()
861 /* ----------------------------------------------------------------------------
871 struct rkisp1_capture *cap = queue->drv_priv; in rkisp1_vb2_queue_setup()
872 const struct v4l2_pix_format_mplane *pixm = &cap->pix.fmt; in rkisp1_vb2_queue_setup()
876 if (*num_planes != pixm->num_planes) in rkisp1_vb2_queue_setup()
877 return -EINVAL; in rkisp1_vb2_queue_setup()
879 for (i = 0; i < pixm->num_planes; i++) in rkisp1_vb2_queue_setup()
880 if (sizes[i] < pixm->plane_fmt[i].sizeimage) in rkisp1_vb2_queue_setup()
881 return -EINVAL; in rkisp1_vb2_queue_setup()
883 *num_planes = pixm->num_planes; in rkisp1_vb2_queue_setup()
884 for (i = 0; i < pixm->num_planes; i++) in rkisp1_vb2_queue_setup()
885 sizes[i] = pixm->plane_fmt[i].sizeimage; in rkisp1_vb2_queue_setup()
896 struct rkisp1_capture *cap = vb->vb2_queue->drv_priv; in rkisp1_vb2_buf_init()
897 const struct v4l2_pix_format_mplane *pixm = &cap->pix.fmt; in rkisp1_vb2_buf_init()
900 memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); in rkisp1_vb2_buf_init()
901 for (i = 0; i < pixm->num_planes; i++) in rkisp1_vb2_buf_init()
902 ispbuf->buff_addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); in rkisp1_vb2_buf_init()
904 /* Convert to non-MPLANE */ in rkisp1_vb2_buf_init()
905 if (pixm->num_planes == 1) { in rkisp1_vb2_buf_init()
906 ispbuf->buff_addr[RKISP1_PLANE_CB] = in rkisp1_vb2_buf_init()
907 ispbuf->buff_addr[RKISP1_PLANE_Y] + in rkisp1_vb2_buf_init()
909 ispbuf->buff_addr[RKISP1_PLANE_CR] = in rkisp1_vb2_buf_init()
910 ispbuf->buff_addr[RKISP1_PLANE_CB] + in rkisp1_vb2_buf_init()
918 if (cap->pix.info->comp_planes == 3 && cap->pix.cfg->uv_swap) in rkisp1_vb2_buf_init()
919 swap(ispbuf->buff_addr[RKISP1_PLANE_CR], in rkisp1_vb2_buf_init()
920 ispbuf->buff_addr[RKISP1_PLANE_CB]); in rkisp1_vb2_buf_init()
929 struct rkisp1_capture *cap = vb->vb2_queue->drv_priv; in rkisp1_vb2_buf_queue()
931 spin_lock_irq(&cap->buf.lock); in rkisp1_vb2_buf_queue()
932 list_add_tail(&ispbuf->queue, &cap->buf.queue); in rkisp1_vb2_buf_queue()
933 spin_unlock_irq(&cap->buf.lock); in rkisp1_vb2_buf_queue()
938 struct rkisp1_capture *cap = vb->vb2_queue->drv_priv; in rkisp1_vb2_buf_prepare()
941 for (i = 0; i < cap->pix.fmt.num_planes; i++) { in rkisp1_vb2_buf_prepare()
942 unsigned long size = cap->pix.fmt.plane_fmt[i].sizeimage; in rkisp1_vb2_buf_prepare()
945 dev_err(cap->rkisp1->dev, in rkisp1_vb2_buf_prepare()
948 return -EINVAL; in rkisp1_vb2_buf_prepare()
961 spin_lock_irq(&cap->buf.lock); in rkisp1_return_all_buffers()
962 if (cap->buf.curr) { in rkisp1_return_all_buffers()
963 vb2_buffer_done(&cap->buf.curr->vb.vb2_buf, state); in rkisp1_return_all_buffers()
964 cap->buf.curr = NULL; in rkisp1_return_all_buffers()
966 if (cap->buf.next) { in rkisp1_return_all_buffers()
967 vb2_buffer_done(&cap->buf.next->vb.vb2_buf, state); in rkisp1_return_all_buffers()
968 cap->buf.next = NULL; in rkisp1_return_all_buffers()
970 while (!list_empty(&cap->buf.queue)) { in rkisp1_return_all_buffers()
971 buf = list_first_entry(&cap->buf.queue, in rkisp1_return_all_buffers()
973 list_del(&buf->queue); in rkisp1_return_all_buffers()
974 vb2_buffer_done(&buf->vb.vb2_buf, state); in rkisp1_return_all_buffers()
976 spin_unlock_irq(&cap->buf.lock); in rkisp1_return_all_buffers()
982 * Usually, each sub-module updates its shadow register after
987 struct rkisp1_device *rkisp1 = cap->rkisp1; in rkisp1_cap_stream_enable()
988 struct rkisp1_capture *other = &rkisp1->capture_devs[cap->id ^ 1]; in rkisp1_cap_stream_enable()
991 cap->ops->set_data_path(cap); in rkisp1_cap_stream_enable()
992 cap->ops->config(cap); in rkisp1_cap_stream_enable()
995 spin_lock_irq(&cap->buf.lock); in rkisp1_cap_stream_enable()
997 cap->ops->enable(cap); in rkisp1_cap_stream_enable()
1009 if (!has_self_path || !other->is_streaming) { in rkisp1_cap_stream_enable()
1021 * write-only and reads as zeros. We can skip reading it. in rkisp1_cap_stream_enable()
1034 spin_unlock_irq(&cap->buf.lock); in rkisp1_cap_stream_enable()
1035 cap->is_streaming = true; in rkisp1_cap_stream_enable()
1043 cap->is_stopping = true; in rkisp1_cap_stream_disable()
1044 ret = wait_event_timeout(cap->done, in rkisp1_cap_stream_disable()
1045 !cap->is_streaming, in rkisp1_cap_stream_disable()
1048 cap->rkisp1->debug.stop_timeout[cap->id]++; in rkisp1_cap_stream_disable()
1049 cap->ops->stop(cap); in rkisp1_cap_stream_disable()
1050 cap->is_stopping = false; in rkisp1_cap_stream_disable()
1051 cap->is_streaming = false; in rkisp1_cap_stream_disable()
1056 * rkisp1_pipeline_stream_disable - disable nodes in the pipeline
1063 __must_hold(&cap->rkisp1->stream_lock) in rkisp1_pipeline_stream_disable()
1065 struct rkisp1_device *rkisp1 = cap->rkisp1; in rkisp1_pipeline_stream_disable()
1073 if (rkisp1->pipe.start_count < 2) in rkisp1_pipeline_stream_disable()
1074 v4l2_subdev_call(&rkisp1->isp.sd, video, s_stream, false); in rkisp1_pipeline_stream_disable()
1076 v4l2_subdev_call(&rkisp1->resizer_devs[cap->id].sd, video, s_stream, in rkisp1_pipeline_stream_disable()
1081 * rkisp1_pipeline_stream_enable - enable nodes in the pipeline
1087 __must_hold(&cap->rkisp1->stream_lock) in rkisp1_pipeline_stream_enable()
1089 struct rkisp1_device *rkisp1 = cap->rkisp1; in rkisp1_pipeline_stream_enable()
1094 ret = v4l2_subdev_call(&rkisp1->resizer_devs[cap->id].sd, video, in rkisp1_pipeline_stream_enable()
1103 if (rkisp1->pipe.start_count > 1) in rkisp1_pipeline_stream_enable()
1106 ret = v4l2_subdev_call(&rkisp1->isp.sd, video, s_stream, true); in rkisp1_pipeline_stream_enable()
1113 v4l2_subdev_call(&rkisp1->resizer_devs[cap->id].sd, video, s_stream, in rkisp1_pipeline_stream_enable()
1123 struct rkisp1_capture *cap = queue->drv_priv; in rkisp1_vb2_stop_streaming()
1124 struct rkisp1_vdev_node *node = &cap->vnode; in rkisp1_vb2_stop_streaming()
1125 struct rkisp1_device *rkisp1 = cap->rkisp1; in rkisp1_vb2_stop_streaming()
1128 mutex_lock(&cap->rkisp1->stream_lock); in rkisp1_vb2_stop_streaming()
1134 v4l2_pipeline_pm_put(&node->vdev.entity); in rkisp1_vb2_stop_streaming()
1135 ret = pm_runtime_put(rkisp1->dev); in rkisp1_vb2_stop_streaming()
1137 dev_err(rkisp1->dev, "power down failed error:%d\n", ret); in rkisp1_vb2_stop_streaming()
1141 video_device_pipeline_stop(&node->vdev); in rkisp1_vb2_stop_streaming()
1143 mutex_unlock(&cap->rkisp1->stream_lock); in rkisp1_vb2_stop_streaming()
1149 struct rkisp1_capture *cap = queue->drv_priv; in rkisp1_vb2_start_streaming()
1150 struct media_entity *entity = &cap->vnode.vdev.entity; in rkisp1_vb2_start_streaming()
1153 mutex_lock(&cap->rkisp1->stream_lock); in rkisp1_vb2_start_streaming()
1155 ret = video_device_pipeline_start(&cap->vnode.vdev, &cap->rkisp1->pipe); in rkisp1_vb2_start_streaming()
1157 dev_err(cap->rkisp1->dev, "start pipeline failed %d\n", ret); in rkisp1_vb2_start_streaming()
1165 ret = pm_runtime_resume_and_get(cap->rkisp1->dev); in rkisp1_vb2_start_streaming()
1167 dev_err(cap->rkisp1->dev, "power up failed %d\n", ret); in rkisp1_vb2_start_streaming()
1172 dev_err(cap->rkisp1->dev, "open cif pipeline failed %d\n", ret); in rkisp1_vb2_start_streaming()
1180 mutex_unlock(&cap->rkisp1->stream_lock); in rkisp1_vb2_start_streaming()
1187 pm_runtime_put(cap->rkisp1->dev); in rkisp1_vb2_start_streaming()
1191 video_device_pipeline_stop(&cap->vnode.vdev); in rkisp1_vb2_start_streaming()
1194 mutex_unlock(&cap->rkisp1->stream_lock); in rkisp1_vb2_start_streaming()
1208 /* ----------------------------------------------------------------------------
1216 struct v4l2_plane_pix_format *plane_y = &pixm->plane_fmt[0]; in rkisp1_fill_pixfmt()
1221 memset(pixm->plane_fmt, 0, sizeof(pixm->plane_fmt)); in rkisp1_fill_pixfmt()
1222 info = v4l2_format_info(pixm->pixelformat); in rkisp1_fill_pixfmt()
1223 pixm->num_planes = info->mem_planes; in rkisp1_fill_pixfmt()
1232 if (cap->id == RKISP1_SELFPATH || in rkisp1_fill_pixfmt()
1233 rkisp1_has_feature(cap->rkisp1, MAIN_STRIDE)) in rkisp1_fill_pixfmt()
1234 stride = clamp(DIV_ROUND_UP(plane_y->bytesperline, info->bpp[0]), in rkisp1_fill_pixfmt()
1235 pixm->width, 65536U); in rkisp1_fill_pixfmt()
1237 stride = pixm->width; in rkisp1_fill_pixfmt()
1239 plane_y->bytesperline = stride * info->bpp[0]; in rkisp1_fill_pixfmt()
1240 plane_y->sizeimage = plane_y->bytesperline * pixm->height; in rkisp1_fill_pixfmt()
1242 for (i = 1; i < info->comp_planes; i++) { in rkisp1_fill_pixfmt()
1243 struct v4l2_plane_pix_format *plane = &pixm->plane_fmt[i]; in rkisp1_fill_pixfmt()
1246 plane->bytesperline = DIV_ROUND_UP(stride, info->hdiv) * in rkisp1_fill_pixfmt()
1247 info->bpp[i]; in rkisp1_fill_pixfmt()
1248 plane->sizeimage = plane->bytesperline * in rkisp1_fill_pixfmt()
1249 DIV_ROUND_UP(pixm->height, info->vdiv); in rkisp1_fill_pixfmt()
1258 if (info->mem_planes == 1) in rkisp1_fill_pixfmt()
1259 for (i = 1; i < info->comp_planes; i++) in rkisp1_fill_pixfmt()
1260 plane_y->sizeimage += pixm->plane_fmt[i].sizeimage; in rkisp1_fill_pixfmt()
1268 bool yc_swap_support = rkisp1_has_feature(cap->rkisp1, MAIN_STRIDE); in rkisp1_find_fmt_cfg()
1271 for (i = 0; i < cap->config->fmt_size; i++) { in rkisp1_find_fmt_cfg()
1272 const struct rkisp1_capture_fmt_cfg *fmt = &cap->config->fmts[i]; in rkisp1_find_fmt_cfg()
1274 if (fmt->fourcc == pixelfmt && in rkisp1_find_fmt_cfg()
1275 (!fmt->yc_swap || yc_swap_support)) in rkisp1_find_fmt_cfg()
1276 return &cap->config->fmts[i]; in rkisp1_find_fmt_cfg()
1286 const struct rkisp1_capture_config *config = cap->config; in rkisp1_try_fmt()
1296 fmt = rkisp1_find_fmt_cfg(cap, pixm->pixelformat); in rkisp1_try_fmt()
1298 fmt = config->fmts; in rkisp1_try_fmt()
1299 pixm->pixelformat = fmt->fourcc; in rkisp1_try_fmt()
1302 pixm->width = clamp_t(u32, pixm->width, in rkisp1_try_fmt()
1303 RKISP1_RSZ_SRC_MIN_WIDTH, max_widths[cap->id]); in rkisp1_try_fmt()
1304 pixm->height = clamp_t(u32, pixm->height, in rkisp1_try_fmt()
1305 RKISP1_RSZ_SRC_MIN_HEIGHT, max_heights[cap->id]); in rkisp1_try_fmt()
1307 pixm->field = V4L2_FIELD_NONE; in rkisp1_try_fmt()
1308 pixm->colorspace = V4L2_COLORSPACE_DEFAULT; in rkisp1_try_fmt()
1309 pixm->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; in rkisp1_try_fmt()
1310 pixm->quantization = V4L2_QUANTIZATION_DEFAULT; in rkisp1_try_fmt()
1323 rkisp1_try_fmt(cap, pixm, &cap->pix.cfg, &cap->pix.info); in rkisp1_set_fmt()
1325 cap->pix.fmt = *pixm; in rkisp1_set_fmt()
1326 cap->stride = pixm->plane_fmt[0].bytesperline / cap->pix.info->bpp[0]; in rkisp1_set_fmt()
1334 rkisp1_try_fmt(cap, &f->fmt.pix_mp, NULL, NULL); in rkisp1_try_fmt_vid_cap_mplane()
1344 bool yc_swap_support = rkisp1_has_feature(cap->rkisp1, MAIN_STRIDE); in rkisp1_enum_fmt_vid_cap_mplane()
1347 if (f->index >= cap->config->fmt_size) in rkisp1_enum_fmt_vid_cap_mplane()
1348 return -EINVAL; in rkisp1_enum_fmt_vid_cap_mplane()
1350 if (!f->mbus_code && yc_swap_support) { in rkisp1_enum_fmt_vid_cap_mplane()
1351 fmt = &cap->config->fmts[f->index]; in rkisp1_enum_fmt_vid_cap_mplane()
1352 f->pixelformat = fmt->fourcc; in rkisp1_enum_fmt_vid_cap_mplane()
1356 for (i = 0; i < cap->config->fmt_size; i++) { in rkisp1_enum_fmt_vid_cap_mplane()
1357 fmt = &cap->config->fmts[i]; in rkisp1_enum_fmt_vid_cap_mplane()
1359 if (f->mbus_code && fmt->mbus != f->mbus_code) in rkisp1_enum_fmt_vid_cap_mplane()
1362 if (!yc_swap_support && fmt->yc_swap) in rkisp1_enum_fmt_vid_cap_mplane()
1365 if (n++ == f->index) { in rkisp1_enum_fmt_vid_cap_mplane()
1366 f->pixelformat = fmt->fourcc; in rkisp1_enum_fmt_vid_cap_mplane()
1370 return -EINVAL; in rkisp1_enum_fmt_vid_cap_mplane()
1386 if (fsize->index != 0) in rkisp1_enum_framesizes()
1387 return -EINVAL; in rkisp1_enum_framesizes()
1389 fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; in rkisp1_enum_framesizes()
1391 fsize->stepwise.min_width = RKISP1_RSZ_SRC_MIN_WIDTH; in rkisp1_enum_framesizes()
1392 fsize->stepwise.max_width = max_widths[cap->id]; in rkisp1_enum_framesizes()
1393 fsize->stepwise.step_width = 2; in rkisp1_enum_framesizes()
1395 fsize->stepwise.min_height = RKISP1_RSZ_SRC_MIN_HEIGHT; in rkisp1_enum_framesizes()
1396 fsize->stepwise.max_height = max_heights[cap->id]; in rkisp1_enum_framesizes()
1397 fsize->stepwise.step_height = 2; in rkisp1_enum_framesizes()
1407 rkisp1_vdev_to_node(&cap->vnode.vdev); in rkisp1_s_fmt_vid_cap_mplane()
1409 if (vb2_is_busy(&node->buf_queue)) in rkisp1_s_fmt_vid_cap_mplane()
1410 return -EBUSY; in rkisp1_s_fmt_vid_cap_mplane()
1412 rkisp1_set_fmt(cap, &f->fmt.pix_mp); in rkisp1_s_fmt_vid_cap_mplane()
1422 f->fmt.pix_mp = cap->pix.fmt; in rkisp1_g_fmt_vid_cap_mplane()
1430 strscpy(cap->driver, RKISP1_DRIVER_NAME, sizeof(cap->driver)); in rkisp1_querycap()
1431 strscpy(cap->card, RKISP1_DRIVER_NAME, sizeof(cap->card)); in rkisp1_querycap()
1432 strscpy(cap->bus_info, RKISP1_BUS_INFO, sizeof(cap->bus_info)); in rkisp1_querycap()
1460 media_entity_to_video_device(link->sink->entity); in rkisp1_capture_link_validate()
1462 media_entity_to_v4l2_subdev(link->source->entity); in rkisp1_capture_link_validate()
1465 rkisp1_find_fmt_cfg(cap, cap->pix.fmt.pixelformat); in rkisp1_capture_link_validate()
1468 .pad = link->source->index, in rkisp1_capture_link_validate()
1476 if (sd_fmt.format.height != cap->pix.fmt.height || in rkisp1_capture_link_validate()
1477 sd_fmt.format.width != cap->pix.fmt.width || in rkisp1_capture_link_validate()
1478 sd_fmt.format.code != fmt->mbus) { in rkisp1_capture_link_validate()
1479 dev_dbg(cap->rkisp1->dev, in rkisp1_capture_link_validate()
1480 "link '%s':%u -> '%s':%u not valid: 0x%04x/%ux%u != 0x%04x/%ux%u\n", in rkisp1_capture_link_validate()
1481 link->source->entity->name, link->source->index, in rkisp1_capture_link_validate()
1482 link->sink->entity->name, link->sink->index, in rkisp1_capture_link_validate()
1484 sd_fmt.format.height, fmt->mbus, cap->pix.fmt.width, in rkisp1_capture_link_validate()
1485 cap->pix.fmt.height); in rkisp1_capture_link_validate()
1486 return -EPIPE; in rkisp1_capture_link_validate()
1492 /* ----------------------------------------------------------------------------
1510 if (!video_is_registered(&cap->vnode.vdev)) in rkisp1_unregister_capture()
1513 media_entity_cleanup(&cap->vnode.vdev.entity); in rkisp1_unregister_capture()
1514 vb2_video_unregister_device(&cap->vnode.vdev); in rkisp1_unregister_capture()
1515 mutex_destroy(&cap->vnode.vlock); in rkisp1_unregister_capture()
1520 struct rkisp1_capture *mp = &rkisp1->capture_devs[RKISP1_MAINPATH]; in rkisp1_capture_devs_unregister()
1521 struct rkisp1_capture *sp = &rkisp1->capture_devs[RKISP1_SELFPATH]; in rkisp1_capture_devs_unregister()
1532 struct v4l2_device *v4l2_dev = &cap->rkisp1->v4l2_dev; in rkisp1_register_capture()
1533 struct video_device *vdev = &cap->vnode.vdev; in rkisp1_register_capture()
1538 strscpy(vdev->name, dev_names[cap->id], sizeof(vdev->name)); in rkisp1_register_capture()
1540 mutex_init(&node->vlock); in rkisp1_register_capture()
1542 vdev->ioctl_ops = &rkisp1_v4l2_ioctl_ops; in rkisp1_register_capture()
1543 vdev->release = video_device_release_empty; in rkisp1_register_capture()
1544 vdev->fops = &rkisp1_fops; in rkisp1_register_capture()
1545 vdev->minor = -1; in rkisp1_register_capture()
1546 vdev->v4l2_dev = v4l2_dev; in rkisp1_register_capture()
1547 vdev->lock = &node->vlock; in rkisp1_register_capture()
1548 vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE_MPLANE | in rkisp1_register_capture()
1550 vdev->entity.ops = &rkisp1_media_ops; in rkisp1_register_capture()
1552 vdev->vfl_dir = VFL_DIR_RX; in rkisp1_register_capture()
1553 node->pad.flags = MEDIA_PAD_FL_SINK; in rkisp1_register_capture()
1555 q = &node->buf_queue; in rkisp1_register_capture()
1556 q->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; in rkisp1_register_capture()
1557 q->io_modes = VB2_MMAP | VB2_DMABUF; in rkisp1_register_capture()
1558 q->drv_priv = cap; in rkisp1_register_capture()
1559 q->ops = &rkisp1_vb2_ops; in rkisp1_register_capture()
1560 q->mem_ops = &vb2_dma_contig_memops; in rkisp1_register_capture()
1561 q->buf_struct_size = sizeof(struct rkisp1_buffer); in rkisp1_register_capture()
1562 q->min_queued_buffers = 1; in rkisp1_register_capture()
1563 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in rkisp1_register_capture()
1564 q->lock = &node->vlock; in rkisp1_register_capture()
1565 q->dev = cap->rkisp1->dev; in rkisp1_register_capture()
1568 dev_err(cap->rkisp1->dev, in rkisp1_register_capture()
1573 vdev->queue = q; in rkisp1_register_capture()
1575 ret = media_entity_pads_init(&vdev->entity, 1, &node->pad); in rkisp1_register_capture()
1579 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); in rkisp1_register_capture()
1581 dev_err(cap->rkisp1->dev, in rkisp1_register_capture()
1582 "failed to register %s, ret=%d\n", vdev->name, ret); in rkisp1_register_capture()
1586 v4l2_info(v4l2_dev, "registered %s as /dev/video%d\n", vdev->name, in rkisp1_register_capture()
1587 vdev->num); in rkisp1_register_capture()
1592 media_entity_cleanup(&vdev->entity); in rkisp1_register_capture()
1593 mutex_destroy(&node->vlock); in rkisp1_register_capture()
1600 struct rkisp1_capture *cap = &rkisp1->capture_devs[id]; in rkisp1_capture_init()
1604 cap->id = id; in rkisp1_capture_init()
1605 cap->rkisp1 = rkisp1; in rkisp1_capture_init()
1607 INIT_LIST_HEAD(&cap->buf.queue); in rkisp1_capture_init()
1608 init_waitqueue_head(&cap->done); in rkisp1_capture_init()
1609 spin_lock_init(&cap->buf.lock); in rkisp1_capture_init()
1610 if (cap->id == RKISP1_SELFPATH) { in rkisp1_capture_init()
1611 cap->ops = &rkisp1_capture_ops_sp; in rkisp1_capture_init()
1612 cap->config = &rkisp1_capture_config_sp; in rkisp1_capture_init()
1614 cap->ops = &rkisp1_capture_ops_mp; in rkisp1_capture_init()
1615 cap->config = &rkisp1_capture_config_mp; in rkisp1_capture_init()
1618 cap->is_streaming = false; in rkisp1_capture_init()
1634 struct rkisp1_capture *cap = &rkisp1->capture_devs[i]; in rkisp1_capture_devs_register()