Lines Matching +full:top +full:- +full:ctrl
1 // SPDX-License-Identifier: GPL-2.0+
20 #include <media/v4l2-ctrls.h>
21 #include <media/v4l2-device.h>
22 #include <media/v4l2-event.h>
23 #include <media/v4l2-ioctl.h>
24 #include <media/v4l2-mem2mem.h>
25 #include <media/videobuf2-dma-contig.h>
190 if (fmt->fourcc == pixel_format && fmt->types & fmt_type) in dw100_find_pixel_format()
199 return dw100_find_pixel_format(f->fmt.pix_mp.pixelformat, in dw100_find_format()
200 to_dw100_fmt_type(f->type)); in dw100_find_format()
205 return readl(dw_dev->mmio + reg); in dw100_read()
210 writel(val, dw_dev->mmio + reg); in dw100_write()
215 struct dw100_device *dw_dev = m->private; in dw100_dump_regs()
269 return container_of(file->private_data, struct dw100_ctx, fh); in dw100_file2ctx()
276 return &ctx->q_data[DW100_QUEUE_SRC]; in dw100_get_q_data()
278 return &ctx->q_data[DW100_QUEUE_DST]; in dw100_get_q_data()
298 struct v4l2_ctrl *ctrl = ctx->ctrls[DW100_CTRL_DEWARPING_MAP]; in dw100_get_user_map() local
300 return ctrl->p_cur.p_u32; in dw100_get_user_map()
311 if (ctx->map) in dw100_create_mapping()
312 dma_free_coherent(&ctx->dw_dev->pdev->dev, ctx->map_size, in dw100_create_mapping()
313 ctx->map, ctx->map_dma); in dw100_create_mapping()
315 ctx->map = dma_alloc_coherent(&ctx->dw_dev->pdev->dev, ctx->map_size, in dw100_create_mapping()
316 &ctx->map_dma, GFP_KERNEL); in dw100_create_mapping()
318 if (!ctx->map) in dw100_create_mapping()
319 return -ENOMEM; in dw100_create_mapping()
322 memcpy(ctx->map, user_map, ctx->map_size); in dw100_create_mapping()
324 dev_dbg(&ctx->dw_dev->pdev->dev, in dw100_create_mapping()
325 "%ux%u %s mapping created (d:%pad-c:%p) for stream %ux%u->%ux%u\n", in dw100_create_mapping()
326 ctx->map_width, ctx->map_height, in dw100_create_mapping()
327 ctx->user_map_is_set ? "user" : "identity", in dw100_create_mapping()
328 &ctx->map_dma, ctx->map, in dw100_create_mapping()
329 ctx->q_data[DW100_QUEUE_SRC].pix_fmt.width, in dw100_create_mapping()
330 ctx->q_data[DW100_QUEUE_DST].pix_fmt.height, in dw100_create_mapping()
331 ctx->q_data[DW100_QUEUE_SRC].pix_fmt.width, in dw100_create_mapping()
332 ctx->q_data[DW100_QUEUE_DST].pix_fmt.height); in dw100_create_mapping()
339 if (ctx->map) { in dw100_destroy_mapping()
340 dma_free_coherent(&ctx->dw_dev->pdev->dev, ctx->map_size, in dw100_destroy_mapping()
341 ctx->map, ctx->map_dma); in dw100_destroy_mapping()
342 ctx->map = NULL; in dw100_destroy_mapping()
346 static int dw100_s_ctrl(struct v4l2_ctrl *ctrl) in dw100_s_ctrl() argument
349 container_of(ctrl->handler, struct dw100_ctx, hdl); in dw100_s_ctrl()
351 switch (ctrl->id) { in dw100_s_ctrl()
353 ctx->user_map_is_set = true; in dw100_s_ctrl()
375 static void dw100_ctrl_dewarping_map_init(const struct v4l2_ctrl *ctrl, in dw100_ctrl_dewarping_map_init() argument
380 container_of(ctrl->handler, struct dw100_ctx, hdl); in dw100_ctrl_dewarping_map_init()
384 u32 *map = ctrl->p_cur.p_u32; in dw100_ctrl_dewarping_map_init()
386 sw = ctx->q_data[DW100_QUEUE_SRC].pix_fmt.width; in dw100_ctrl_dewarping_map_init()
387 sh = ctx->q_data[DW100_QUEUE_SRC].pix_fmt.height; in dw100_ctrl_dewarping_map_init()
389 mw = ctrl->dims[0]; in dw100_ctrl_dewarping_map_init()
390 mh = ctrl->dims[1]; in dw100_ctrl_dewarping_map_init()
394 qdx = qsw / (mw - 1); in dw100_ctrl_dewarping_map_init()
395 qdy = qsh / (mh - 1); in dw100_ctrl_dewarping_map_init()
397 ctx->map_width = mw; in dw100_ctrl_dewarping_map_init()
398 ctx->map_height = mh; in dw100_ctrl_dewarping_map_init()
399 ctx->map_size = mh * mw * sizeof(u32); in dw100_ctrl_dewarping_map_init()
401 for (idx = from_idx; idx < ctrl->elems; idx++) { in dw100_ctrl_dewarping_map_init()
407 ctx->user_map_is_set = false; in dw100_ctrl_dewarping_map_init()
440 format = &dw100_get_q_data(ctx, vq->type)->pix_fmt; in dw100_queue_setup()
443 if (*nplanes != format->num_planes) in dw100_queue_setup()
444 return -EINVAL; in dw100_queue_setup()
447 if (sizes[i] < format->plane_fmt[i].sizeimage) in dw100_queue_setup()
448 return -EINVAL; in dw100_queue_setup()
454 *nplanes = format->num_planes; in dw100_queue_setup()
456 for (i = 0; i < format->num_planes; ++i) in dw100_queue_setup()
457 sizes[i] = format->plane_fmt[i].sizeimage; in dw100_queue_setup()
466 struct dw100_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); in dw100_buf_prepare()
467 struct dw100_device *dw_dev = ctx->dw_dev; in dw100_buf_prepare()
469 &dw100_get_q_data(ctx, vb->vb2_queue->type)->pix_fmt; in dw100_buf_prepare()
471 if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) { in dw100_buf_prepare()
472 if (vbuf->field != V4L2_FIELD_NONE) { in dw100_buf_prepare()
473 dev_dbg(&dw_dev->pdev->dev, "%x field isn't supported\n", in dw100_buf_prepare()
474 vbuf->field); in dw100_buf_prepare()
475 return -EINVAL; in dw100_buf_prepare()
479 for (i = 0; i < pix_fmt->num_planes; i++) { in dw100_buf_prepare()
480 unsigned long size = pix_fmt->plane_fmt[i].sizeimage; in dw100_buf_prepare()
483 dev_dbg(&dw_dev->pdev->dev, in dw100_buf_prepare()
486 return -EINVAL; in dw100_buf_prepare()
498 struct dw100_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); in dw100_buf_queue()
500 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); in dw100_buf_queue()
510 if (V4L2_TYPE_IS_OUTPUT(q->type)) in dw100_return_all_buffers()
511 vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); in dw100_return_all_buffers()
513 vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); in dw100_return_all_buffers()
523 struct dw100_q_data *q_data = dw100_get_q_data(ctx, q->type); in dw100_start_streaming()
526 q_data->sequence = 0; in dw100_start_streaming()
532 ret = pm_runtime_resume_and_get(&ctx->dw_dev->pdev->dev); in dw100_start_streaming()
550 pm_runtime_put_sync(&ctx->dw_dev->pdev->dev); in dw100_stop_streaming()
569 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; in dw100_m2m_queue_init()
570 src_vq->io_modes = VB2_MMAP | VB2_DMABUF; in dw100_m2m_queue_init()
571 src_vq->drv_priv = ctx; in dw100_m2m_queue_init()
572 src_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); in dw100_m2m_queue_init()
573 src_vq->ops = &dw100_qops; in dw100_m2m_queue_init()
574 src_vq->mem_ops = &vb2_dma_contig_memops; in dw100_m2m_queue_init()
575 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; in dw100_m2m_queue_init()
576 src_vq->lock = &ctx->vq_mutex; in dw100_m2m_queue_init()
577 src_vq->dev = ctx->dw_dev->v4l2_dev.dev; in dw100_m2m_queue_init()
583 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; in dw100_m2m_queue_init()
584 dst_vq->io_modes = VB2_MMAP | VB2_DMABUF; in dw100_m2m_queue_init()
585 dst_vq->drv_priv = ctx; in dw100_m2m_queue_init()
586 dst_vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer); in dw100_m2m_queue_init()
587 dst_vq->ops = &dw100_qops; in dw100_m2m_queue_init()
588 dst_vq->mem_ops = &vb2_dma_contig_memops; in dw100_m2m_queue_init()
589 dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; in dw100_m2m_queue_init()
590 dst_vq->lock = &ctx->vq_mutex; in dw100_m2m_queue_init()
591 dst_vq->dev = ctx->dw_dev->v4l2_dev.dev; in dw100_m2m_queue_init()
606 return -ENOMEM; in dw100_open()
608 mutex_init(&ctx->vq_mutex); in dw100_open()
609 v4l2_fh_init(&ctx->fh, video_devdata(file)); in dw100_open()
610 file->private_data = &ctx->fh; in dw100_open()
611 ctx->dw_dev = dw_dev; in dw100_open()
613 ctx->q_data[DW100_QUEUE_SRC].fmt = &formats[0]; in dw100_open()
615 pix_fmt = &ctx->q_data[DW100_QUEUE_SRC].pix_fmt; in dw100_open()
616 pix_fmt->field = V4L2_FIELD_NONE; in dw100_open()
617 pix_fmt->colorspace = V4L2_COLORSPACE_REC709; in dw100_open()
618 pix_fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix_fmt->colorspace); in dw100_open()
619 pix_fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(pix_fmt->colorspace); in dw100_open()
620 pix_fmt->quantization = in dw100_open()
621 V4L2_MAP_QUANTIZATION_DEFAULT(false, pix_fmt->colorspace, in dw100_open()
622 pix_fmt->ycbcr_enc); in dw100_open()
626 ctx->q_data[DW100_QUEUE_SRC].crop.top = 0; in dw100_open()
627 ctx->q_data[DW100_QUEUE_SRC].crop.left = 0; in dw100_open()
628 ctx->q_data[DW100_QUEUE_SRC].crop.width = DW100_DEF_W; in dw100_open()
629 ctx->q_data[DW100_QUEUE_SRC].crop.height = DW100_DEF_H; in dw100_open()
631 ctx->q_data[DW100_QUEUE_DST] = ctx->q_data[DW100_QUEUE_SRC]; in dw100_open()
633 hdl = &ctx->hdl; in dw100_open()
636 ctx->ctrls[i] = v4l2_ctrl_new_custom(hdl, &controls[i], NULL); in dw100_open()
637 if (hdl->error) { in dw100_open()
638 dev_err(&ctx->dw_dev->pdev->dev, in dw100_open()
640 ret = hdl->error; in dw100_open()
644 ctx->fh.ctrl_handler = hdl; in dw100_open()
646 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dw_dev->m2m_dev, in dw100_open()
649 if (IS_ERR(ctx->fh.m2m_ctx)) { in dw100_open()
650 ret = PTR_ERR(ctx->fh.m2m_ctx); in dw100_open()
654 v4l2_fh_add(&ctx->fh); in dw100_open()
660 v4l2_fh_exit(&ctx->fh); in dw100_open()
661 mutex_destroy(&ctx->vq_mutex); in dw100_open()
671 v4l2_fh_del(&ctx->fh); in dw100_release()
672 v4l2_fh_exit(&ctx->fh); in dw100_release()
673 v4l2_ctrl_handler_free(&ctx->hdl); in dw100_release()
674 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); in dw100_release()
675 mutex_destroy(&ctx->vq_mutex); in dw100_release()
693 strscpy(cap->driver, DRV_NAME, sizeof(cap->driver)); in dw100_querycap()
694 strscpy(cap->card, "DW100 dewarper", sizeof(cap->card)); in dw100_querycap()
705 if (formats[i].types & to_dw100_fmt_type(f->type)) { in dw100_enum_fmt_vid()
706 if (num == f->index) { in dw100_enum_fmt_vid()
707 f->pixelformat = formats[i].fourcc; in dw100_enum_fmt_vid()
714 return -EINVAL; in dw100_enum_fmt_vid()
722 if (fsize->index) in dw100_enum_framesizes()
723 return -EINVAL; in dw100_enum_framesizes()
725 fmt = dw100_find_pixel_format(fsize->pixel_format, in dw100_enum_framesizes()
728 return -EINVAL; in dw100_enum_framesizes()
730 fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE; in dw100_enum_framesizes()
731 fsize->stepwise = dw100_frmsize_stepwise; in dw100_enum_framesizes()
742 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); in dw100_g_fmt_vid()
744 return -EINVAL; in dw100_g_fmt_vid()
746 q_data = dw100_get_q_data(ctx, f->type); in dw100_g_fmt_vid()
748 f->fmt.pix_mp = q_data->pix_fmt; in dw100_g_fmt_vid()
756 struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp; in dw100_try_fmt()
762 pix->pixelformat = fmt->fourcc; in dw100_try_fmt()
765 v4l2_apply_frmsize_constraints(&pix->width, &pix->height, in dw100_try_fmt()
768 v4l2_fill_pixfmt_mp(pix, fmt->fourcc, pix->width, pix->height); in dw100_try_fmt()
770 pix->field = V4L2_FIELD_NONE; in dw100_try_fmt()
772 if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { in dw100_try_fmt()
773 if (pix->colorspace == V4L2_COLORSPACE_DEFAULT) in dw100_try_fmt()
774 pix->colorspace = V4L2_COLORSPACE_REC709; in dw100_try_fmt()
775 if (pix->xfer_func == V4L2_XFER_FUNC_DEFAULT) in dw100_try_fmt()
776 pix->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(pix->colorspace); in dw100_try_fmt()
777 if (pix->ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT) in dw100_try_fmt()
778 pix->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(pix->colorspace); in dw100_try_fmt()
779 if (pix->quantization == V4L2_QUANTIZATION_DEFAULT) in dw100_try_fmt()
780 pix->quantization = in dw100_try_fmt()
782 pix->colorspace, in dw100_try_fmt()
783 pix->ycbcr_enc); in dw100_try_fmt()
792 pix->colorspace = q_data->pix_fmt.colorspace; in dw100_try_fmt()
793 pix->xfer_func = q_data->pix_fmt.xfer_func; in dw100_try_fmt()
794 pix->ycbcr_enc = q_data->pix_fmt.ycbcr_enc; in dw100_try_fmt()
795 pix->quantization = q_data->pix_fmt.quantization; in dw100_try_fmt()
806 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); in dw100_s_fmt()
808 return -EINVAL; in dw100_s_fmt()
810 q_data = dw100_get_q_data(ctx, f->type); in dw100_s_fmt()
812 return -EINVAL; in dw100_s_fmt()
815 dev_dbg(&ctx->dw_dev->pdev->dev, "%s queue busy\n", __func__); in dw100_s_fmt()
816 return -EBUSY; in dw100_s_fmt()
819 q_data->fmt = dw100_find_format(f); in dw100_s_fmt()
820 q_data->pix_fmt = f->fmt.pix_mp; in dw100_s_fmt()
821 q_data->crop.top = 0; in dw100_s_fmt()
822 q_data->crop.left = 0; in dw100_s_fmt()
823 q_data->crop.width = f->fmt.pix_mp.width; in dw100_s_fmt()
824 q_data->crop.height = f->fmt.pix_mp.height; in dw100_s_fmt()
828 if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { in dw100_s_fmt()
833 dst_q_data->pix_fmt.colorspace = q_data->pix_fmt.colorspace; in dw100_s_fmt()
834 dst_q_data->pix_fmt.ycbcr_enc = q_data->pix_fmt.ycbcr_enc; in dw100_s_fmt()
835 dst_q_data->pix_fmt.quantization = q_data->pix_fmt.quantization; in dw100_s_fmt()
836 dst_q_data->pix_fmt.xfer_func = q_data->pix_fmt.xfer_func; in dw100_s_fmt()
839 dev_dbg(&ctx->dw_dev->pdev->dev, in dw100_s_fmt()
841 f->type, q_data->pix_fmt.width, q_data->pix_fmt.height, in dw100_s_fmt()
842 &q_data->pix_fmt.pixelformat); in dw100_s_fmt()
844 if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { in dw100_s_fmt()
847 struct v4l2_ctrl *ctrl = ctx->ctrls[DW100_CTRL_DEWARPING_MAP]; in dw100_s_fmt() local
849 dims[0] = dw100_get_n_vertices_from_length(q_data->pix_fmt.width); in dw100_s_fmt()
850 dims[1] = dw100_get_n_vertices_from_length(q_data->pix_fmt.height); in dw100_s_fmt()
852 ret = v4l2_ctrl_modify_dimensions(ctrl, dims); in dw100_s_fmt()
855 dev_err(&ctx->dw_dev->pdev->dev, in dw100_s_fmt()
868 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) in dw100_try_fmt_vid_cap()
869 return -EINVAL; in dw100_try_fmt_vid_cap()
894 if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) in dw100_try_fmt_vid_out()
895 return -EINVAL; in dw100_try_fmt_vid_out()
923 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) in dw100_g_selection()
924 return -EINVAL; in dw100_g_selection()
928 switch (sel->target) { in dw100_g_selection()
931 sel->r.top = 0; in dw100_g_selection()
932 sel->r.left = 0; in dw100_g_selection()
933 sel->r.width = src_q_data->pix_fmt.width; in dw100_g_selection()
934 sel->r.height = src_q_data->pix_fmt.height; in dw100_g_selection()
937 sel->r.top = src_q_data->crop.top; in dw100_g_selection()
938 sel->r.left = src_q_data->crop.left; in dw100_g_selection()
939 sel->r.width = src_q_data->crop.width; in dw100_g_selection()
940 sel->r.height = src_q_data->crop.height; in dw100_g_selection()
943 return -EINVAL; in dw100_g_selection()
958 if (sel->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) in dw100_s_selection()
959 return -EINVAL; in dw100_s_selection()
963 dev_dbg(&ctx->dw_dev->pdev->dev, in dw100_s_selection()
965 sel->type, sel->target, in dw100_s_selection()
966 sel->r.width, sel->r.height, sel->r.left, sel->r.top); in dw100_s_selection()
968 switch (sel->target) { in dw100_s_selection()
970 wframe = src_q_data->pix_fmt.width; in dw100_s_selection()
971 hframe = src_q_data->pix_fmt.height; in dw100_s_selection()
973 sel->r.top = clamp_t(int, sel->r.top, 0, hframe - DW100_MIN_H); in dw100_s_selection()
974 sel->r.left = clamp_t(int, sel->r.left, 0, wframe - DW100_MIN_W); in dw100_s_selection()
975 sel->r.height = in dw100_s_selection()
976 clamp(sel->r.height, DW100_MIN_H, hframe - sel->r.top); in dw100_s_selection()
977 sel->r.width = in dw100_s_selection()
978 clamp(sel->r.width, DW100_MIN_W, wframe - sel->r.left); in dw100_s_selection()
981 qscalex = (sel->r.width << 16) / wframe; in dw100_s_selection()
982 qscaley = (sel->r.height << 16) / hframe; in dw100_s_selection()
983 y = sel->r.top; in dw100_s_selection()
984 x = sel->r.left; in dw100_s_selection()
988 switch (sel->flags) { in dw100_s_selection()
999 return -ERANGE; in dw100_s_selection()
1001 return -EINVAL; in dw100_s_selection()
1007 x = x + (sel->r.width - w) / 2; in dw100_s_selection()
1008 y = y + (sel->r.height - h) / 2; in dw100_s_selection()
1009 x = min(wframe - w, (unsigned int)max(0, x)); in dw100_s_selection()
1010 y = min(hframe - h, (unsigned int)max(0, y)); in dw100_s_selection()
1012 sel->r.top = y; in dw100_s_selection()
1013 sel->r.left = x; in dw100_s_selection()
1014 sel->r.width = w; in dw100_s_selection()
1015 sel->r.height = h; in dw100_s_selection()
1017 src_q_data->crop.top = sel->r.top; in dw100_s_selection()
1018 src_q_data->crop.left = sel->r.left; in dw100_s_selection()
1019 src_q_data->crop.width = sel->r.width; in dw100_s_selection()
1020 src_q_data->crop.height = sel->r.height; in dw100_s_selection()
1024 return -EINVAL; in dw100_s_selection()
1027 dev_dbg(&ctx->dw_dev->pdev->dev, in dw100_s_selection()
1029 sel->type, sel->target, in dw100_s_selection()
1030 sel->r.width, sel->r.height, sel->r.left, sel->r.top); in dw100_s_selection()
1072 curr_ctx = v4l2_m2m_get_curr_priv(dw_dev->m2m_dev); in dw100_job_finish()
1075 dev_err(&dw_dev->pdev->dev, in dw100_job_finish()
1080 src_vb = v4l2_m2m_src_buf_remove(curr_ctx->fh.m2m_ctx); in dw100_job_finish()
1081 dst_vb = v4l2_m2m_dst_buf_remove(curr_ctx->fh.m2m_ctx); in dw100_job_finish()
1091 dev_dbg(&dw_dev->pdev->dev, "Finishing transaction with%s error(s)\n", in dw100_job_finish()
1094 v4l2_m2m_job_finish(dw_dev->m2m_dev, curr_ctx->fh.m2m_ctx); in dw100_job_finish()
1114 dev_dbg(&dw_dev->pdev->dev, "%sable master bus\n", in _dw100_hw_set_master_bus_enable()
1143 dev_dbg(&dw_dev->pdev->dev, "Starting Hardware CTRL:0x%08x\n", val); in dw100_hw_dewarp_start()
1193 dev_dbg(&dw_dev->pdev->dev, "Setting scale factor to %u\n", scale); in dw100_hw_set_scale()
1202 dev_dbg(&dw_dev->pdev->dev, "Setting ROI region to %u.%u\n", x, y); in dw100_hw_set_roi()
1213 const struct v4l2_rect *rect = &src_q_data->crop; in dw100_hw_set_src_crop()
1217 src_scale = (rect->width << 7) / src_q_data->pix_fmt.width; in dw100_hw_set_src_crop()
1220 qscale = (dst_q_data->pix_fmt.width << 7) / src_q_data->pix_fmt.width; in dw100_hw_set_src_crop()
1222 left_scale = ((rect->left << 7) * qscale) >> 14; in dw100_hw_set_src_crop()
1223 top_scale = ((rect->top << 7) * qscale) >> 14; in dw100_hw_set_src_crop()
1233 const struct dw100_fmt *fmt = q_data->fmt; in dw100_hw_set_source()
1237 width = q_data->pix_fmt.width; in dw100_hw_set_source()
1238 height = q_data->pix_fmt.height; in dw100_hw_set_source()
1239 stride = q_data->pix_fmt.plane_fmt[0].bytesperline; in dw100_hw_set_source()
1240 fourcc = q_data->fmt->fourcc; in dw100_hw_set_source()
1242 if (q_data->pix_fmt.num_planes == 2) in dw100_hw_set_source()
1247 dev_dbg(&dw_dev->pdev->dev, in dw100_hw_set_source()
1248 "Set HW source registers for %ux%u - stride %u, pixfmt: %p4cc, dma:%pad\n", in dw100_hw_set_source()
1255 val |= DW100_DEWARP_CTRL_INPUT_FORMAT(fmt->reg_format); in dw100_hw_set_source()
1266 if (fmt->reg_swap_uv && in dw100_hw_set_source()
1267 fmt->reg_format == DW100_DEWARP_CTRL_FORMAT_YUV422_PACKED) in dw100_hw_set_source()
1290 const struct dw100_fmt *fmt = q_data->fmt; in dw100_hw_set_destination()
1293 width = q_data->pix_fmt.width; in dw100_hw_set_destination()
1294 height = q_data->pix_fmt.height; in dw100_hw_set_destination()
1295 stride = q_data->pix_fmt.plane_fmt[0].bytesperline; in dw100_hw_set_destination()
1296 fourcc = fmt->fourcc; in dw100_hw_set_destination()
1299 size_y = q_data->pix_fmt.plane_fmt[0].sizeimage; in dw100_hw_set_destination()
1301 if (q_data->pix_fmt.num_planes == 2) { in dw100_hw_set_destination()
1303 size_uv = q_data->pix_fmt.plane_fmt[1].sizeimage; in dw100_hw_set_destination()
1307 if (fmt->reg_format == DW100_DEWARP_CTRL_FORMAT_YUV420_SP) in dw100_hw_set_destination()
1311 dev_dbg(&dw_dev->pdev->dev, in dw100_hw_set_destination()
1312 "Set HW destination registers for %ux%u - stride %u, pixfmt: %p4cc, dma:%pad\n", in dw100_hw_set_destination()
1319 val |= DW100_DEWARP_CTRL_OUTPUT_FORMAT(fmt->reg_format); in dw100_hw_set_destination()
1331 if (fmt->reg_swap_uv ^ in dw100_hw_set_destination()
1332 (ifmt->reg_swap_uv && ifmt->reg_format != in dw100_hw_set_destination()
1334 if (fmt->reg_format == DW100_DEWARP_CTRL_FORMAT_YUV422_PACKED) in dw100_hw_set_destination()
1358 dev_dbg(&dw_dev->pdev->dev, in dw100_hw_set_mapping()
1404 dev_dbg(&dw_dev->pdev->dev, "Frame done interrupt\n"); in dw100_irq_handler()
1411 dev_err(&dw_dev->pdev->dev, "Interrupt error: %#x\n", err_irqs); in dw100_irq_handler()
1426 struct dw100_device *dw_dev = ctx->dw_dev; in dw100_start()
1428 out_vb->sequence = in dw100_start()
1429 dw100_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)->sequence++; in dw100_start()
1430 in_vb->sequence = in dw100_start()
1431 dw100_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)->sequence++; in dw100_start()
1433 dev_dbg(&ctx->dw_dev->pdev->dev, in dw100_start()
1434 "Starting queues %p->%p, sequence %u->%u\n", in dw100_start()
1435 v4l2_m2m_get_vq(ctx->fh.m2m_ctx, in dw100_start()
1437 v4l2_m2m_get_vq(ctx->fh.m2m_ctx, in dw100_start()
1439 in_vb->sequence, out_vb->sequence); in dw100_start()
1447 dw100_hw_set_src_crop(dw_dev, &ctx->q_data[DW100_QUEUE_SRC], in dw100_start()
1448 &ctx->q_data[DW100_QUEUE_DST]); in dw100_start()
1449 dw100_hw_set_source(dw_dev, &ctx->q_data[DW100_QUEUE_SRC], in dw100_start()
1450 &in_vb->vb2_buf); in dw100_start()
1451 dw100_hw_set_destination(dw_dev, &ctx->q_data[DW100_QUEUE_DST], in dw100_start()
1452 ctx->q_data[DW100_QUEUE_SRC].fmt, in dw100_start()
1453 &out_vb->vb2_buf); in dw100_start()
1454 dw100_hw_set_mapping(dw_dev, ctx->map_dma, in dw100_start()
1455 ctx->map_width, ctx->map_height); in dw100_start()
1468 src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); in dw100_device_run()
1469 dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); in dw100_device_run()
1480 struct video_device *vfd = &dw_dev->vfd; in dw100_init_video_device()
1482 vfd->vfl_dir = VFL_DIR_M2M; in dw100_init_video_device()
1483 vfd->fops = &dw100_fops; in dw100_init_video_device()
1484 vfd->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; in dw100_init_video_device()
1485 vfd->ioctl_ops = &dw100_ioctl_ops; in dw100_init_video_device()
1486 vfd->minor = -1; in dw100_init_video_device()
1487 vfd->release = video_device_release_empty; in dw100_init_video_device()
1488 vfd->v4l2_dev = &dw_dev->v4l2_dev; in dw100_init_video_device()
1489 vfd->lock = &dw_dev->vfd_mutex; in dw100_init_video_device()
1491 strscpy(vfd->name, DRV_NAME, sizeof(vfd->name)); in dw100_init_video_device()
1492 mutex_init(vfd->lock); in dw100_init_video_device()
1500 struct dw100_device *dw_dev = m->private; in dw100_dump_regs_show()
1503 ret = pm_runtime_resume_and_get(&dw_dev->pdev->dev); in dw100_dump_regs_show()
1509 pm_runtime_put_sync(&dw_dev->pdev->dev); in dw100_dump_regs_show()
1517 dw_dev->debugfs_root = in dw100_debugfs_init()
1518 debugfs_create_dir(dev_name(&dw_dev->pdev->dev), NULL); in dw100_debugfs_init()
1520 debugfs_create_file("dump_regs", 0600, dw_dev->debugfs_root, dw_dev, in dw100_debugfs_init()
1526 debugfs_remove_recursive(dw_dev->debugfs_root); in dw100_debugfs_exit()
1535 dw_dev = devm_kzalloc(&pdev->dev, sizeof(*dw_dev), GFP_KERNEL); in dw100_probe()
1537 return -ENOMEM; in dw100_probe()
1538 dw_dev->pdev = pdev; in dw100_probe()
1540 ret = devm_clk_bulk_get_all(&pdev->dev, &dw_dev->clks); in dw100_probe()
1542 dev_err(&pdev->dev, "Unable to get clocks: %d\n", ret); in dw100_probe()
1545 dw_dev->num_clks = ret; in dw100_probe()
1547 dw_dev->mmio = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); in dw100_probe()
1548 if (IS_ERR(dw_dev->mmio)) in dw100_probe()
1549 return PTR_ERR(dw_dev->mmio); in dw100_probe()
1557 pm_runtime_enable(&pdev->dev); in dw100_probe()
1558 ret = pm_runtime_resume_and_get(&pdev->dev); in dw100_probe()
1560 dev_err(&pdev->dev, "Unable to resume the device: %d\n", ret); in dw100_probe()
1564 pm_runtime_put_sync(&pdev->dev); in dw100_probe()
1566 ret = devm_request_irq(&pdev->dev, irq, dw100_irq_handler, IRQF_ONESHOT, in dw100_probe()
1567 dev_name(&pdev->dev), dw_dev); in dw100_probe()
1569 dev_err(&pdev->dev, "Failed to request irq: %d\n", ret); in dw100_probe()
1573 ret = v4l2_device_register(&pdev->dev, &dw_dev->v4l2_dev); in dw100_probe()
1579 dw_dev->m2m_dev = v4l2_m2m_init(&dw100_m2m_ops); in dw100_probe()
1580 if (IS_ERR(dw_dev->m2m_dev)) { in dw100_probe()
1581 dev_err(&pdev->dev, "Failed to init mem2mem device\n"); in dw100_probe()
1582 ret = PTR_ERR(dw_dev->m2m_dev); in dw100_probe()
1586 dw_dev->mdev.dev = &pdev->dev; in dw100_probe()
1587 strscpy(dw_dev->mdev.model, "dw100", sizeof(dw_dev->mdev.model)); in dw100_probe()
1588 media_device_init(&dw_dev->mdev); in dw100_probe()
1589 dw_dev->v4l2_dev.mdev = &dw_dev->mdev; in dw100_probe()
1591 ret = video_register_device(vfd, VFL_TYPE_VIDEO, -1); in dw100_probe()
1593 dev_err(&pdev->dev, "Failed to register video device\n"); in dw100_probe()
1597 ret = v4l2_m2m_register_media_controller(dw_dev->m2m_dev, vfd, in dw100_probe()
1600 dev_err(&pdev->dev, "Failed to init mem2mem media controller\n"); in dw100_probe()
1604 ret = media_device_register(&dw_dev->mdev); in dw100_probe()
1606 dev_err(&pdev->dev, "Failed to register mem2mem media device\n"); in dw100_probe()
1612 dev_info(&pdev->dev, in dw100_probe()
1613 "dw100 v4l2 m2m registered as /dev/video%u\n", vfd->num); in dw100_probe()
1618 v4l2_m2m_unregister_media_controller(dw_dev->m2m_dev); in dw100_probe()
1622 media_device_cleanup(&dw_dev->mdev); in dw100_probe()
1623 v4l2_m2m_release(dw_dev->m2m_dev); in dw100_probe()
1625 v4l2_device_unregister(&dw_dev->v4l2_dev); in dw100_probe()
1627 pm_runtime_disable(&pdev->dev); in dw100_probe()
1638 pm_runtime_disable(&pdev->dev); in dw100_remove()
1640 media_device_unregister(&dw_dev->mdev); in dw100_remove()
1641 v4l2_m2m_unregister_media_controller(dw_dev->m2m_dev); in dw100_remove()
1642 media_device_cleanup(&dw_dev->mdev); in dw100_remove()
1644 video_unregister_device(&dw_dev->vfd); in dw100_remove()
1645 mutex_destroy(dw_dev->vfd.lock); in dw100_remove()
1646 v4l2_m2m_release(dw_dev->m2m_dev); in dw100_remove()
1647 v4l2_device_unregister(&dw_dev->v4l2_dev); in dw100_remove()
1654 clk_bulk_disable_unprepare(dw_dev->num_clks, dw_dev->clks); in dw100_runtime_suspend()
1664 ret = clk_bulk_prepare_enable(dw_dev->num_clks, dw_dev->clks); in dw100_runtime_resume()
1682 { .compatible = "nxp,imx8mp-dw100", .data = NULL },