[PATCH v2 8/8] drm/msm: Consolidate msm_gpu_probe into msm_drv_probe

From: Akhil P Oommen

Date: Fri Oct 30 2026 - 13:12:07 EST


From: Haitao Xu <haitao.xu@xxxxxxxxxxxxxxxx>

msm_gpu_probe() duplicates the setup already done by msm_drv_probe():
allocating msm_drm_private, setting the DMA mask, scanning for GPU
components, and registering a component master.

Reduce msm_gpu_probe() to delegate to msm_drv_probe(dev, NULL, NULL) and
drop the now-unused msm_gpu_drm_{bind,unbind,ops} helpers. Extend
msm_drm_bind() to select msm_gpu_driver when kms_init is NULL, and relax
the add_gpu_components() guard in msm_drv_probe() to always run for
GPU-only callers.

Signed-off-by: Haitao Xu <haitao.xu@xxxxxxxxxxxxxxxx>
Signed-off-by: Akhil P Oommen <akhilpo@xxxxxxxxxxxxxxxx>
---
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 2 +-
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 3 +-
drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 3 +-
drivers/gpu/drm/msm/msm_drv.c | 61 +++++++++-----------------------
drivers/gpu/drm/msm/msm_drv.h | 1 +
5 files changed, 22 insertions(+), 48 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index c044d3c9737a..4e5ba85317f6 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1423,7 +1423,7 @@ static int dpu_dev_probe(struct platform_device *pdev)
if (ret)
return ret;

- return msm_drv_probe(&pdev->dev, dpu_kms_init, &dpu_kms->base);
+ return msm_drv_probe(&pdev->dev, NULL, dpu_kms_init, &dpu_kms->base);
}

static void dpu_dev_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index c299fef1a400..ad08a040982f 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -553,7 +553,8 @@ static int mdp4_probe(struct platform_device *pdev)
if (IS_ERR(mdp4_kms->lut_clk))
return dev_err_probe(dev, PTR_ERR(mdp4_kms->lut_clk), "failed to get lut_clk\n");

- return msm_drv_probe(&pdev->dev, mdp4_kms_init, &mdp4_kms->base.base);
+ return msm_drv_probe(&pdev->dev, NULL, mdp4_kms_init,
+ &mdp4_kms->base.base);
}

static void mdp4_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 40b4415c0fba..067e23fb9649 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -858,7 +858,8 @@ static int mdp5_dev_probe(struct platform_device *pdev)

mdp5_kms->base.base.irq = irq;

- return msm_drv_probe(&pdev->dev, mdp5_kms_init, &mdp5_kms->base.base);
+ return msm_drv_probe(&pdev->dev, NULL, mdp5_kms_init,
+ &mdp5_kms->base.base);
}

static void mdp5_dev_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index c3b6a5f8f54e..9eb5d182eaed 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1129,10 +1129,17 @@ static int add_gpu_components(struct device *dev,

static int msm_drm_bind(struct device *dev)
{
- return msm_drm_init(dev,
- msm_separate_gpu_kms_components() ?
- &msm_kms_driver :
- &msm_driver);
+ struct msm_drm_private *priv = msm_drm_get_priv(dev);
+ const struct drm_driver *drv;
+
+ if (!priv->kms_init)
+ drv = &msm_gpu_driver;
+ else if (msm_separate_gpu_kms_components())
+ drv = &msm_kms_driver;
+ else
+ drv = &msm_driver;
+
+ return msm_drm_init(dev, drv);
}

static void msm_drm_unbind(struct device *dev)
@@ -1146,6 +1153,7 @@ const struct component_master_ops msm_drm_ops = {
};

int msm_drv_probe(struct device *master_dev,
+ struct device_node *gpu_np,
int (*kms_init)(struct drm_device *dev),
struct msm_kms *kms)
{
@@ -1169,8 +1177,8 @@ int msm_drv_probe(struct device *master_dev,
return ret;
}

- if (!msm_separate_gpu_kms_components()) {
- ret = add_gpu_components(master_dev, NULL, &match);
+ if (!kms_init || !msm_separate_gpu_kms_components()) {
+ ret = add_gpu_components(master_dev, gpu_np, &match);
if (ret)
return ret;
}
@@ -1189,51 +1197,14 @@ int msm_drv_probe(struct device *master_dev,
return 0;
}

-static int msm_gpu_drm_bind(struct device *dev)
-{
- return msm_drm_init(dev, &msm_gpu_driver);
-}
-
-static void msm_gpu_drm_unbind(struct device *dev)
-{
- msm_drm_uninit(dev);
-}
-
-static const struct component_master_ops msm_gpu_drm_ops = {
- .bind = msm_gpu_drm_bind,
- .unbind = msm_gpu_drm_unbind,
-};
-
int msm_gpu_probe(struct platform_device *pdev)
{
- struct msm_drm_private *priv;
- struct component_match *match = NULL;
- int ret;
-
- priv = devres_alloc(msm_drm_priv_release, sizeof(*priv), GFP_KERNEL);
- if (!priv)
- return -ENOMEM;
-
- devres_add(&pdev->dev, priv);
-
- /* on all devices that I am aware of, iommu's which can map
- * any address the cpu can see are used:
- */
- ret = dma_set_mask_and_coherent(&pdev->dev, ~0);
- if (ret)
- return ret;
-
- ret = add_gpu_components(&pdev->dev, pdev->dev.of_node, &match);
- if (ret)
- return ret;
-
- return component_master_add_with_match(&pdev->dev, &msm_gpu_drm_ops,
- match);
+ return msm_drv_probe(&pdev->dev, pdev->dev.of_node, NULL, NULL);
}

void msm_gpu_remove(struct platform_device *pdev)
{
- component_master_del(&pdev->dev, &msm_gpu_drm_ops);
+ component_master_del(&pdev->dev, &msm_drm_ops);
}

static int __init msm_drm_register(void)
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index e70fd617f1e0..b65702ac0140 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -532,6 +532,7 @@ void msm_kms_pm_complete(struct device *dev);
int msm_gpu_probe(struct platform_device *pdev);
void msm_gpu_remove(struct platform_device *pdev);
int msm_drv_probe(struct device *dev,
+ struct device_node *gpu_np,
int (*kms_init)(struct drm_device *dev),
struct msm_kms *kms);
void msm_kms_shutdown(struct platform_device *pdev);

--
2.55.0