Re: [PATCH 18/25] media: mtk-vcodec: fix PM runtime get logic

From: Jonathan Cameron
Date: Wed May 05 2021 - 08:34:42 EST


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);