From: Chaoyi Chen <[email protected]>

Different chips have varying support for the maximum bit rate per lane.

Add calculation for the maximum per lane bit rate for various chip
platforms.

Signed-off-by: Chaoyi Chen <[email protected]>
---
Changes in v3:
- Rebase to Linux v7.2

Changes in v2:
- Fix the unit conversion for max_mbps.
- Split the lane rate calculation into a separate patch.

---
 drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c 
b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
index 3547d91b25d3..1060abec9f29 100644
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
@@ -268,6 +268,7 @@ struct rockchip_dw_dsi_chip_data {
 
        unsigned int flags;
        unsigned int max_data_lanes;
+       unsigned long max_bit_rate_per_lane;
 };
 
 struct dw_mipi_dsi_rockchip {
@@ -565,7 +566,7 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, const struct 
drm_display_mode *mode,
        int bpp;
        unsigned long mpclk, tmp;
        unsigned int target_mbps = 1000;
-       unsigned int max_mbps = dppa_map[ARRAY_SIZE(dppa_map) - 1].max_mbps;
+       unsigned int max_mbps;
        unsigned long best_freq = 0;
        unsigned long fvco_min, fvco_max, fin, fout;
        unsigned int min_prediv, max_prediv;
@@ -573,6 +574,7 @@ dw_mipi_dsi_get_lane_mbps(void *priv_data, const struct 
drm_display_mode *mode,
        unsigned long _fbdiv, best_fbdiv;
        unsigned long min_delta = ULONG_MAX;
 
+       max_mbps = dsi->cdata->max_bit_rate_per_lane / USEC_PER_SEC;
        dsi->format = format;
        bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
        if (bpp < 0) {
@@ -1503,6 +1505,7 @@ static const struct rockchip_dw_dsi_chip_data 
px30_chip_data[] = {
                                                PX30_DSI_FORCETXSTOPMODE), 0),
 
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1000000000UL,
        },
        { /* sentinel */ }
 };
@@ -1515,6 +1518,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3128_chip_data[] = {
                                                RK3128_DSI_FORCERXMODE |
                                                RK3128_DSI_FORCETXSTOPMODE), 0),
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1000000000UL,
        },
        { /* sentinel */ }
 };
@@ -1527,6 +1531,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3288_chip_data[] = {
                .lcdsel_lit = FIELD_PREP_WM16_CONST(RK3288_DSI0_LCDC_SEL, 1),
 
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1500000000UL,
        },
        {
                .reg = 0xff964000,
@@ -1535,6 +1540,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3288_chip_data[] = {
                .lcdsel_lit = FIELD_PREP_WM16_CONST(RK3288_DSI1_LCDC_SEL, 1),
 
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1500000000UL,
        },
        { /* sentinel */ }
 };
@@ -1547,6 +1553,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3368_chip_data[] = {
                                                RK3368_DSI_FORCETXSTOPMODE |
                                                RK3368_DSI_FORCERXMODE), 0),
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1500000000UL,
        },
        { /* sentinel */ }
 };
@@ -1634,6 +1641,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3399_chip_data[] = {
 
                .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1500000000UL,
        },
        {
                .reg = 0xff968000,
@@ -1658,6 +1666,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3399_chip_data[] = {
 
                .flags = DW_MIPI_NEEDS_PHY_CFG_CLK | DW_MIPI_NEEDS_GRF_CLK,
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1500000000UL,
 
                .dphy_rx_init = rk3399_dphy_tx1rx1_init,
                .dphy_rx_power_on = rk3399_dphy_tx1rx1_power_on,
@@ -1674,6 +1683,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3506_chip_data[] = {
                             FIELD_PREP_WM16_CONST(RK3506_DSI_FORCERXMODE, 0) |
                             FIELD_PREP_WM16_CONST(RK3506_DSI_FORCETXSTOPMODE, 
0)),
                .max_data_lanes = 2,
+               .max_bit_rate_per_lane = 1500000000UL,
        },
        { /* sentinel */ }
 };
@@ -1687,6 +1697,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3568_chip_data[] = {
                             FIELD_PREP_WM16_CONST(RK3568_DSI0_TURNDISABLE, 0) |
                             FIELD_PREP_WM16_CONST(RK3568_DSI0_FORCERXMODE, 0)),
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1200000000UL,
        },
        {
                .reg = 0xfe070000,
@@ -1696,6 +1707,7 @@ static const struct rockchip_dw_dsi_chip_data 
rk3568_chip_data[] = {
                             FIELD_PREP_WM16_CONST(RK3568_DSI1_TURNDISABLE, 0) |
                             FIELD_PREP_WM16_CONST(RK3568_DSI1_FORCERXMODE, 0)),
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1200000000UL,
        },
        { /* sentinel */ }
 };
@@ -1708,6 +1720,7 @@ static const struct rockchip_dw_dsi_chip_data 
rv1126_chip_data[] = {
                             FIELD_PREP_WM16_CONST(RV1126_DSI_FORCERXMODE, 0) |
                             FIELD_PREP_WM16_CONST(RV1126_DSI_FORCETXSTOPMODE, 
0)),
                .max_data_lanes = 4,
+               .max_bit_rate_per_lane = 1000000000UL,
        },
        { /* sentinel */ }
 };
-- 
2.53.0

Reply via email to