The dsi bridge ops call drm_panel functions to set up the connected
drm_panel. Add checks to make sure these aren't called when we're
connected to an external bridge.

Signed-off-by: Archit Taneja <architt at codeaurora.org>
---
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 43 +++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c 
b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index 620aca0..3d4f977 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -354,10 +354,13 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge 
*bridge)
        /* Always call panel functions once, because even for dual panels,
         * there is only one drm_panel instance.
         */
-       ret = drm_panel_prepare(panel);
-       if (ret) {
-               pr_err("%s: prepare panel %d failed, %d\n", __func__, id, ret);
-               goto panel_prep_fail;
+       if (panel) {
+               ret = drm_panel_prepare(panel);
+               if (ret) {
+                       pr_err("%s: prepare panel %d failed, %d\n", __func__,
+                                                               id, ret);
+                       goto panel_prep_fail;
+               }
        }

        ret = msm_dsi_host_enable(host);
@@ -374,10 +377,13 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge 
*bridge)
                }
        }

-       ret = drm_panel_enable(panel);
-       if (ret) {
-               pr_err("%s: enable panel %d failed, %d\n", __func__, id, ret);
-               goto panel_en_fail;
+       if (panel) {
+               ret = drm_panel_enable(panel);
+               if (ret) {
+                       pr_err("%s: enable panel %d failed, %d\n", __func__, id,
+                                                                       ret);
+                       goto panel_en_fail;
+               }
        }

        return;
@@ -388,7 +394,8 @@ panel_en_fail:
 host1_en_fail:
        msm_dsi_host_disable(host);
 host_en_fail:
-       drm_panel_unprepare(panel);
+       if (panel)
+               drm_panel_unprepare(panel);
 panel_prep_fail:
        if (is_dual_panel && msm_dsi1)
                msm_dsi_host_power_off(msm_dsi1->host);
@@ -424,9 +431,12 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge 
*bridge)
                        (is_dual_panel && (DSI_1 == id)))
                return;

-       ret = drm_panel_disable(panel);
-       if (ret)
-               pr_err("%s: Panel %d OFF failed, %d\n", __func__, id, ret);
+       if (panel) {
+               ret = drm_panel_disable(panel);
+               if (ret)
+                       pr_err("%s: Panel %d OFF failed, %d\n", __func__, id,
+                                                                       ret);
+       }

        ret = msm_dsi_host_disable(host);
        if (ret)
@@ -438,9 +448,12 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge 
*bridge)
                        pr_err("%s: host1 disable failed, %d\n", __func__, ret);
        }

-       ret = drm_panel_unprepare(panel);
-       if (ret)
-               pr_err("%s: Panel %d unprepare failed,%d\n", __func__, id, ret);
+       if (panel) {
+               ret = drm_panel_unprepare(panel);
+               if (ret)
+                       pr_err("%s: Panel %d unprepare failed,%d\n", __func__,
+                                                               id, ret);
+       }

        ret = msm_dsi_host_power_off(host);
        if (ret)
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

Reply via email to