diff --git a/drivers/video/drm/rockchip_display.c b/drivers/video/drm/rockchip_display.c index 4d8bf77ef0..e47437a423 100644 --- a/drivers/video/drm/rockchip_display.c +++ b/drivers/video/drm/rockchip_display.c @@ -1386,6 +1386,9 @@ static int rockchip_display_probe(struct udevice *dev) get_crtc_mcu_mode(&s->crtc_state); + ret = ofnode_read_u32_default(s->crtc_state.node, + "rockchip,dual-channel-swap", 0); + s->crtc_state.dual_channel_swap = ret; if (connector_panel_init(s)) { printf("Warn: Failed to init panel drivers\n"); free(s); diff --git a/drivers/video/drm/rockchip_display.h b/drivers/video/drm/rockchip_display.h index cc719b8aac..b37425df7b 100644 --- a/drivers/video/drm/rockchip_display.h +++ b/drivers/video/drm/rockchip_display.h @@ -84,6 +84,7 @@ struct crtc_state { int crtc_h; bool yuv_overlay; struct rockchip_mcu_timing mcu_timing; + u32 dual_channel_swap; }; struct panel_state { diff --git a/drivers/video/drm/rockchip_vop.c b/drivers/video/drm/rockchip_vop.c index 67fd430061..76d6f7a830 100644 --- a/drivers/video/drm/rockchip_vop.c +++ b/drivers/video/drm/rockchip_vop.c @@ -305,7 +305,8 @@ static int rockchip_vop_init(struct display_state *state) VOP_CTRL_SET(vop, mipi_dual_channel_en, !!(conn_state->output_type & ROCKCHIP_OUTPUT_DSI_DUAL_CHANNEL)); VOP_CTRL_SET(vop, data01_swap, - !!(conn_state->output_type & ROCKCHIP_OUTPUT_DSI_DUAL_LINK)); + !!(conn_state->output_type & ROCKCHIP_OUTPUT_DSI_DUAL_LINK) || + crtc_state->dual_channel_swap); break; case DRM_MODE_CONNECTOR_DisplayPort: VOP_CTRL_SET(vop, dp_dclk_pol, 0);