media: rockchip: isp: multi sensor for fast case

Change-Id: I47399e80066ff64fe39b026da070c64ffab0c43e
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2022-10-12 15:42:50 +08:00
parent 2209baff7f
commit c2af7fd006
6 changed files with 43 additions and 22 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 &&