diff --git a/drivers/video/drm/dw_mipi_dsi.c b/drivers/video/drm/dw_mipi_dsi.c index bf43669645..81f9f07f4b 100644 --- a/drivers/video/drm/dw_mipi_dsi.c +++ b/drivers/video/drm/dw_mipi_dsi.c @@ -205,6 +205,7 @@ enum grf_reg_fields { VOPSEL, TURNREQUEST, TURNDISABLE, + SKEWCALHS, FORCETXSTOPMODE, FORCERXMODE, ENABLE_N, @@ -1091,7 +1092,10 @@ static int dw_mipi_dsi_connector_init(struct display_state *state) conn_state->output_mode = ROCKCHIP_OUT_MODE_P888; conn_state->color_space = V4L2_COLORSPACE_DEFAULT; conn_state->type = DRM_MODE_CONNECTOR_DSI; + conn_state->output_if |= + dsi->id ? VOP_OUTPUT_IF_MIPI1 : VOP_OUTPUT_IF_MIPI0; +#ifndef CONFIG_ROCKCHIP_RK3568 if (dsi->id) { struct udevice *dev; int ret; @@ -1107,6 +1111,7 @@ static int dw_mipi_dsi_connector_init(struct display_state *state) conn_state->output_type = ROCKCHIP_OUTPUT_DSI_DUAL_LINK; } +#endif if (dsi->lanes > 4) { struct udevice *dev; @@ -1115,8 +1120,10 @@ static int dw_mipi_dsi_connector_init(struct display_state *state) ret = uclass_get_device_by_name(UCLASS_DISPLAY, #if defined(CONFIG_ROCKCHIP_RK3288) "dsi@ff964000", -#else +#elif defined(CONFIG_ROCKCHIP_RK3399) "dsi@ff968000", +#else + "dsi@fe070000", #endif &dev); if (ret) @@ -1132,6 +1139,26 @@ static int dw_mipi_dsi_connector_init(struct display_state *state) dsi->slave->mode_flags = dsi->mode_flags; dsi->slave->channel = dsi->channel; conn_state->output_type = ROCKCHIP_OUTPUT_DSI_DUAL_CHANNEL; + conn_state->output_if |= VOP_OUTPUT_IF_MIPI1; + +#if defined(CONFIG_ROCKCHIP_RK3568) + struct rockchip_phy *phy = NULL; + struct udevice *phy_dev; + + ret = uclass_get_device_by_phandle(UCLASS_PHY, dev, + "phys", &phy_dev); + if (ret) + return -ENODEV; + + phy = (struct rockchip_phy *)dev_get_driver_data(phy_dev); + if (!phy) + return -ENODEV; + + dsi->slave->dphy.phy = phy; + if (phy->funcs && phy->funcs->init) + return phy->funcs->init(phy); +#endif + } return 0; @@ -1242,6 +1269,9 @@ static int dw_mipi_dsi_connector_prepare(struct display_state *state) else dw_mipi_dsi_set_pll(dsi, lane_rate); + if (dsi->slave && dsi->slave->dphy.phy) + dw_mipi_dsi_set_hs_clk(dsi->slave, lane_rate); + printf("final DSI-Link bandwidth: %u Mbps x %d\n", dsi->lane_mbps, dsi->slave ? dsi->lanes * 2 : dsi->lanes); @@ -1481,6 +1511,36 @@ static const struct rockchip_connector rk3399_mipi_dsi_driver_data = { .data = &rk3399_mipi_dsi_plat_data, }; +static const u32 rk3568_dsi0_grf_reg_fields[MAX_FIELDS] = { + [DPIUPDATECFG] = GRF_REG_FIELD(0x0360, 2, 2), + [DPICOLORM] = GRF_REG_FIELD(0x0360, 1, 1), + [DPISHUTDN] = GRF_REG_FIELD(0x0360, 0, 0), + [SKEWCALHS] = GRF_REG_FIELD(0x0368, 11, 15), + [FORCETXSTOPMODE] = GRF_REG_FIELD(0x0368, 4, 7), + [TURNDISABLE] = GRF_REG_FIELD(0x0368, 2, 2), + [FORCERXMODE] = GRF_REG_FIELD(0x0368, 0, 0), +}; + +static const u32 rk3568_dsi1_grf_reg_fields[MAX_FIELDS] = { + [DPIUPDATECFG] = GRF_REG_FIELD(0x0360, 10, 10), + [DPICOLORM] = GRF_REG_FIELD(0x0360, 9, 9), + [DPISHUTDN] = GRF_REG_FIELD(0x0360, 8, 8), + [SKEWCALHS] = GRF_REG_FIELD(0x036c, 11, 15), + [FORCETXSTOPMODE] = GRF_REG_FIELD(0x036c, 4, 7), + [TURNDISABLE] = GRF_REG_FIELD(0x036c, 2, 2), + [FORCERXMODE] = GRF_REG_FIELD(0x036c, 0, 0), +}; + +static const struct dw_mipi_dsi_plat_data rk3568_mipi_dsi_plat_data = { + .dsi0_grf_reg_fields = rk3568_dsi0_grf_reg_fields, + .dsi1_grf_reg_fields = rk3568_dsi1_grf_reg_fields, + .max_bit_rate_per_lane = 1000000000UL, +}; +static const struct rockchip_connector rk3568_mipi_dsi_driver_data = { + .funcs = &dw_mipi_dsi_connector_funcs, + .data = &rk3568_mipi_dsi_plat_data, +}; + static const u32 rv1108_dsi_grf_reg_fields[MAX_FIELDS] = { [DPICOLORM] = GRF_REG_FIELD(0x0410, 7, 7), [DPISHUTDN] = GRF_REG_FIELD(0x0410, 6, 6), @@ -1548,6 +1608,10 @@ static const struct udevice_id dw_mipi_dsi_ids[] = { .compatible = "rockchip,rk3399-mipi-dsi", .data = (ulong)&rk3399_mipi_dsi_driver_data, }, + { + .compatible = "rockchip,rk3568-mipi-dsi", + .data = (ulong)&rk3568_mipi_dsi_driver_data, + }, { .compatible = "rockchip,rv1108-mipi-dsi", .data = (ulong)&rv1108_mipi_dsi_driver_data,