The LCD controller expects timing values in dot-clock ticks, which is 3x
the timing values in pixels when using a 3x8-bit display; but it will
count the display area size in pixels either way. Go figure.

Signed-off-by: Paul Cercueil <p...@crapouillou.net>
---
 drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c 
b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index 998c63061fa8..0b2311b32b81 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -643,6 +643,7 @@ static int ingenic_drm_encoder_atomic_check(struct 
drm_encoder *encoder,
                                            struct drm_connector_state 
*conn_state)
 {
        struct drm_display_info *info = &conn_state->connector->display_info;
+       struct drm_display_mode *mode = &crtc_state->adjusted_mode;
 
        if (info->num_bus_formats != 1)
                return -EINVAL;
@@ -651,10 +652,22 @@ static int ingenic_drm_encoder_atomic_check(struct 
drm_encoder *encoder,
                return 0;
 
        switch (*info->bus_formats) {
+       case MEDIA_BUS_FMT_RGB888_3X8:
+               /*
+                * The LCD controller expects timing values in dot-clock ticks,
+                * which is 3x the timing values in pixels when using a 3x8-bit
+                * display; but it will count the display area size in pixels
+                * either way. Go figure.
+                */
+               mode->crtc_clock = mode->clock * 3;
+               mode->crtc_hsync_start = mode->hsync_start * 3 - mode->hdisplay 
* 2;
+               mode->crtc_hsync_end = mode->hsync_end * 3 - mode->hdisplay * 2;
+               mode->crtc_hdisplay = mode->hdisplay;
+               mode->crtc_htotal = mode->htotal * 3 - mode->hdisplay * 2;
+               return 0;
        case MEDIA_BUS_FMT_RGB565_1X16:
        case MEDIA_BUS_FMT_RGB666_1X18:
        case MEDIA_BUS_FMT_RGB888_1X24:
-       case MEDIA_BUS_FMT_RGB888_3X8:
                return 0;
        default:
                return -EINVAL;
-- 
2.29.2

Reply via email to