Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Maciej Purski and committed by
Inki Dae
8a08f671 6afb7721

+23 -15
+23 -15
drivers/gpu/drm/exynos/exynos_drm_dsi.c
··· 1383 1383 return; 1384 1384 1385 1385 pm_runtime_get_sync(dsi->dev); 1386 - 1387 1386 dsi->state |= DSIM_STATE_ENABLED; 1388 1387 1389 - ret = drm_panel_prepare(dsi->panel); 1390 - if (ret < 0) { 1391 - dsi->state &= ~DSIM_STATE_ENABLED; 1392 - pm_runtime_put_sync(dsi->dev); 1393 - return; 1388 + if (dsi->panel) { 1389 + ret = drm_panel_prepare(dsi->panel); 1390 + if (ret < 0) 1391 + goto err_put_sync; 1392 + } else { 1393 + drm_bridge_pre_enable(dsi->out_bridge); 1394 1394 } 1395 1395 1396 1396 exynos_dsi_set_display_mode(dsi); 1397 1397 exynos_dsi_set_display_enable(dsi, true); 1398 1398 1399 - ret = drm_panel_enable(dsi->panel); 1400 - if (ret < 0) { 1401 - dsi->state &= ~DSIM_STATE_ENABLED; 1402 - exynos_dsi_set_display_enable(dsi, false); 1403 - drm_panel_unprepare(dsi->panel); 1404 - pm_runtime_put_sync(dsi->dev); 1405 - return; 1399 + if (dsi->panel) { 1400 + ret = drm_panel_enable(dsi->panel); 1401 + if (ret < 0) 1402 + goto err_display_disable; 1403 + } else { 1404 + drm_bridge_enable(dsi->out_bridge); 1406 1405 } 1407 1406 1408 1407 dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; 1408 + return; 1409 + 1410 + err_display_disable: 1411 + exynos_dsi_set_display_enable(dsi, false); 1412 + drm_panel_unprepare(dsi->panel); 1413 + 1414 + err_put_sync: 1415 + dsi->state &= ~DSIM_STATE_ENABLED; 1416 + pm_runtime_put(dsi->dev); 1409 1417 } 1410 1418 1411 1419 static void exynos_dsi_disable(struct drm_encoder *encoder) ··· 1426 1418 dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; 1427 1419 1428 1420 drm_panel_disable(dsi->panel); 1421 + drm_bridge_disable(dsi->out_bridge); 1429 1422 exynos_dsi_set_display_enable(dsi, false); 1430 1423 drm_panel_unprepare(dsi->panel); 1431 - 1424 + drm_bridge_post_disable(dsi->out_bridge); 1432 1425 dsi->state &= ~DSIM_STATE_ENABLED; 1433 - 1434 1426 pm_runtime_put_sync(dsi->dev); 1435 1427 } 1436 1428