From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/media/platform/rockchip/cif/subdev-itf.c | 62 +++++++++++++++++++++++-------- 1 files changed, 46 insertions(+), 16 deletions(-) diff --git a/kernel/drivers/media/platform/rockchip/cif/subdev-itf.c b/kernel/drivers/media/platform/rockchip/cif/subdev-itf.c index 7f850cc..01aefd4 100644 --- a/kernel/drivers/media/platform/rockchip/cif/subdev-itf.c +++ b/kernel/drivers/media/platform/rockchip/cif/subdev-itf.c @@ -342,7 +342,10 @@ mode = (struct rkisp_vicap_mode *)arg; memcpy(&priv->mode, mode, sizeof(*mode)); sditf_reinit_mode(priv, &priv->mode); - mode->input.merge_num = cif_dev->sditf_cnt; + if (priv->is_combine_mode) + mode->input.merge_num = cif_dev->sditf_cnt; + else + mode->input.merge_num = 1; mode->input.index = priv->combine_index; return 0; case RKISP_VICAP_CMD_INIT_BUF: @@ -430,6 +433,7 @@ static int sditf_channel_enable(struct sditf_priv *priv, int user) { struct rkcif_device *cif_dev = priv->cif_dev; + struct rkmodule_capture_info *capture_info = &cif_dev->channels[0].capture_info; unsigned int ch0 = 0, ch1 = 0, ch2 = 0; unsigned int ctrl_val = 0; unsigned int int_en = 0; @@ -437,11 +441,25 @@ unsigned int offset_y = 0; unsigned int width = priv->cap_info.width; unsigned int height = priv->cap_info.height; + int csi_idx = cif_dev->csi_host_idx; + + if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE && + priv->toisp_inf.link_mode == TOISP_UNITE) { + if (capture_info->multi_dev.dev_num != 2 || + capture_info->multi_dev.pixel_offset != RKMOUDLE_UNITE_EXTEND_PIXEL) { + v4l2_err(&cif_dev->v4l2_dev, + "param error of online mode, combine dev num %d, offset %d\n", + capture_info->multi_dev.dev_num, + capture_info->multi_dev.pixel_offset); + return -EINVAL; + } + csi_idx = capture_info->multi_dev.dev_idx[user]; + } if (priv->hdr_cfg.hdr_mode == NO_HDR || priv->hdr_cfg.hdr_mode == HDR_COMPR) { if (cif_dev->inf_id == RKCIF_MIPI_LVDS) - ch0 = cif_dev->csi_host_idx * 4; + ch0 = csi_idx * 4; else ch0 = 24;//dvp ctrl_val = (ch0 << 3) | 0x1; @@ -496,7 +514,10 @@ } } else { if (priv->toisp_inf.link_mode == TOISP_UNITE) { - offset_x = priv->cap_info.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL; + if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) + offset_x = 0; + else + offset_x = priv->cap_info.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL; width = priv->cap_info.width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; } rkcif_write_register(cif_dev, CIF_REG_TOISP1_CTRL, ctrl_val); @@ -606,36 +627,39 @@ struct rkcif_device *cif_dev = priv->cif_dev; struct v4l2_subdev_format fmt; unsigned int mode = RKCIF_STREAM_MODE_TOISP; + int ret = 0; sditf_check_capture_mode(cif_dev); sditf_get_set_fmt(&priv->sd, NULL, &fmt); if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE) { if (priv->toisp_inf.link_mode == TOISP0) { - sditf_channel_enable(priv, 0); + ret = sditf_channel_enable(priv, 0); } else if (priv->toisp_inf.link_mode == TOISP1) { - sditf_channel_enable(priv, 1); + ret = sditf_channel_enable(priv, 1); } else if (priv->toisp_inf.link_mode == TOISP_UNITE) { - sditf_channel_enable(priv, 0); - sditf_channel_enable(priv, 1); + ret = sditf_channel_enable(priv, 0); + ret |= sditf_channel_enable(priv, 1); } mode = RKCIF_STREAM_MODE_TOISP; } else if (priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AUTO) { mode = RKCIF_STREAM_MODE_TOISP_RDBK; } + if (ret) + return ret; if (priv->hdr_cfg.hdr_mode == NO_HDR || priv->hdr_cfg.hdr_mode == HDR_COMPR) { - rkcif_do_start_stream(&cif_dev->stream[0], mode); + ret = rkcif_do_start_stream(&cif_dev->stream[0], mode); } else if (priv->hdr_cfg.hdr_mode == HDR_X2) { - rkcif_do_start_stream(&cif_dev->stream[0], mode); - rkcif_do_start_stream(&cif_dev->stream[1], mode); + ret = rkcif_do_start_stream(&cif_dev->stream[0], mode); + ret |= rkcif_do_start_stream(&cif_dev->stream[1], mode); } else if (priv->hdr_cfg.hdr_mode == HDR_X3) { - rkcif_do_start_stream(&cif_dev->stream[0], mode); - rkcif_do_start_stream(&cif_dev->stream[1], mode); - rkcif_do_start_stream(&cif_dev->stream[2], mode); + ret = rkcif_do_start_stream(&cif_dev->stream[0], mode); + ret |= rkcif_do_start_stream(&cif_dev->stream[1], mode); + ret |= rkcif_do_start_stream(&cif_dev->stream[2], mode); } INIT_LIST_HEAD(&priv->buf_free_list); - return 0; + return ret; } static int sditf_stop_stream(struct sditf_priv *priv) @@ -697,6 +721,8 @@ } } + if (on && ret) + atomic_dec(&priv->stream_cnt); return ret; } @@ -724,6 +750,7 @@ } else { v4l2_pipeline_pm_put(&node->vdev.entity); pm_runtime_put_sync(cif_dev->dev); + priv->mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ; } v4l2_info(&node->vdev, "s_power %d, entity use_count %d\n", on, node->vdev.entity.use_count); @@ -779,10 +806,11 @@ return -EINVAL; rx_buf = to_cif_rx_buf(dbufs); - + v4l2_dbg(rkcif_debug, 3, &cif_dev->v4l2_dev, "buf back to vicap 0x%x\n", + (u32)rx_buf->dummy.dma_addr); spin_lock_irqsave(&stream->vbq_lock, flags); - stream->buf_num_toisp++; stream->last_rx_buf_idx = dbufs->sequence + 1; + atomic_inc(&stream->buf_cnt); if (!list_empty(&stream->rx_buf_head) && cif_dev->is_thunderboot && @@ -791,6 +819,8 @@ spin_lock_irqsave(&cif_dev->buffree_lock, buffree_flags); list_add_tail(&rx_buf->list_free, &priv->buf_free_list); spin_unlock_irqrestore(&cif_dev->buffree_lock, buffree_flags); + atomic_dec(&stream->buf_cnt); + stream->total_buf_num--; schedule_work(&priv->buffree_work.work); is_free = true; } -- Gitblit v1.6.2