Commit 8a08f671 authored by Maciej Purski's avatar Maciej Purski Committed by Inki Dae
Browse files

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: default avatarMaciej Purski <m.purski@samsung.com>
[ a.hajda@samsung.com: v5 ]
Signed-off-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 6afb7721
Loading
Loading
Loading
Loading
+23 −15
Original line number Diff line number Diff line
@@ -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;

	if (dsi->panel) {
		ret = drm_panel_prepare(dsi->panel);
	if (ret < 0) {
		dsi->state &= ~DSIM_STATE_ENABLED;
		pm_runtime_put_sync(dsi->dev);
		return;
		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);

	if (dsi->panel) {
		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 (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);
}