drm/exynos: enable out_bridge in exynos_dsi_enable

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>
This commit is contained in:
Maciej Purski 2018-07-25 17:46:38 +02:00 committed by Inki Dae
parent 6afb7721e2
commit 8a08f671f3
1 changed files with 23 additions and 15 deletions
drivers/gpu/drm/exynos

View File

@ -1383,29 +1383,37 @@ static void exynos_dsi_enable(struct drm_encoder *encoder)
return; return;
pm_runtime_get_sync(dsi->dev); pm_runtime_get_sync(dsi->dev);
dsi->state |= DSIM_STATE_ENABLED; dsi->state |= DSIM_STATE_ENABLED;
ret = drm_panel_prepare(dsi->panel); if (dsi->panel) {
if (ret < 0) { ret = drm_panel_prepare(dsi->panel);
dsi->state &= ~DSIM_STATE_ENABLED; if (ret < 0)
pm_runtime_put_sync(dsi->dev); goto err_put_sync;
return; } else {
drm_bridge_pre_enable(dsi->out_bridge);
} }
exynos_dsi_set_display_mode(dsi); exynos_dsi_set_display_mode(dsi);
exynos_dsi_set_display_enable(dsi, true); exynos_dsi_set_display_enable(dsi, true);
ret = drm_panel_enable(dsi->panel); if (dsi->panel) {
if (ret < 0) { ret = drm_panel_enable(dsi->panel);
dsi->state &= ~DSIM_STATE_ENABLED; if (ret < 0)
exynos_dsi_set_display_enable(dsi, false); goto err_display_disable;
drm_panel_unprepare(dsi->panel); } else {
pm_runtime_put_sync(dsi->dev); drm_bridge_enable(dsi->out_bridge);
return;
} }
dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; 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) 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; dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE;
drm_panel_disable(dsi->panel); drm_panel_disable(dsi->panel);
drm_bridge_disable(dsi->out_bridge);
exynos_dsi_set_display_enable(dsi, false); exynos_dsi_set_display_enable(dsi, false);
drm_panel_unprepare(dsi->panel); drm_panel_unprepare(dsi->panel);
drm_bridge_post_disable(dsi->out_bridge);
dsi->state &= ~DSIM_STATE_ENABLED; dsi->state &= ~DSIM_STATE_ENABLED;
pm_runtime_put_sync(dsi->dev); pm_runtime_put_sync(dsi->dev);
} }