OSDN Git Service

media: mtk-vcodec: fix PM runtime get logic
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Fri, 23 Apr 2021 15:19:09 +0000 (17:19 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 10 May 2021 09:36:34 +0000 (11:36 +0200)
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.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h

index 147dfef..f87dc47 100644 (file)
@@ -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.
                 */
index ddee704..6038db9 100644 (file)
@@ -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)
index 872d8bf..280aeae 100644 (file)
@@ -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);