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