28.04.2020 07:20, Sowjanya Komatineni пишет: > diff --git a/drivers/staging/media/tegra-video/csi.c b/drivers/staging/media/tegra-video/csi.c > index b3dd0c3..29ccdae 100644 > --- a/drivers/staging/media/tegra-video/csi.c > +++ b/drivers/staging/media/tegra-video/csi.c > @@ -272,8 +272,25 @@ static int tegra_csi_s_stream(struct v4l2_subdev *subdev, int enable) > struct tegra_vi_channel *chan = v4l2_get_subdev_hostdata(subdev); > struct tegra_csi_channel *csi_chan = to_csi_chan(subdev); > struct tegra_csi *csi = csi_chan->csi; > + int ret; > + > + if (enable && atomic_add_return(1, &csi->clk_refcnt) == 1) { > + ret = pm_runtime_get_sync(csi->dev); > + if (ret < 0) { > + dev_err(csi->dev, > + "failed to get runtime PM: %d\n", ret); > + pm_runtime_put_noidle(csi->dev); > + atomic_dec(&csi->clk_refcnt); > + return ret; > + } > + } > + > + ret = csi->ops->csi_streaming(csi_chan, chan->pg_mode, enable); > > - return csi->ops->csi_streaming(csi_chan, chan->pg_mode, enable); > + if ((ret < 0 || !enable) && atomic_dec_and_test(&csi->clk_refcnt)) > + pm_runtime_put_sync(csi->dev); Runtime PM maintains its own refcount, why these clk_refcnt/power_on_refcnt are needed?