media: rockchip: isp: fix enable function of ynr/cnr/bay3d/dhaz/adrc is not correct
Signed-off-by: Hu Kejun <william.hu@rock-chips.com> Change-Id: I53669722bf274a8188635b0642ee47c46766dd60
This commit is contained in:
parent
28df73073b
commit
492a0bda8d
4 changed files with 79 additions and 17 deletions
|
|
@ -343,6 +343,12 @@ void rkisp_params_set_ldchbuf_size(struct rkisp_isp_params_vdev *params_vdev,
|
|||
params_vdev->ops->set_ldchbuf_size(params_vdev, ldchsize);
|
||||
}
|
||||
|
||||
void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev)
|
||||
{
|
||||
if (params_vdev->ops->stream_stop)
|
||||
params_vdev->ops->stream_stop(params_vdev);
|
||||
}
|
||||
|
||||
int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev,
|
||||
struct v4l2_device *v4l2_dev,
|
||||
struct rkisp_device *dev)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ struct rkisp_isp_params_ops {
|
|||
struct rkisp_ldchbuf_info *ldchbuf);
|
||||
void (*set_ldchbuf_size)(struct rkisp_isp_params_vdev *params_vdev,
|
||||
struct rkisp_ldchbuf_size *ldchsize);
|
||||
void (*stream_stop)(struct rkisp_isp_params_vdev *params_vdev);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -97,5 +98,6 @@ void rkisp_params_get_ldchbuf_inf(struct rkisp_isp_params_vdev *params_vdev,
|
|||
struct rkisp_ldchbuf_info *ldchbuf);
|
||||
void rkisp_params_set_ldchbuf_size(struct rkisp_isp_params_vdev *params_vdev,
|
||||
struct rkisp_ldchbuf_size *ldchsize);
|
||||
void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev);
|
||||
|
||||
#endif /* _RKISP_ISP_PARAM_H */
|
||||
|
|
|
|||
|
|
@ -2552,9 +2552,14 @@ isp_hdrdrc_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
bool en)
|
||||
{
|
||||
u32 value;
|
||||
bool real_en;
|
||||
|
||||
value = rkisp_ioread32(params_vdev, ISP21_DRC_CTRL0);
|
||||
if (en && !(value & ISP_DRC_EN)) {
|
||||
real_en = !!(value & ISP_DRC_EN);
|
||||
if ((en && real_en) || (!en && !real_en))
|
||||
return;
|
||||
|
||||
if (en) {
|
||||
value |= ISP_DRC_EN;
|
||||
rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
|
||||
ISP2X_SYS_ADRC_FST, ISP2X_SYS_ADRC_FST, false);
|
||||
|
|
@ -2706,9 +2711,14 @@ isp_dhaz_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
bool en)
|
||||
{
|
||||
u32 value;
|
||||
bool real_en;
|
||||
|
||||
value = rkisp_ioread32(params_vdev, ISP21_DHAZ_CTRL);
|
||||
if (en && !(value & ISP_DHAZ_ENMUX)) {
|
||||
real_en = !!(value & ISP_DHAZ_ENMUX);
|
||||
if ((en && real_en) || (!en && !real_en))
|
||||
return;
|
||||
|
||||
if (en) {
|
||||
value |= ISP_DHAZ_ENMUX;
|
||||
rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
|
||||
ISP2X_SYS_DHAZ_FST, ISP2X_SYS_DHAZ_FST, false);
|
||||
|
|
@ -2949,6 +2959,7 @@ isp_ynr_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
bool en, const struct isp21_ynr_cfg *arg)
|
||||
{
|
||||
u32 ynr_ctrl, value = 0;
|
||||
bool real_en;
|
||||
|
||||
if (arg) {
|
||||
value = (arg->sw_ynr_thumb_mix_cur_en & 0x1) << 24 |
|
||||
|
|
@ -2963,7 +2974,11 @@ isp_ynr_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
}
|
||||
|
||||
ynr_ctrl = rkisp_ioread32(params_vdev, ISP21_YNR_GLOBAL_CTRL);
|
||||
if (en && !(ynr_ctrl & ISP21_YNR_EN)) {
|
||||
real_en = !!(ynr_ctrl & ISP21_YNR_EN);
|
||||
if ((en && real_en) || (!en && !real_en))
|
||||
return;
|
||||
|
||||
if (en) {
|
||||
value |= ISP21_YNR_EN;
|
||||
rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
|
||||
ISP2X_SYS_YNR_FST, ISP2X_SYS_YNR_FST, false);
|
||||
|
|
@ -3023,6 +3038,7 @@ isp_cnr_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
bool en, const struct isp21_cnr_cfg *arg)
|
||||
{
|
||||
u32 cnr_ctrl, value = 0;
|
||||
bool real_en;
|
||||
|
||||
if (arg) {
|
||||
value = (arg->sw_cnr_thumb_mix_cur_en & 0x1) << 4 |
|
||||
|
|
@ -3031,8 +3047,12 @@ isp_cnr_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
(arg->sw_cnr_exgain_bypass & 0x1) << 1;
|
||||
}
|
||||
|
||||
cnr_ctrl = rkisp_ioread32(params_vdev, ISP21_YNR_GLOBAL_CTRL);
|
||||
if (en && !(cnr_ctrl & ISP21_YNR_EN)) {
|
||||
cnr_ctrl = rkisp_ioread32(params_vdev, ISP21_CNR_CTRL);
|
||||
real_en = !!(cnr_ctrl & ISP21_CNR_EN);
|
||||
if ((en && real_en) || (!en && !real_en))
|
||||
return;
|
||||
|
||||
if (en) {
|
||||
value |= ISP21_CNR_EN;
|
||||
rkisp_set_bits(params_vdev->dev, ISP_CTRL1,
|
||||
ISP2X_SYS_CNR_FST, ISP2X_SYS_CNR_FST, false);
|
||||
|
|
@ -3253,10 +3273,8 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
bool en)
|
||||
{
|
||||
struct rkisp_device *ispdev = params_vdev->dev;
|
||||
struct rkisp_isp_subdev *isp_sdev = &ispdev->isp_sdev;
|
||||
struct rkisp_isp_params_val_v21 *priv_val;
|
||||
u32 value, bay3d_ctrl;
|
||||
int ret;
|
||||
|
||||
priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
|
||||
bay3d_ctrl = rkisp_ioread32(params_vdev, ISP21_BAY3D_CTRL);
|
||||
|
|
@ -3265,19 +3283,13 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev,
|
|||
return;
|
||||
|
||||
if (en) {
|
||||
u32 w = isp_sdev->in_crop.width;
|
||||
u32 h = isp_sdev->in_crop.height;
|
||||
u32 size = 2 * ALIGN((ALIGN(w, 16) + (w + 15) / 8) * h, 16);
|
||||
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
|
||||
priv_val->buf_3dnr.size = size;
|
||||
ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dnr);
|
||||
if (ret) {
|
||||
dev_err(ispdev->dev, "can not alloc buffer\n");
|
||||
if (!priv_val->buf_3dnr.size) {
|
||||
dev_err(ispdev->dev, "no bay3d buffer available\n");
|
||||
return;
|
||||
}
|
||||
|
||||
rkisp_iowrite32(params_vdev, size, ISP21_MI_BAY3D_WR_SIZE);
|
||||
value = priv_val->buf_3dnr.size;
|
||||
rkisp_iowrite32(params_vdev, value, ISP21_MI_BAY3D_WR_SIZE);
|
||||
value = priv_val->buf_3dnr.dma_addr;
|
||||
rkisp_iowrite32(params_vdev, value, ISP21_MI_BAY3D_WR_BASE);
|
||||
rkisp_iowrite32(params_vdev, value, ISP21_MI_BAY3D_RD_BASE);
|
||||
|
|
@ -3820,6 +3832,34 @@ void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
|||
¶ms_vdev->cur_lsccfg, true);
|
||||
}
|
||||
|
||||
static void
|
||||
rkisp_alloc_bay3d_buf(struct rkisp_isp_params_vdev *params_vdev,
|
||||
const struct isp21_isp_params_cfg *new_params)
|
||||
{
|
||||
struct rkisp_device *ispdev = params_vdev->dev;
|
||||
struct rkisp_isp_subdev *isp_sdev = &ispdev->isp_sdev;
|
||||
struct rkisp_isp_params_val_v21 *priv_val;
|
||||
u64 module_en_update, module_ens;
|
||||
u32 w, h, size;
|
||||
int ret;
|
||||
|
||||
module_en_update = new_params->module_en_update;
|
||||
module_ens = new_params->module_ens;
|
||||
|
||||
if ((module_en_update & ISP2X_MODULE_BAY3D) &&
|
||||
(module_ens & ISP2X_MODULE_BAY3D)) {
|
||||
w = isp_sdev->in_crop.width;
|
||||
h = isp_sdev->in_crop.height;
|
||||
size = 2 * ALIGN((ALIGN(w, 16) + (w + 15) / 8) * h, 16);
|
||||
priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
|
||||
priv_val->buf_3dnr.size = size;
|
||||
ret = rkisp_alloc_buffer(ispdev, &priv_val->buf_3dnr);
|
||||
if (ret)
|
||||
dev_err(ispdev->dev, "can not alloc bay3d buffer\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Not called when the camera active, thus not isr protection. */
|
||||
static void
|
||||
rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
||||
|
|
@ -3847,6 +3887,7 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
|||
priv_val->tmo_en = 0;
|
||||
priv_val->lsc_en = 0;
|
||||
priv_val->mge_en = 0;
|
||||
rkisp_alloc_bay3d_buf(params_vdev, params_vdev->isp21_params);
|
||||
__isp_isr_other_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
|
||||
__isp_isr_meas_config(params_vdev, params_vdev->isp21_params, RKISP_PARAMS_ALL);
|
||||
__preisp_isr_update_hdrae_para(params_vdev, params_vdev->isp21_params);
|
||||
|
|
@ -3966,6 +4007,16 @@ rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev,
|
|||
rkisp_init_ldch_buf(params_vdev, ldchsize);
|
||||
}
|
||||
|
||||
static void
|
||||
rkisp_params_stream_stop_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
||||
{
|
||||
struct rkisp_device *ispdev = params_vdev->dev;
|
||||
struct rkisp_isp_params_val_v21 *priv_val;
|
||||
|
||||
priv_val = (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr);
|
||||
}
|
||||
|
||||
/* Not called when the camera active, thus not isr protection. */
|
||||
static void
|
||||
rkisp_params_disable_isp_v2x(struct rkisp_isp_params_vdev *params_vdev)
|
||||
|
|
@ -4126,6 +4177,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
|
|||
.param_cfgsram = rkisp_params_cfgsram_v2x,
|
||||
.get_ldchbuf_inf = rkisp_params_get_ldchbuf_inf_v2x,
|
||||
.set_ldchbuf_size = rkisp_params_set_ldchbuf_size_v2x,
|
||||
.stream_stop = rkisp_params_stream_stop_v2x,
|
||||
};
|
||||
|
||||
int rkisp_init_params_vdev_v21(struct rkisp_isp_params_vdev *params_vdev)
|
||||
|
|
|
|||
|
|
@ -961,6 +961,8 @@ end:
|
|||
if (dev->hdr.sensor)
|
||||
dev->hdr.sensor = NULL;
|
||||
|
||||
rkisp_params_stream_stop(&dev->params_vdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue