From cd941afca707c516f35ef1fd6ddeb8c4c11141c0 Mon Sep 17 00:00:00 2001 From: Hu Kejun Date: Mon, 21 Dec 2020 16:15:38 +0800 Subject: [PATCH] media: rockchip: isp: support iq feature setting Signed-off-by: Hu Kejun Change-Id: I870a6f5a54495eb537f32515aec28dfd8ec52f3d --- drivers/media/platform/rockchip/isp/csi.c | 27 +++++++++++++++++++ drivers/media/platform/rockchip/isp/hw.c | 6 +++++ drivers/media/platform/rockchip/isp/hw.h | 3 +++ .../platform/rockchip/isp/isp_params_v21.c | 26 ++++++++++++++++++ 4 files changed, 62 insertions(+) diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index 5481e833e335..4e171f82de3a 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -269,6 +269,8 @@ static int csi_config(struct rkisp_csi_device *csi) rkisp_read(dev, CIF_ISP_CSI0_DATA_IDS_1, true), rkisp_read(dev, CIF_ISP_CSI0_MASK3, true)); } else if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) { + bool is_feature_on = dev->hw_dev->is_feature_on; + u64 iq_feature = dev->hw_dev->iq_feature; struct rkmodule_hdr_cfg hdr_cfg; u32 val; @@ -338,6 +340,12 @@ static int csi_config(struct rkisp_csi_device *csi) default: val = 0; } + if (is_feature_on) { + if ((ISP2X_MODULE_HDRMGE & ~iq_feature) && (val & SW_HDRMGE_EN)) { + v4l2_err(&dev->v4l2_dev, "hdrmge is not supported\n"); + return -EINVAL; + } + } rkisp_write(dev, ISP_HDRMGE_BASE, val, false); v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, @@ -398,6 +406,8 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) { int val = 0, ret = 0; struct v4l2_subdev *mipi_sensor; + bool is_feature_on = dev->hw_dev->is_feature_on; + u64 iq_feature = dev->hw_dev->iq_feature; if (dev->isp_inp & INP_CSI) { dev->hw_dev->mipi_dev_id = dev->dev_id; @@ -444,6 +454,13 @@ int rkisp_csi_config_patch(struct rkisp_device *dev) if (!dev->hw_dev->is_mi_update) rkisp_write(dev, CSI2RX_CTRL0, SW_IBUF_OP_MODE(dev->hdr.op_mode), true); + + if (is_feature_on) { + if ((ISP2X_MODULE_HDRMGE & ~iq_feature) && (val & SW_HDRMGE_EN)) { + v4l2_err(&dev->v4l2_dev, "hdrmge is not supported\n"); + return -EINVAL; + } + } rkisp_write(dev, ISP_HDRMGE_BASE, val, false); rkisp_write(dev, CSI2RX_MASK_STAT, 0x7FFFFF7F, true); } @@ -470,6 +487,8 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) struct rkisp_hw_dev *hw = dev->hw_dev; struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev; u32 val, cur_frame_id, tmp, rd_mode; + bool is_feature_on = hw->is_feature_on; + u64 iq_feature = hw->iq_feature; bool is_upd = false; if (dev->isp_ver == ISP_V21) @@ -499,6 +518,14 @@ void rkisp_trigger_read_back(struct rkisp_csi_device *csi, u8 dma2frm, u32 mode) rd_mode = csi->rd_mode; val = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf; } + + if (is_feature_on) { + if ((ISP2X_MODULE_HDRMGE & ~iq_feature) && (val & SW_HDRMGE_EN)) { + v4l2_err(&dev->v4l2_dev, "hdrmge is not supported\n"); + return; + } + } + tmp = rkisp_read(dev, ISP_HDRMGE_BASE, false) & 0xf; if (val != tmp) { rkisp_write(dev, ISP_HDRMGE_BASE, val, false); diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index 4d5b73ebf8ce..970e7d7034b7 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -688,6 +688,12 @@ static int rkisp_hw_probe(struct platform_device *pdev) hw_dev->reset = NULL; } + ret = of_property_read_u64(node, "rockchip,iq-feature", &hw_dev->iq_feature); + if (!ret) + hw_dev->is_feature_on = true; + else + hw_dev->is_feature_on = false; + hw_dev->dev_num = 0; hw_dev->cur_dev_id = 0; hw_dev->mipi_dev_id = 0; diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h index 9e6c6550c47a..212512a27187 100644 --- a/drivers/media/platform/rockchip/isp/hw.h +++ b/drivers/media/platform/rockchip/isp/hw.h @@ -60,6 +60,9 @@ struct rkisp_hw_dev { bool is_single; bool is_mi_update; bool is_thunderboot; + + bool is_feature_on; + u64 iq_feature; }; int rkisp_register_irq(struct rkisp_hw_dev *dev); diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index fa0a8cf65d33..eb1512296c00 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -3422,11 +3422,24 @@ void __isp_isr_other_config(struct rkisp_isp_params_vdev *params_vdev, (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops; struct rkisp_isp_params_val_v21 *priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + struct rkisp_device *ispdev = params_vdev->dev; + bool is_feature_on = ispdev->hw_dev->is_feature_on; + u64 iq_feature = ispdev->hw_dev->iq_feature; module_en_update = new_params->module_en_update; module_cfg_update = new_params->module_cfg_update; module_ens = new_params->module_ens; + if (is_feature_on) { + module_en_update &= ~ISP2X_MODULE_HDRMGE; + if (module_en_update & ~iq_feature) { + dev_err(ispdev->dev, + "some iq features(0x%llx, 0x%llx) are not supported\n", + module_en_update, iq_feature); + module_en_update &= iq_feature; + } + } + if (type == RKISP_PARAMS_SHD) { if ((module_en_update & ISP2X_MODULE_HDRMGE) || (module_cfg_update & ISP2X_MODULE_HDRMGE)) { @@ -3701,6 +3714,9 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev, u64 module_en_update, module_cfg_update, module_ens; struct rkisp_isp_params_v21_ops *ops = (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops; + struct rkisp_device *ispdev = params_vdev->dev; + bool is_feature_on = ispdev->hw_dev->is_feature_on; + u64 iq_feature = ispdev->hw_dev->iq_feature; if (type == RKISP_PARAMS_SHD) return; @@ -3709,6 +3725,16 @@ void __isp_isr_meas_config(struct rkisp_isp_params_vdev *params_vdev, module_cfg_update = new_params->module_cfg_update; module_ens = new_params->module_ens; + if (is_feature_on) { + module_en_update &= ~ISP2X_MODULE_HDRMGE; + if (module_en_update & ~iq_feature) { + dev_err(ispdev->dev, + "some iq features(0x%llx, 0x%llx) are not supported\n", + module_en_update, iq_feature); + module_en_update &= iq_feature; + } + } + if ((module_en_update & ISP2X_MODULE_RAWAE0) || (module_cfg_update & ISP2X_MODULE_RAWAE0)) { if ((module_cfg_update & ISP2X_MODULE_RAWAE0))