]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
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)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 13 Aug 2021 07:44:59 +0000 (09:44 +0200)
BugLink: https://bugs.launchpad.net/bugs/1938199
[ Upstream commit 908711f542c17fe61e5d653da1beb8e5ab5c7b50 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
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 00d090df11bbe49361ace483c0070b581e798bdc..4cde1a54e72528cbb579af1bd64142b7e0960348 100644 (file)
@@ -142,7 +142,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;
                /*
                 * vpu_load_firmware checks if it was loaded already and
                 * does nothing in that case
index f9bbd0000bf3e597edf40c2aaf01d3330c5372fc..34e9e067de2061c55e0ba494ebf4a2dde5412f9b 100644 (file)
@@ -89,13 +89,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 872d8bf8cfaf3c6f1f20e2df129bf1482986a859..280aeaefdb6514d976adf1fda0e0120917376f50 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);