]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: platform: mtk-mdp3: fix device leaks at probe
authorJohan Hovold <johan@kernel.org>
Wed, 24 Sep 2025 14:39:19 +0000 (16:39 +0200)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Mon, 20 Oct 2025 07:23:17 +0000 (09:23 +0200)
Make sure to drop the references taken when looking up the subsys
devices during probe on probe failure (e.g. probe deferral) and on
driver unbind.

Similarly, drop the SCP device reference after retrieving its platform
data during probe to avoid leaking it.

Note that holding a reference to a device does not prevent its driver
data from going away.

Fixes: 61890ccaefaf ("media: platform: mtk-mdp3: add MediaTek MDP3 driver")
Cc: stable@vger.kernel.org # 6.1
Cc: Moudy Ho <moudy.ho@mediatek.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/platform/mediatek/mdp3/mtk-mdp3-core.c

index 6559d72d5d4278071bcec0c5c9be398d1639ba5c..6d26d4aa1eef2a0a91b1ce25b57ef4fee45500a0 100644 (file)
@@ -157,10 +157,18 @@ void mdp_video_device_release(struct video_device *vdev)
        kfree(mdp);
 }
 
+static void mdp_put_device(void *_dev)
+{
+       struct device *dev = _dev;
+
+       put_device(dev);
+}
+
 static int mdp_mm_subsys_deploy(struct mdp_dev *mdp, enum mdp_infra_id id)
 {
        struct platform_device *mm_pdev = NULL;
        struct device **dev;
+       int ret;
        int i;
 
        if (!mdp)
@@ -194,6 +202,11 @@ static int mdp_mm_subsys_deploy(struct mdp_dev *mdp, enum mdp_infra_id id)
                if (WARN_ON(!mm_pdev))
                        return -ENODEV;
 
+               ret = devm_add_action_or_reset(&mdp->pdev->dev, mdp_put_device,
+                                              &mm_pdev->dev);
+               if (ret)
+                       return ret;
+
                *dev = &mm_pdev->dev;
        }
 
@@ -279,6 +292,7 @@ static int mdp_probe(struct platform_device *pdev)
                        goto err_destroy_clock_wq;
                }
                mdp->scp = platform_get_drvdata(mm_pdev);
+               put_device(&mm_pdev->dev);
        }
 
        mdp->rproc_handle = scp_get_rproc(mdp->scp);