From f1e4bd81e0029edd4b07dc2fa4822c11e0a1fc47 Mon Sep 17 00:00:00 2001 From: Guchun Chen Date: Sat, 23 Jun 2018 17:34:36 +0800 Subject: [PATCH] drm: msm: add dsi swap feature support This feature only works on top of dsi split mode. When enabling it, DSI output will be swapped. CRs-Fixed: 2266483 Change-Id: I84a10814e2bec5e229b2a734153e82cb5fac7e10 Signed-off-by: Guchun Chen --- drivers/gpu/drm/msm/dsi-staging/dsi_display.c | 15 +++++++++++++++ drivers/gpu/drm/msm/dsi-staging/dsi_display.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c index c468a6f5caa2..3cecb64e313f 100644 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.c +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.c @@ -1166,6 +1166,13 @@ static int dsi_display_parse_dt(struct dsi_display *display) goto error; } + /* Only read swap property in split case */ + if (display->ctrl_count > 1) { + display->dsi_split_swap = + of_property_read_bool(display->pdev->dev.of_node, + "qcom,dsi-split-swap"); + } + if (of_get_property(display->pdev->dev.of_node, "qcom,dsi-panel", &size)) { display->panel_count = size / sizeof(int); @@ -2281,6 +2288,14 @@ int dsi_display_get_info(struct msm_display_info *info, void *disp) for (i = 0; i < info->num_of_h_tiles; i++) info->h_tile_instance[i] = display->ctrl[i].ctrl->index; + /* + * h_tile_instance[2] = {0, 1} means DSI0 left(master), DSI1 right + * h_tile_instance[2] = {1, 0} means DSI1 left(master), DSI0 right + * So in case of split case and swap property is set, swap two DSIs. + */ + if (info->num_of_h_tiles > 1 && display->dsi_split_swap) + swap(info->h_tile_instance[0], info->h_tile_instance[1]); + info->is_connected = true; info->width_mm = phy_props.panel_width_mm; info->height_mm = phy_props.panel_height_mm; diff --git a/drivers/gpu/drm/msm/dsi-staging/dsi_display.h b/drivers/gpu/drm/msm/dsi-staging/dsi_display.h index 3723f19fd0e7..25b2d0c1ec53 100644 --- a/drivers/gpu/drm/msm/dsi-staging/dsi_display.h +++ b/drivers/gpu/drm/msm/dsi-staging/dsi_display.h @@ -121,6 +121,8 @@ struct dsi_display_clk_info { * @bridge: Pointer to DRM bridge object. * @cmd_engine_refcount: Reference count enforcing single instance of cmd eng * @root: Debugfs root directory + * @cont_splash_enabled: Early splash status. + * @dsi_split_swap: Swap dsi output in split mode. */ struct dsi_display { struct platform_device *pdev; @@ -160,6 +162,7 @@ struct dsi_display { struct dentry *root; bool cont_splash_enabled; + bool dsi_split_swap; }; int dsi_display_dev_probe(struct platform_device *pdev);