riscv:linux:drm:mipidsi
authorshengyang.chen <shengyang.chen@starfivetech.com>
Mon, 11 Jul 2022 11:42:27 +0000 (19:42 +0800)
committershengyang.chen <shengyang.chen@starfivetech.com>
Mon, 11 Jul 2022 11:42:27 +0000 (19:42 +0800)
fix mipi display color problem

Signed-off-by:shengyang.chen<shengyang.chen@starfivetech.com>

drivers/gpu/drm/verisilicon/starfive_drm_dsi.c
drivers/gpu/drm/verisilicon/vs_crtc.c

index 6f6dda0..9f7dcd6 100644 (file)
@@ -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;
index 5817dd9..1ebe490 100644 (file)
@@ -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)) {