From c2af7fd006372edb7cb66bc36f0ba76cbd7728cd Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 12 Oct 2022 15:42:50 +0800 Subject: [PATCH] media: rockchip: isp: multi sensor for fast case Change-Id: I47399e80066ff64fe39b026da070c64ffab0c43e Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 3 ++ .../media/platform/rockchip/isp/capture_v32.c | 5 ++ drivers/media/platform/rockchip/isp/csi.c | 2 +- drivers/media/platform/rockchip/isp/hw.c | 50 ++++++++++++------- drivers/media/platform/rockchip/isp/hw.h | 1 + drivers/media/platform/rockchip/isp/rkisp.c | 4 +- 6 files changed, 43 insertions(+), 22 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 9ba1ec1b015a..7bb7a8f6cd67 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1561,6 +1561,9 @@ static void rkisp_stream_fast(struct work_struct *work) ispdev->is_thunderboot = false; return; } + + if (ispdev->hw_dev->dev_num > 1) + ispdev->hw_dev->is_single = false; ispdev->is_pre_on = true; ispdev->is_rdbk_auto = true; ispdev->pipe.open(&ispdev->pipe, &stream->vnode.vdev.entity, true); diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 2b33bbb951e9..bcf6a301d14e 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1645,6 +1645,11 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) int ret = -EINVAL; mutex_lock(&dev->hw_dev->dev_lock); + if (dev->is_pre_on && + !dev->hw_dev->is_single && + !atomic_read(&dev->hw_dev->refcnt) && + !atomic_read(&dev->cap_dev.refcnt)) + rkisp_hw_enum_isp_size(dev->hw_dev); v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n", __func__, node->vdev.name, stream->id); diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 9b3d5ca001c7..12ec032fd2c3 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -592,7 +592,7 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) if (dev->hdr.op_mode == HDR_NORMAL || dev->hdr.op_mode == HDR_COMPR) dev->hdr.op_mode = HDR_RDBK_FRAME1; - if (dev->isp_inp == INP_CIF && dev->hw_dev->is_single && dev->isp_ver > ISP_V21) + if (dev->isp_inp == INP_CIF && dev->isp_ver > ISP_V21) mode.rdbk_mode = dev->is_rdbk_auto ? RKISP_VICAP_RDBK_AUTO : RKISP_VICAP_ONLINE; else mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ; diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index 65934f24a6e8..ee55ec87f7cd 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -990,28 +990,18 @@ static int __maybe_unused rkisp_runtime_suspend(struct device *dev) return pinctrl_pm_select_sleep_state(dev); } -static int __maybe_unused rkisp_runtime_resume(struct device *dev) +void rkisp_hw_enum_isp_size(struct rkisp_hw_dev *hw_dev) { - struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); - void __iomem *base = hw_dev->base_addr; struct rkisp_device *isp; - int mult = hw_dev->is_unite ? 2 : 1; - int ret, i; + u32 w, h, i; - ret = pinctrl_pm_select_default_state(dev); - if (ret < 0) - return ret; - - enable_sys_clk(hw_dev); memset(hw_dev->isp_size, 0, sizeof(hw_dev->isp_size)); if (!hw_dev->max_in.is_fix) { hw_dev->max_in.w = 0; hw_dev->max_in.h = 0; } + hw_dev->dev_link_num = 0; for (i = 0; i < hw_dev->dev_num; i++) { - void *buf; - u32 w, h; - isp = hw_dev->isp[i]; if (!isp || (isp && !isp->is_hw_link)) continue; @@ -1030,6 +1020,33 @@ static int __maybe_unused rkisp_runtime_resume(struct device *dev) if (hw_dev->max_in.h < h) hw_dev->max_in.h = h; } + } + for (i = 0; i < hw_dev->dev_num; i++) { + isp = hw_dev->isp[i]; + if (!isp || (isp && !isp->is_hw_link)) + continue; + rkisp_params_check_bigmode(&isp->params_vdev); + } +} + +static int __maybe_unused rkisp_runtime_resume(struct device *dev) +{ + struct rkisp_hw_dev *hw_dev = dev_get_drvdata(dev); + void __iomem *base = hw_dev->base_addr; + struct rkisp_device *isp; + int mult = hw_dev->is_unite ? 2 : 1; + int ret, i; + void *buf; + + ret = pinctrl_pm_select_default_state(dev); + if (ret < 0) + return ret; + + enable_sys_clk(hw_dev); + for (i = 0; i < hw_dev->dev_num; i++) { + isp = hw_dev->isp[i]; + if (!isp) + continue; buf = isp->sw_base_addr; memset(buf, 0, RKISP_ISP_SW_MAX_SIZE * mult); memcpy_fromio(buf, base, RKISP_ISP_SW_REG_SIZE); @@ -1040,12 +1057,7 @@ static int __maybe_unused rkisp_runtime_resume(struct device *dev) } default_sw_reg_flag(hw_dev->isp[i]); } - for (i = 0; i < hw_dev->dev_num; i++) { - isp = hw_dev->isp[i]; - if (!isp || (isp && !isp->is_hw_link)) - continue; - rkisp_params_check_bigmode(&isp->params_vdev); - } + rkisp_hw_enum_isp_size(hw_dev); hw_dev->monitor.is_en = rkisp_monitor; return 0; } diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h index 28ee8c441a29..478d8b37542d 100644 --- a/drivers/media/platform/rockchip/isp/hw.h +++ b/drivers/media/platform/rockchip/isp/hw.h @@ -104,4 +104,5 @@ struct rkisp_hw_dev { int rkisp_register_irq(struct rkisp_hw_dev *dev); void rkisp_soft_reset(struct rkisp_hw_dev *dev, bool is_secure); +void rkisp_hw_enum_isp_size(struct rkisp_hw_dev *hw_dev); #endif diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 6b7d5b4b22bf..39e5f2ba4d6c 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -805,9 +805,9 @@ static void rkisp_rdbk_trigger_handle(struct rkisp_device *dev, u32 cmd) goto end; if (max) { - v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev, - "trigger fifo len:%d\n", max); isp = hw->isp[id]; + v4l2_dbg(2, rkisp_debug, &isp->v4l2_dev, + "trigger fifo len:%d\n", max); rkisp_rdbk_trigger_event(isp, T_CMD_DEQUEUE, &t); isp->dmarx_dev.pre_frame = isp->dmarx_dev.cur_frame; if (t.frame_id > isp->dmarx_dev.pre_frame.id &&