diff --git a/drivers/media/platform/rockchip/cif/subdev-itf.c b/drivers/media/platform/rockchip/cif/subdev-itf.c index 3202f5e03720..72b5f39275a7 100644 --- a/drivers/media/platform/rockchip/cif/subdev-itf.c +++ b/drivers/media/platform/rockchip/cif/subdev-itf.c @@ -548,6 +548,12 @@ static int sditf_s_stream(struct v4l2_subdev *sd, int on) struct rkcif_device *cif_dev = priv->cif_dev; int ret = 0; + if (!on && atomic_dec_return(&priv->stream_cnt)) + return 0; + + if (on && atomic_inc_return(&priv->stream_cnt) > 1) + return 0; + if (cif_dev->chip_id >= CHIP_RK3588_CIF) { if (priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AIQ) return 0; @@ -571,6 +577,12 @@ static int sditf_s_power(struct v4l2_subdev *sd, int on) struct rkcif_device *cif_dev = priv->cif_dev; int ret = 0; + if (!on && atomic_dec_return(&priv->power_cnt)) + return 0; + + if (on && atomic_inc_return(&priv->power_cnt) > 1) + return 0; + if (cif_dev->chip_id >= CHIP_RK3588_CIF) { v4l2_dbg(3, rkcif_debug, &cif_dev->v4l2_dev, "%s, toisp mode %d, hdr %d, set power %d\n", @@ -981,6 +993,8 @@ static int rkcif_subdev_media_init(struct sditf_priv *priv) priv->toisp_inf.ch_info[2].is_valid = false; if (priv->is_combine_mode) sditf_subdev_notifier(priv); + atomic_set(&priv->power_cnt, 0); + atomic_set(&priv->stream_cnt, 0); return 0; } diff --git a/drivers/media/platform/rockchip/cif/subdev-itf.h b/drivers/media/platform/rockchip/cif/subdev-itf.h index e0701ffae824..965b79924b74 100644 --- a/drivers/media/platform/rockchip/cif/subdev-itf.h +++ b/drivers/media/platform/rockchip/cif/subdev-itf.h @@ -71,6 +71,8 @@ struct sditf_priv { int num_sensors; int combine_index; bool is_combine_mode; + atomic_t power_cnt; + atomic_t stream_cnt; }; extern struct platform_driver rkcif_subdev_driver;