From: Haitao Xu <[email protected]>

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 <[email protected]>
Signed-off-by: Akhil P Oommen <[email protected]>
---
 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

Reply via email to