From 3928d258d47b22da07dfd201d8a81abd3b64fae9 Mon Sep 17 00:00:00 2001 From: "shengyang.chen" Date: Mon, 11 Jul 2022 19:42:27 +0800 Subject: [PATCH] riscv:linux:drm:mipidsi fix mipi display color problem Signed-off-by:shengyang.chen --- drivers/gpu/drm/verisilicon/starfive_drm_dsi.c | 18 ++++++++++++++++++ drivers/gpu/drm/verisilicon/vs_crtc.c | 14 +++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/verisilicon/starfive_drm_dsi.c b/drivers/gpu/drm/verisilicon/starfive_drm_dsi.c index 6f6dda0..9f7dcd6 100644 --- a/drivers/gpu/drm/verisilicon/starfive_drm_dsi.c +++ b/drivers/gpu/drm/verisilicon/starfive_drm_dsi.c @@ -944,6 +944,7 @@ static void cdns_dsi_bridge_disable(struct drm_bridge *bridge) struct cdns_dsi_input *input = bridge_to_cdns_dsi_input(bridge); struct cdns_dsi *dsi = input_to_dsi(input); u32 val; + int ret; dsi->link_initialized = false; val = readl(dsi->regs + MCTL_MAIN_DATA_CTL); @@ -957,6 +958,11 @@ static void cdns_dsi_bridge_disable(struct drm_bridge *bridge) sys_mipi_dsi_set_ppi_txbyte_hs(0, dsi); phy_power_off(dsi->dphy); phy_exit(dsi->dphy); + + ret = cdns_dsi_resets_assert(dsi, dsi->base.dev); + if (ret < 0) + dev_err(dsi->base.dev, "failed to assert reset\n"); + cdns_dsi_clock_disable(dsi); } #if 0 @@ -1066,6 +1072,18 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge) int nlanes; int vrefresh; u32 div; + int ret; + + ret = cdns_dsi_clock_enable(dsi, dsi->base.dev); + if (ret) { + dev_err(dsi->base.dev, "failed to enable clock\n"); + return; + } + ret = cdns_dsi_resets_deassert(dsi, dsi->base.dev); + if (ret < 0) { + dev_err(dsi->base.dev, "failed to deassert reset\n"); + return; + } if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0)) return; diff --git a/drivers/gpu/drm/verisilicon/vs_crtc.c b/drivers/gpu/drm/verisilicon/vs_crtc.c index 5817dd9..1ebe490 100644 --- a/drivers/gpu/drm/verisilicon/vs_crtc.c +++ b/drivers/gpu/drm/verisilicon/vs_crtc.c @@ -268,9 +268,10 @@ static void vs_crtc_atomic_enable(struct drm_crtc *crtc, vs_crtc_state->bpp = cal_pixel_bits(vs_crtc_state->output_fmt); - vs_crtc->funcs->enable(vs_crtc->dev, crtc); - - drm_crtc_vblank_on(crtc); + if (vs_crtc_state->encoder_type != DRM_MODE_ENCODER_DSI){ + vs_crtc->funcs->enable(vs_crtc->dev, crtc); + drm_crtc_vblank_on(crtc); + } } static void vs_crtc_atomic_disable(struct drm_crtc *crtc, @@ -297,10 +298,17 @@ static void vs_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); //struct drm_crtc_state *old_crtc_state = drm_atomic_get_old_crtc_state(state,crtc); + struct vs_crtc *vs_crtc = to_vs_crtc(crtc); struct device *dev = vs_crtc->dev; struct drm_property_blob *blob = crtc->state->gamma_lut; struct drm_color_lut *lut; + struct vs_crtc_state *vs_crtc_state = to_vs_crtc_state(crtc->state); + + if (vs_crtc_state->encoder_type == DRM_MODE_ENCODER_DSI){ + vs_crtc->funcs->enable(vs_crtc->dev, crtc); + drm_crtc_vblank_on(crtc); + } if (crtc_state->color_mgmt_changed) { if ((blob) && (blob->length)) { -- 2.7.4