media: rockchip: isp: default readback mode for multi sensor

Change-Id: Iebbdae5c88ccb8b50593e25684fb7874a77310b1
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2024-04-09 09:20:15 +08:00
parent 1aef9b5255
commit 3b4779dbfc
2 changed files with 18 additions and 16 deletions

View File

@@ -561,10 +561,14 @@ 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->isp_ver > ISP_V21)
if (dev->isp_inp == INP_CIF && dev->isp_ver > ISP_V21) {
/* read back mode default if more sensor link to isp */
if (dev->hw_dev->dev_link_num > 1)
dev->is_rdbk_auto = true;
mode.rdbk_mode = dev->is_rdbk_auto ? RKISP_VICAP_RDBK_AUTO : RKISP_VICAP_ONLINE;
else
} else {
mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ;
}
v4l2_subdev_call(mipi_sensor, core, ioctl, RKISP_VICAP_CMD_MODE, &mode);
dev->vicap_in = mode.input;
/* vicap direct to isp */

View File

@@ -2144,6 +2144,7 @@ end:
/* Mess register operations to start isp */
static int rkisp_isp_start(struct rkisp_device *dev)
{
struct rkisp_hw_dev *hw = dev->hw_dev;
struct rkisp_sensor_info *sensor = dev->active_sensor;
void __iomem *base = dev->base_addr;
bool is_direct = true;
@@ -2151,8 +2152,7 @@ static int rkisp_isp_start(struct rkisp_device *dev)
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
"%s refcnt:%d link_num:%d\n", __func__,
atomic_read(&dev->hw_dev->refcnt),
dev->hw_dev->dev_link_num);
atomic_read(&hw->refcnt), hw->dev_link_num);
dev->cap_dev.is_done_early = false;
if (dev->cap_dev.wait_line >= dev->isp_sdev.out_crop.height)
@@ -2196,8 +2196,10 @@ static int rkisp_isp_start(struct rkisp_device *dev)
CIF_ISP_CTRL_ISP_INFORM_ENABLE | CIF_ISP_CTRL_ISP_CFG_UPD_PERMANENT;
if (dev->isp_ver == ISP_V20)
val |= NOC_HURRY_PRIORITY(2) | NOC_HURRY_W_MODE(2) | NOC_HURRY_R_MODE(1);
if (atomic_read(&dev->hw_dev->refcnt) > 1)
if (atomic_read(&hw->refcnt) > 1)
is_direct = false;
else
hw->cur_dev_id = dev->dev_id;
rkisp_unite_write(dev, CIF_ISP_CTRL, val, is_direct);
rkisp_clear_reg_cache_bits(dev, CIF_ISP_CTRL, CIF_ISP_CTRL_ISP_CFG_UPD);
@@ -2206,21 +2208,14 @@ static int rkisp_isp_start(struct rkisp_device *dev)
dev->irq_ends_mask |= ISP_FRAME_END;
dev->irq_ends = 0;
/* XXX: Is the 1000us too long?
* CIF spec says to wait for sufficient time after enabling
* the MIPI interface and before starting the sensor output.
*/
if (dev->hw_dev->is_single)
usleep_range(1000, 1200);
v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev,
"%s MI_CTRL 0x%08x ISP_CTRL 0x%08x\n", __func__,
readl(base + CIF_MI_CTRL), readl(base + CIF_ISP_CTRL));
if (dev->hw_dev->monitor.is_en && atomic_read(&dev->hw_dev->refcnt) < 2) {
dev->hw_dev->monitor.retry = 0;
dev->hw_dev->monitor.state = ISP_FRAME_END;
schedule_work(&dev->hw_dev->monitor.work);
if (hw->monitor.is_en && atomic_read(&hw->refcnt) < 2) {
hw->monitor.retry = 0;
hw->monitor.state = ISP_FRAME_END;
schedule_work(&hw->monitor.work);
}
return 0;
}
@@ -2670,6 +2665,9 @@ static void rkisp_isp_sd_try_crop(struct v4l2_subdev *sd,
case ISP_V32_L:
size = CIF_ISP_INPUT_W_MAX_V32_L * CIF_ISP_INPUT_H_MAX_V32_L;
break;
case ISP_V39:
size = CIF_ISP_INPUT_W_MAX_V39 * CIF_ISP_INPUT_H_MAX_V39;
break;
default:
return;
}