Merge tag 'drm-misc-next-2023-09-11-1' of git://anongit.freedesktop.org/drm/drm-misc...
[sfrench/cifs-2.6.git] / drivers / gpu / drm / bridge / samsung-dsim.c
index cf777bdb25d2a4642c0af1cb81347fb865938461..19bdb32dbc9aa07da865e8bcb323f424f2f984b9 100644 (file)
@@ -385,7 +385,7 @@ static const unsigned int imx8mm_dsim_reg_values[] = {
        [RESET_TYPE] = DSIM_SWRST,
        [PLL_TIMER] = 500,
        [STOP_STATE_CNT] = 0xf,
-       [PHYCTRL_ULPS_EXIT] = 0,
+       [PHYCTRL_ULPS_EXIT] = DSIM_PHYCTRL_ULPS_EXIT(0xaf),
        [PHYCTRL_VREG_LP] = 0,
        [PHYCTRL_SLEW_UP] = 0,
        [PHYTIMING_LPX] = DSIM_PHYTIMING_LPX(0x06),
@@ -413,6 +413,7 @@ static const struct samsung_dsim_driver_data exynos3_dsi_driver_data = {
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
+       .has_broken_fifoctrl_emptyhdr = 1,
 };
 
 static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
@@ -429,6 +430,7 @@ static const struct samsung_dsim_driver_data exynos4_dsi_driver_data = {
        .m_min = 41,
        .m_max = 125,
        .min_freq = 500,
+       .has_broken_fifoctrl_emptyhdr = 1,
 };
 
 static const struct samsung_dsim_driver_data exynos5_dsi_driver_data = {
@@ -1010,8 +1012,20 @@ static int samsung_dsim_wait_for_hdr_fifo(struct samsung_dsim *dsi)
        do {
                u32 reg = samsung_dsim_read(dsi, DSIM_FIFOCTRL_REG);
 
-               if (reg & DSIM_SFR_HEADER_EMPTY)
-                       return 0;
+               if (!dsi->driver_data->has_broken_fifoctrl_emptyhdr) {
+                       if (reg & DSIM_SFR_HEADER_EMPTY)
+                               return 0;
+               } else {
+                       if (!(reg & DSIM_SFR_HEADER_FULL)) {
+                               /*
+                                * Wait a little bit, so the pending data can
+                                * actually leave the FIFO to avoid overflow.
+                                */
+                               if (!cond_resched())
+                                       usleep_range(950, 1050);
+                               return 0;
+                       }
+               }
 
                if (!cond_resched())
                        usleep_range(950, 1050);