aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.10/950-0517-staging-fbtft-Add-minipitft13-variant.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.10/950-0517-staging-fbtft-Add-minipitft13-variant.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.10/950-0517-staging-fbtft-Add-minipitft13-variant.patch105
1 files changed, 105 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.10/950-0517-staging-fbtft-Add-minipitft13-variant.patch b/target/linux/bcm27xx/patches-5.10/950-0517-staging-fbtft-Add-minipitft13-variant.patch
new file mode 100644
index 0000000000..26419b40c7
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.10/950-0517-staging-fbtft-Add-minipitft13-variant.patch
@@ -0,0 +1,105 @@
+From b279b2516d9fc40cc491b142fbf453f9533f6e4f Mon Sep 17 00:00:00 2001
+From: Phil Elwell <phil@raspberrypi.com>
+Date: Fri, 19 Feb 2021 10:25:01 +0000
+Subject: [PATCH] staging: fbtft: Add minipitft13 variant
+
+The Adafruit Mini-PiTFT13 display needs offsets applying when rotated,
+so use the "variant" mechanism to select a custom set_addr_win method
+using a dedicated compatible string of "fbtft,minipitft13".
+
+See: https://github.com/raspberrypi/firmware/issues/1524
+
+Signed-off-by: Phil Elwell <phil@raspberrypi.com>
+---
+ drivers/staging/fbtft/fb_st7789v.c | 45 +++++++++++++++++++++++++++++-
+ 1 file changed, 44 insertions(+), 1 deletion(-)
+
+--- a/drivers/staging/fbtft/fb_st7789v.c
++++ b/drivers/staging/fbtft/fb_st7789v.c
+@@ -66,6 +66,12 @@ enum st7789v_command {
+ #define MADCTL_MX BIT(6) /* bitmask for column address order */
+ #define MADCTL_MY BIT(7) /* bitmask for page address order */
+
++static u32 col_offset = 0;
++static u32 row_offset = 0;
++static u8 col_hack_fix_offset = 0;
++static short x_offset = 0;
++static short y_offset = 0;
++
+ /**
+ * init_display() - initialize the display controller
+ *
+@@ -145,6 +151,22 @@ static int init_display(struct fbtft_par
+ return 0;
+ }
+
++static void minipitft13_set_addr_win(struct fbtft_par *par, int xs, int ys,
++ int xe, int ye)
++{
++ xs += x_offset;
++ xe += x_offset;
++ ys += y_offset;
++ ye += y_offset;
++ write_reg(par, MIPI_DCS_SET_COLUMN_ADDRESS,
++ xs >> 8, xs & 0xFF, xe >> 8, xe & 0xFF);
++
++ write_reg(par, MIPI_DCS_SET_PAGE_ADDRESS,
++ ys >> 8, ys & 0xFF, ye >> 8, ye & 0xFF);
++
++ write_reg(par, MIPI_DCS_WRITE_MEMORY_START);
++}
++
+ /**
+ * set_var() - apply LCD properties like rotation and BGR mode
+ *
+@@ -155,20 +177,32 @@ static int init_display(struct fbtft_par
+ static int set_var(struct fbtft_par *par)
+ {
+ u8 madctl_par = 0;
++ struct fbtft_display *display = &par->pdata->display;
++ u32 width = display->width;
++ u32 height = display->height;
+
+ if (par->bgr)
+ madctl_par |= MADCTL_BGR;
+ switch (par->info->var.rotate) {
+ case 0:
++ x_offset = 0;
++ y_offset = 0;
+ break;
+ case 90:
+ madctl_par |= (MADCTL_MV | MADCTL_MY);
++ x_offset = (320 - height) - row_offset;
++ y_offset = (240 - width) - col_offset;
+ break;
+ case 180:
+ madctl_par |= (MADCTL_MX | MADCTL_MY);
++ x_offset = (240 - width) - col_offset + col_hack_fix_offset;
++ // hack tweak to account for extra pixel width to make even
++ y_offset = (320 - height) - row_offset;
+ break;
+ case 270:
+ madctl_par |= (MADCTL_MV | MADCTL_MX);
++ x_offset = row_offset;
++ y_offset = col_offset;
+ break;
+ default:
+ return -EINVAL;
+@@ -265,7 +299,16 @@ static struct fbtft_display display = {
+ },
+ };
+
+-FBTFT_REGISTER_DRIVER(DRVNAME, "sitronix,st7789v", &display);
++int variant_minipitft13(struct fbtft_display *display)
++{
++ display->fbtftops.set_addr_win = minipitft13_set_addr_win;
++ return 0;
++}
++
++FBTFT_REGISTER_DRIVER_START(&display)
++FBTFT_COMPATIBLE("sitronix,st7789v")
++FBTFT_VARIANT_COMPATIBLE("fbtft,minipitft13", variant_minipitft13)
++FBTFT_REGISTER_DRIVER_END(DRVNAME, &display);
+
+ MODULE_ALIAS("spi:" DRVNAME);
+ MODULE_ALIAS("platform:" DRVNAME);