media: rockchip: isp: support iq feature setting

Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
Change-Id: I870a6f5a54495eb537f32515aec28dfd8ec52f3d
This commit is contained in:
Hu Kejun
2020-12-21 16:15:38 +08:00
parent 39c34fb4bc
commit cd941afca7
4 changed files with 62 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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