drm/exynos: enable out_bridge in exynos_dsi_enable
authorMaciej Purski <m.purski@samsung.com>
Wed, 25 Jul 2018 15:46:38 +0000 (17:46 +0200)
committerInki Dae <inki.dae@samsung.com>
Thu, 20 Sep 2018 08:19:25 +0000 (17:19 +0900)
As the out bridge will not be enabled directly by the framework,
it should be enabled by DSI. exynos_dsi_enable() should handle a case,
when there is an out_bridge connected as a DSI peripheral.

Changed in v5:
- fixed error path in exynos_dsi_enable

Signed-off-by: Maciej Purski <m.purski@samsung.com>
[ a.hajda@samsung.com: v5 ]
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_dsi.c

index 2a0b780..07af775 100644 (file)
@@ -1383,29 +1383,37 @@ static void exynos_dsi_enable(struct drm_encoder *encoder)
                return;
 
        pm_runtime_get_sync(dsi->dev);
-
        dsi->state |= DSIM_STATE_ENABLED;
 
-       ret = drm_panel_prepare(dsi->panel);
-       if (ret < 0) {
-               dsi->state &= ~DSIM_STATE_ENABLED;
-               pm_runtime_put_sync(dsi->dev);
-               return;
+       if (dsi->panel) {
+               ret = drm_panel_prepare(dsi->panel);
+               if (ret < 0)
+                       goto err_put_sync;
+       } else {
+               drm_bridge_pre_enable(dsi->out_bridge);
        }
 
        exynos_dsi_set_display_mode(dsi);
        exynos_dsi_set_display_enable(dsi, true);
 
-       ret = drm_panel_enable(dsi->panel);
-       if (ret < 0) {
-               dsi->state &= ~DSIM_STATE_ENABLED;
-               exynos_dsi_set_display_enable(dsi, false);
-               drm_panel_unprepare(dsi->panel);
-               pm_runtime_put_sync(dsi->dev);
-               return;
+       if (dsi->panel) {
+               ret = drm_panel_enable(dsi->panel);
+               if (ret < 0)
+                       goto err_display_disable;
+       } else {
+               drm_bridge_enable(dsi->out_bridge);
        }
 
        dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE;
+       return;
+
+err_display_disable:
+       exynos_dsi_set_display_enable(dsi, false);
+       drm_panel_unprepare(dsi->panel);
+
+err_put_sync:
+       dsi->state &= ~DSIM_STATE_ENABLED;
+       pm_runtime_put(dsi->dev);
 }
 
 static void exynos_dsi_disable(struct drm_encoder *encoder)
@@ -1418,11 +1426,11 @@ static void exynos_dsi_disable(struct drm_encoder *encoder)
        dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE;
 
        drm_panel_disable(dsi->panel);
+       drm_bridge_disable(dsi->out_bridge);
        exynos_dsi_set_display_enable(dsi, false);
        drm_panel_unprepare(dsi->panel);
-
+       drm_bridge_post_disable(dsi->out_bridge);
        dsi->state &= ~DSIM_STATE_ENABLED;
-
        pm_runtime_put_sync(dsi->dev);
 }