drm/msm/dsi: Adjust probe order
authorRob Clark <robdclark@chromium.org>
Mon, 25 Oct 2021 15:15:36 +0000 (17:15 +0200)
committerMaxime Ripard <maxime@cerno.tech>
Wed, 27 Oct 2021 20:08:10 +0000 (22:08 +0200)
Switch to the documented order dsi-host vs bridge probe.

Tested-by: Amit Pundir <amit.pundir@linaro.org>
Tested-by: Caleb Connolly <caleb.connolly@linaro.org>
Tested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Rob Clark <robdclark@chromium.org>
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20211025151536.1048186-22-maxime@cerno.tech
drivers/gpu/drm/msm/dsi/dsi.c
drivers/gpu/drm/msm/dsi/dsi.h
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/dsi/dsi_manager.c
drivers/gpu/drm/msm/msm_drv.h

index 614dc7f..ad73ebb 100644 (file)
@@ -112,18 +112,7 @@ static int dsi_bind(struct device *dev, struct device *master, void *data)
 {
        struct drm_device *drm = dev_get_drvdata(master);
        struct msm_drm_private *priv = drm->dev_private;
-       struct platform_device *pdev = to_platform_device(dev);
-       struct msm_dsi *msm_dsi;
-
-       DBG("");
-       msm_dsi = dsi_init(pdev);
-       if (IS_ERR(msm_dsi)) {
-               /* Don't fail the bind if the dsi port is not connected */
-               if (PTR_ERR(msm_dsi) == -ENODEV)
-                       return 0;
-               else
-                       return PTR_ERR(msm_dsi);
-       }
+       struct msm_dsi *msm_dsi = dev_get_drvdata(dev);
 
        priv->dsi[msm_dsi->id] = msm_dsi;
 
@@ -136,12 +125,8 @@ static void dsi_unbind(struct device *dev, struct device *master,
        struct drm_device *drm = dev_get_drvdata(master);
        struct msm_drm_private *priv = drm->dev_private;
        struct msm_dsi *msm_dsi = dev_get_drvdata(dev);
-       int id = msm_dsi->id;
 
-       if (priv->dsi[id]) {
-               dsi_destroy(msm_dsi);
-               priv->dsi[id] = NULL;
-       }
+       priv->dsi[msm_dsi->id] = NULL;
 }
 
 static const struct component_ops dsi_ops = {
@@ -149,15 +134,40 @@ static const struct component_ops dsi_ops = {
        .unbind = dsi_unbind,
 };
 
-static int dsi_dev_probe(struct platform_device *pdev)
+int dsi_dev_attach(struct platform_device *pdev)
 {
        return component_add(&pdev->dev, &dsi_ops);
 }
 
+void dsi_dev_detach(struct platform_device *pdev)
+{
+       component_del(&pdev->dev, &dsi_ops);
+}
+
+static int dsi_dev_probe(struct platform_device *pdev)
+{
+       struct msm_dsi *msm_dsi;
+
+       DBG("");
+       msm_dsi = dsi_init(pdev);
+       if (IS_ERR(msm_dsi)) {
+               /* Don't fail the bind if the dsi port is not connected */
+               if (PTR_ERR(msm_dsi) == -ENODEV)
+                       return 0;
+               else
+                       return PTR_ERR(msm_dsi);
+       }
+
+       return 0;
+}
+
 static int dsi_dev_remove(struct platform_device *pdev)
 {
+       struct msm_dsi *msm_dsi = platform_get_drvdata(pdev);
+
        DBG("");
-       component_del(&pdev->dev, &dsi_ops);
+       dsi_destroy(msm_dsi);
+
        return 0;
 }
 
index b50db91..83787cb 100644 (file)
@@ -116,7 +116,7 @@ int msm_dsi_host_set_display_mode(struct mipi_dsi_host *host,
 struct drm_panel *msm_dsi_host_get_panel(struct mipi_dsi_host *host);
 unsigned long msm_dsi_host_get_mode_flags(struct mipi_dsi_host *host);
 struct drm_bridge *msm_dsi_host_get_bridge(struct mipi_dsi_host *host);
-int msm_dsi_host_register(struct mipi_dsi_host *host, bool check_defer);
+int msm_dsi_host_register(struct mipi_dsi_host *host);
 void msm_dsi_host_unregister(struct mipi_dsi_host *host);
 int msm_dsi_host_set_src_pll(struct mipi_dsi_host *host,
                        struct msm_dsi_phy *src_phy);
index e269df2..f741494 100644 (file)
@@ -1624,6 +1624,10 @@ static int dsi_host_attach(struct mipi_dsi_host *host,
        if (ret)
                return ret;
 
+       ret = dsi_dev_attach(msm_host->pdev);
+       if (ret)
+               return ret;
+
        DBG("id=%d", msm_host->id);
        if (msm_host->dev)
                queue_work(msm_host->workqueue, &msm_host->hpd_work);
@@ -1636,6 +1640,8 @@ static int dsi_host_detach(struct mipi_dsi_host *host,
 {
        struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
 
+       dsi_dev_detach(msm_host->pdev);
+
        msm_host->device_node = NULL;
 
        DBG("id=%d", msm_host->id);
@@ -1970,7 +1976,7 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
        return 0;
 }
 
-int msm_dsi_host_register(struct mipi_dsi_host *host, bool check_defer)
+int msm_dsi_host_register(struct mipi_dsi_host *host)
 {
        struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
        int ret;
@@ -1984,20 +1990,6 @@ int msm_dsi_host_register(struct mipi_dsi_host *host, bool check_defer)
                        return ret;
 
                msm_host->registered = true;
-
-               /* If the panel driver has not been probed after host register,
-                * we should defer the host's probe.
-                * It makes sure panel is connected when fbcon detects
-                * connector status and gets the proper display mode to
-                * create framebuffer.
-                * Don't try to defer if there is nothing connected to the dsi
-                * output
-                */
-               if (check_defer && msm_host->device_node) {
-                       if (IS_ERR(of_drm_find_panel(msm_host->device_node)))
-                               if (!of_drm_find_bridge(msm_host->device_node))
-                                       return -EPROBE_DEFER;
-               }
        }
 
        return 0;
index c41d39f..fc949a8 100644 (file)
@@ -72,7 +72,7 @@ static int dsi_mgr_setup_components(int id)
        int ret;
 
        if (!IS_BONDED_DSI()) {
-               ret = msm_dsi_host_register(msm_dsi->host, true);
+               ret = msm_dsi_host_register(msm_dsi->host);
                if (ret)
                        return ret;
 
@@ -92,10 +92,10 @@ static int dsi_mgr_setup_components(int id)
                 * because only master DSI device adds the panel to global
                 * panel list. The panel's device is the master DSI device.
                 */
-               ret = msm_dsi_host_register(slave_link_dsi->host, false);
+               ret = msm_dsi_host_register(slave_link_dsi->host);
                if (ret)
                        return ret;
-               ret = msm_dsi_host_register(master_link_dsi->host, true);
+               ret = msm_dsi_host_register(master_link_dsi->host);
                if (ret)
                        return ret;
 
index 8b005d1..31d50e9 100644 (file)
@@ -344,6 +344,8 @@ int msm_edp_modeset_init(struct msm_edp *edp, struct drm_device *dev,
 
 struct msm_dsi;
 #ifdef CONFIG_DRM_MSM_DSI
+int dsi_dev_attach(struct platform_device *pdev);
+void dsi_dev_detach(struct platform_device *pdev);
 void __init msm_dsi_register(void);
 void __exit msm_dsi_unregister(void);
 int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,