drm/mipi_dbi: Add support for display offsets
authorGeert Uytterhoeven <geert+renesas@glider.be>
Wed, 15 Jan 2020 12:45:46 +0000 (13:45 +0100)
committerSam Ravnborg <sam@ravnborg.org>
Sun, 19 Jan 2020 17:07:08 +0000 (18:07 +0100)
If the resolution of the TFT display is smaller than the maximum
resolution supported by the display controller, the display may be
connected to the driver output arrays with a horizontal and/or vertical
offset, leading to a shifted image.

Add support for specifying these offsets.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20200115124548.3951-4-geert+renesas@glider.be
drivers/gpu/drm/drm_mipi_dbi.c
include/drm/drm_mipi_dbi.h

index 16bff1b..27fe81a 100644 (file)
@@ -238,6 +238,23 @@ int mipi_dbi_buf_copy(void *dst, struct drm_framebuffer *fb,
 }
 EXPORT_SYMBOL(mipi_dbi_buf_copy);
 
+static void mipi_dbi_set_window_address(struct mipi_dbi_dev *dbidev,
+                                       unsigned int xs, unsigned int xe,
+                                       unsigned int ys, unsigned int ye)
+{
+       struct mipi_dbi *dbi = &dbidev->dbi;
+
+       xs += dbidev->left_offset;
+       xe += dbidev->left_offset;
+       ys += dbidev->top_offset;
+       ye += dbidev->top_offset;
+
+       mipi_dbi_command(dbi, MIPI_DCS_SET_COLUMN_ADDRESS, (xs >> 8) & 0xff,
+                        xs & 0xff, (xe >> 8) & 0xff, xe & 0xff);
+       mipi_dbi_command(dbi, MIPI_DCS_SET_PAGE_ADDRESS, (ys >> 8) & 0xff,
+                        ys & 0xff, (ye >> 8) & 0xff, ye & 0xff);
+}
+
 static void mipi_dbi_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
 {
        struct drm_gem_object *gem = drm_gem_fb_get_obj(fb, 0);
@@ -271,12 +288,8 @@ static void mipi_dbi_fb_dirty(struct drm_framebuffer *fb, struct drm_rect *rect)
                tr = cma_obj->vaddr;
        }
 
-       mipi_dbi_command(dbi, MIPI_DCS_SET_COLUMN_ADDRESS,
-                        (rect->x1 >> 8) & 0xff, rect->x1 & 0xff,
-                        ((rect->x2 - 1) >> 8) & 0xff, (rect->x2 - 1) & 0xff);
-       mipi_dbi_command(dbi, MIPI_DCS_SET_PAGE_ADDRESS,
-                        (rect->y1 >> 8) & 0xff, rect->y1 & 0xff,
-                        ((rect->y2 - 1) >> 8) & 0xff, (rect->y2 - 1) & 0xff);
+       mipi_dbi_set_window_address(dbidev, rect->x1, rect->x2 - 1, rect->y1,
+                                   rect->y2 - 1);
 
        ret = mipi_dbi_command_buf(dbi, MIPI_DCS_WRITE_MEMORY_START, tr,
                                   width * height * 2);
@@ -366,10 +379,7 @@ static void mipi_dbi_blank(struct mipi_dbi_dev *dbidev)
 
        memset(dbidev->tx_buf, 0, len);
 
-       mipi_dbi_command(dbi, MIPI_DCS_SET_COLUMN_ADDRESS, 0, 0,
-                        ((width - 1) >> 8) & 0xFF, (width - 1) & 0xFF);
-       mipi_dbi_command(dbi, MIPI_DCS_SET_PAGE_ADDRESS, 0, 0,
-                        ((height - 1) >> 8) & 0xFF, (height - 1) & 0xFF);
+       mipi_dbi_set_window_address(dbidev, 0, width - 1, 0, height - 1);
        mipi_dbi_command_buf(dbi, MIPI_DCS_WRITE_MEMORY_START,
                             (u8 *)dbidev->tx_buf, len);
 
index 67c66f5..33f325f 100644 (file)
@@ -110,6 +110,18 @@ struct mipi_dbi_dev {
        unsigned int rotation;
 
        /**
+        * @left_offset: Horizontal offset of the display relative to the
+        *               controller's driver array
+        */
+       unsigned int left_offset;
+
+       /**
+        * @top_offset: Vertical offset of the display relative to the
+        *              controller's driver array
+        */
+       unsigned int top_offset;
+
+       /**
         * @backlight: backlight device (optional)
         */
        struct backlight_device *backlight;