From 3b4779dbfcedffb0b1edb294a10458dcb51a44a6 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Tue, 9 Apr 2024 09:20:15 +0800 Subject: [PATCH] media: rockchip: isp: default readback mode for multi sensor Change-Id: Iebbdae5c88ccb8b50593e25684fb7874a77310b1 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/csi.c | 8 +++++-- drivers/media/platform/rockchip/isp/rkisp.c | 26 ++++++++++----------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 67a77c5de21a..f4b0646d610f 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -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 */ diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 0a82e3505a16..0e4be199fb64 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -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; }