On Wed, 5 May 2021 11:42:08 +0200 Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx> wrote: > Currently, the driver just assumes that PM runtime logic > succeded resuming the device. > > That may not be the case, as pm_runtime_get_sync() > can fail (but keeping the usage count incremented). > > Replace the code to use pm_runtime_resume_and_get(), > and letting it return the error code. > > This way, if mtk_vcodec_dec_pw_on() fails, the logic > under fops_vcodec_open() will do the right thing and > return an error, instead of just assuming that the > device is ready to be used. > > Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > --- > drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 4 +++- > drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c | 8 +++++--- > drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h | 2 +- > 3 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c > index 147dfef1638d..f87dc47d9e63 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c > @@ -126,7 +126,9 @@ static int fops_vcodec_open(struct file *file) > mtk_vcodec_dec_set_default_params(ctx); > > if (v4l2_fh_is_singular(&ctx->fh)) { > - mtk_vcodec_dec_pw_on(&dev->pm); > + ret = mtk_vcodec_dec_pw_on(&dev->pm); > + if (ret < 0) > + goto err_load_fw; > /* > * Does nothing if firmware was already loaded. > */ > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c > index ddee7046ce42..6038db96f71c 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c > @@ -88,13 +88,15 @@ void mtk_vcodec_release_dec_pm(struct mtk_vcodec_dev *dev) > put_device(dev->pm.larbvdec); > } > > -void mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm) > +int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm) > { > int ret; > > - ret = pm_runtime_get_sync(pm->dev); > + ret = pm_runtime_resume_and_get(pm->dev); > if (ret) > - mtk_v4l2_err("pm_runtime_get_sync fail %d", ret); > + mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret); > + > + return ret; > } > > void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm) > diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h > index 872d8bf8cfaf..280aeaefdb65 100644 > --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h > +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h > @@ -12,7 +12,7 @@ > int mtk_vcodec_init_dec_pm(struct mtk_vcodec_dev *dev); > void mtk_vcodec_release_dec_pm(struct mtk_vcodec_dev *dev); > > -void mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm); > +int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm); > void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm); > void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm); > void mtk_vcodec_dec_clock_off(struct mtk_vcodec_pm *pm);