Re: [PATCH] drm/mediatek: ovl_adaptor: balance component registrations
CK Hu (胡俊光) <[email protected]> Tue, 28 Jul 2026 09:28:44 +0000
| Newsgroups | org.infradead.lists.linux-mediatek,org.freedesktop.lists.dri-devel,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
On Wed, 2026-07-22 at 00:22 +0900, Myeonghun Pak wrote: > External email : Please do not click links or open attachments until you have verified the sender or the content. > > > The OVL adaptor registers both an aggregate driver for its child devices > and a component for the main DRM aggregate. Probe currently ignores an > error from registering the child aggregate and leaves that aggregate > registered if registering the DRM component fails. The remove callback > also leaves the DRM component registered. > > These imbalances can leave component framework entries referring to a > device whose probe failed or whose driver has been detached. The aggregate > unbind callback also fails to undo component_bind_all(), leaving its child > components marked as bound when the aggregate is removed. > > Check the aggregate registration result, unwind it when the component > registration fails, and unregister the component before the aggregate on > remove. Keep runtime PM enabled until both framework registrations have > been removed, and unbind all child components from the aggregate unbind > callback. Reviewed-by: CK Hu <[email protected]> > > Fixes: 453c3364632a ("drm/mediatek: Add ovl_adaptor support for MT8195") > Cc: [email protected] # 6.4+ > Co-developed-by: Ijae Kim <[email protected]> > Signed-off-by: Ijae Kim <[email protected]> > Signed-off-by: Myeonghun Pak <[email protected]> > --- > drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > index c0af3e3b5..6a259872b 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > @@ -625,6 +625,7 @@ static void mtk_disp_ovl_adaptor_master_unbind(struct device *dev) > struct mtk_disp_ovl_adaptor *priv = dev_get_drvdata(dev); > > priv->children_bound = false; > + component_unbind_all(dev, priv->mmsys_dev); > } > > static const struct component_master_ops mtk_disp_ovl_adaptor_master_ops = { > @@ -651,12 +652,15 @@ static int mtk_disp_ovl_adaptor_probe(struct platform_device *pdev) > > priv->mmsys_dev = pdev->dev.platform_data; > > - component_master_add_with_match(dev, &mtk_disp_ovl_adaptor_master_ops, match); > + ret = component_master_add_with_match(dev, &mtk_disp_ovl_adaptor_master_ops, match); > + if (ret) > + return dev_err_probe(dev, ret, "Failed to add component master\n"); > > pm_runtime_enable(dev); > > ret = component_add(dev, &mtk_disp_ovl_adaptor_comp_ops); > if (ret != 0) { > + component_master_del(dev, &mtk_disp_ovl_adaptor_master_ops); > pm_runtime_disable(dev); > return dev_err_probe(dev, ret, "Failed to add component\n"); > } > @@ -666,6 +670,7 @@ static int mtk_disp_ovl_adaptor_probe(struct platform_device *pdev) > > static void mtk_disp_ovl_adaptor_remove(struct platform_device *pdev) > { > + component_del(&pdev->dev, &mtk_disp_ovl_adaptor_comp_ops); > component_master_del(&pdev->dev, &mtk_disp_ovl_adaptor_master_ops); > pm_runtime_disable(&pdev->dev); > } > -- > 2.51.0