mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
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:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
Reference in New Issue
Block a user