]> Gentwo Git Trees - linux/.git/commitdiff
drm/mediatek: mtk_hdmi: Fix probe device leaks
authorJohan Hovold <johan@kernel.org>
Tue, 23 Sep 2025 15:23:39 +0000 (17:23 +0200)
committerChun-Kuang Hu <chunkuang.hu@kernel.org>
Mon, 17 Nov 2025 14:52:24 +0000 (14:52 +0000)
Make sure to drop the references to the DDC adapter and CEC device
taken during probe on probe failure (e.g. probe deferral) and on driver
unbind.

Fixes: 8f83f26891e1 ("drm/mediatek: Add HDMI support")
Cc: stable@vger.kernel.org # 4.8
Cc: Jie Qiu <jie.qiu@mediatek.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://patchwork.kernel.org/project/dri-devel/patch/20250923152340.18234-5-johan@kernel.org/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
drivers/gpu/drm/mediatek/mtk_hdmi.c

index b766dd5e6c8de6d16bff50972b45c3c1a083b985..306e2c90731144ec22a9d269ef44843b71db11f2 100644 (file)
@@ -1345,6 +1345,13 @@ static const struct drm_bridge_funcs mtk_hdmi_bridge_funcs = {
        .edid_read = mtk_hdmi_bridge_edid_read,
 };
 
+static void mtk_hdmi_put_device(void *_dev)
+{
+       struct device *dev = _dev;
+
+       put_device(dev);
+}
+
 static int mtk_hdmi_get_cec_dev(struct mtk_hdmi *hdmi, struct device *dev, struct device_node *np)
 {
        struct platform_device *cec_pdev;
@@ -1369,6 +1376,10 @@ static int mtk_hdmi_get_cec_dev(struct mtk_hdmi *hdmi, struct device *dev, struc
        }
        of_node_put(cec_np);
 
+       ret = devm_add_action_or_reset(dev, mtk_hdmi_put_device, &cec_pdev->dev);
+       if (ret)
+               return ret;
+
        /*
         * The mediatek,syscon-hdmi property contains a phandle link to the
         * MMSYS_CONFIG device and the register offset of the HDMI_SYS_CFG
@@ -1423,6 +1434,10 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
        if (!hdmi->ddc_adpt)
                return dev_err_probe(dev, -EINVAL, "Failed to get ddc i2c adapter by node\n");
 
+       ret = devm_add_action_or_reset(dev, mtk_hdmi_put_device, &hdmi->ddc_adpt->dev);
+       if (ret)
+               return ret;
+
        ret = mtk_hdmi_get_cec_dev(hdmi, dev, np);
        if (ret)
                return ret;