summaryrefslogtreecommitdiff
path: root/recipes-bsp/u-boot-mainline/files/0002-video-fsl_dcu_fb-refactor-init-functions.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-bsp/u-boot-mainline/files/0002-video-fsl_dcu_fb-refactor-init-functions.patch')
-rw-r--r--recipes-bsp/u-boot-mainline/files/0002-video-fsl_dcu_fb-refactor-init-functions.patch288
1 files changed, 288 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot-mainline/files/0002-video-fsl_dcu_fb-refactor-init-functions.patch b/recipes-bsp/u-boot-mainline/files/0002-video-fsl_dcu_fb-refactor-init-functions.patch
new file mode 100644
index 0000000..c9ff05e
--- /dev/null
+++ b/recipes-bsp/u-boot-mainline/files/0002-video-fsl_dcu_fb-refactor-init-functions.patch
@@ -0,0 +1,288 @@
+From 8882f63a9c5d15e54587fa3ab791759584049098 Mon Sep 17 00:00:00 2001
+From: Igor Opaniuk <igor.opaniuk@toradex.com>
+Date: Mon, 10 Jun 2019 14:47:49 +0300
+Subject: [PATCH 2/7] video: fsl_dcu_fb: refactor init functions
+
+Move dcu-related code to fsl_dcu_probe_common, keep in video_hw_init()
+only legacy video stack (filling GraphicPanel struct etc.).
+
+Add wrappers for all init functions, that will let to provide
+struct fb_info as an additional param (needed for further moving it from
+the global scope to driver private data struct in DM converted driver).
+
+Signed-off-by: Igor Opaniuk <igor.opaniuk@toradex.com>
+---
+ board/freescale/ls1021aqds/dcu.c | 6 ++-
+ board/toradex/colibri_vf/dcu.c | 6 ++-
+ drivers/video/fsl_dcu_fb.c | 107 ++++++++++++++++++++++-----------------
+ include/fsl_dcu_fb.h | 12 +++--
+ 4 files changed, 77 insertions(+), 54 deletions(-)
+
+diff --git a/board/freescale/ls1021aqds/dcu.c b/board/freescale/ls1021aqds/dcu.c
+index 14855ea1d9..c4eac5e302 100644
+--- a/board/freescale/ls1021aqds/dcu.c
++++ b/board/freescale/ls1021aqds/dcu.c
+@@ -39,7 +39,9 @@ unsigned int dcu_set_pixel_clock(unsigned int pixclock)
+ return div;
+ }
+
+-int platform_dcu_init(unsigned int xres, unsigned int yres,
++int platform_dcu_init(struct fb_info *fbinfo,
++ unsigned int xres,
++ unsigned int yres,
+ const char *port,
+ struct fb_videomode *dcu_fb_videomode)
+ {
+@@ -85,7 +87,7 @@ int platform_dcu_init(unsigned int xres, unsigned int yres,
+ printf("DCU: Switching to %s monitor @ %ux%u\n", name, xres, yres);
+
+ pixel_format = 32;
+- fsl_dcu_init(xres, yres, pixel_format);
++ fsl_dcu_init(fbinfo, xres, yres, pixel_format);
+
+ return 0;
+ }
+diff --git a/board/toradex/colibri_vf/dcu.c b/board/toradex/colibri_vf/dcu.c
+index c36e90cd22..c688ed79ff 100644
+--- a/board/toradex/colibri_vf/dcu.c
++++ b/board/toradex/colibri_vf/dcu.c
+@@ -26,11 +26,13 @@ unsigned int dcu_set_pixel_clock(unsigned int pixclock)
+ return div;
+ }
+
+-int platform_dcu_init(unsigned int xres, unsigned int yres,
++int platform_dcu_init(struct fb_info *fbinfo,
++ unsigned int xres,
++ unsigned int yres,
+ const char *port,
+ struct fb_videomode *dcu_fb_videomode)
+ {
+- fsl_dcu_init(xres, yres, 32);
++ fsl_dcu_init(fbinfo, xres, yres, 32);
+
+ return 0;
+ }
+diff --git a/drivers/video/fsl_dcu_fb.c b/drivers/video/fsl_dcu_fb.c
+index 9f6e7f83b0..f789ec597d 100644
+--- a/drivers/video/fsl_dcu_fb.c
++++ b/drivers/video/fsl_dcu_fb.c
+@@ -1,6 +1,7 @@
+ // SPDX-License-Identifier: GPL-2.0+
+ /*
+ * Copyright 2014 Freescale Semiconductor, Inc.
++ * Copyright 2019 Toradex AG
+ *
+ * FSL DCU Framebuffer driver
+ */
+@@ -240,20 +241,22 @@ static void reset_total_layers(void)
+ }
+ }
+
+-static int layer_ctrldesc_init(int index, u32 pixel_format)
++static int layer_ctrldesc_init(struct fb_info fbinfo,
++ int index, u32 pixel_format)
+ {
+ struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
+ unsigned int bpp = BPP_24_RGB888;
+
+ dcu_write32(&regs->ctrldescl[index][0],
+- DCU_CTRLDESCLN_1_HEIGHT(info.var.yres) |
+- DCU_CTRLDESCLN_1_WIDTH(info.var.xres));
++ DCU_CTRLDESCLN_1_HEIGHT(fbinfo.var.yres) |
++ DCU_CTRLDESCLN_1_WIDTH(fbinfo.var.xres));
+
+ dcu_write32(&regs->ctrldescl[index][1],
+ DCU_CTRLDESCLN_2_POSY(0) |
+ DCU_CTRLDESCLN_2_POSX(0));
+
+- dcu_write32(&regs->ctrldescl[index][2], (unsigned int)info.screen_base);
++ dcu_write32(&regs->ctrldescl[index][2],
++ (unsigned int)fbinfo.screen_base);
+
+ switch (pixel_format) {
+ case 16:
+@@ -294,42 +297,42 @@ static int layer_ctrldesc_init(int index, u32 pixel_format)
+ return 0;
+ }
+
+-int fsl_dcu_init(unsigned int xres, unsigned int yres,
+- unsigned int pixel_format)
++int fsl_dcu_init(struct fb_info *fbinfo, unsigned int xres,
++ unsigned int yres, unsigned int pixel_format)
+ {
+ struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
+ unsigned int div, mode;
+
+- info.screen_size =
+- info.var.xres * info.var.yres * (info.var.bits_per_pixel / 8);
++ fbinfo->screen_size = fbinfo->var.xres * fbinfo->var.yres *
++ (fbinfo->var.bits_per_pixel / 8);
+
+- if (info.screen_size > CONFIG_VIDEO_FSL_DCU_MAX_FB_SIZE_MB) {
+- info.screen_size = 0;
++ if (fbinfo->screen_size > CONFIG_VIDEO_FSL_DCU_MAX_FB_SIZE_MB) {
++ fbinfo->screen_size = 0;
+ return -ENOMEM;
+ }
+
+ /* Reserve framebuffer at the end of memory */
+ gd->fb_base = gd->bd->bi_dram[0].start +
+- gd->bd->bi_dram[0].size - info.screen_size;
+- info.screen_base = (char *)gd->fb_base;
++ gd->bd->bi_dram[0].size - fbinfo->screen_size;
++ fbinfo->screen_base = (char *)gd->fb_base;
+
+- memset(info.screen_base, 0, info.screen_size);
++ memset(fbinfo->screen_base, 0, fbinfo->screen_size);
+
+ reset_total_layers();
+
+ dcu_write32(&regs->disp_size,
+- DCU_DISP_SIZE_DELTA_Y(info.var.yres) |
+- DCU_DISP_SIZE_DELTA_X(info.var.xres / 16));
++ DCU_DISP_SIZE_DELTA_Y(fbinfo->var.yres) |
++ DCU_DISP_SIZE_DELTA_X(fbinfo->var.xres / 16));
+
+ dcu_write32(&regs->hsyn_para,
+- DCU_HSYN_PARA_BP(info.var.left_margin) |
+- DCU_HSYN_PARA_PW(info.var.hsync_len) |
+- DCU_HSYN_PARA_FP(info.var.right_margin));
++ DCU_HSYN_PARA_BP(fbinfo->var.left_margin) |
++ DCU_HSYN_PARA_PW(fbinfo->var.hsync_len) |
++ DCU_HSYN_PARA_FP(fbinfo->var.right_margin));
+
+ dcu_write32(&regs->vsyn_para,
+- DCU_VSYN_PARA_BP(info.var.upper_margin) |
+- DCU_VSYN_PARA_PW(info.var.vsync_len) |
+- DCU_VSYN_PARA_FP(info.var.lower_margin));
++ DCU_VSYN_PARA_BP(fbinfo->var.upper_margin) |
++ DCU_VSYN_PARA_PW(fbinfo->var.vsync_len) |
++ DCU_VSYN_PARA_FP(fbinfo->var.lower_margin));
+
+ dcu_write32(&regs->synpol,
+ DCU_SYN_POL_INV_PXCK_FALL |
+@@ -352,9 +355,9 @@ int fsl_dcu_init(unsigned int xres, unsigned int yres,
+ mode = dcu_read32(&regs->mode);
+ dcu_write32(&regs->mode, mode | DCU_MODE_NORMAL);
+
+- layer_ctrldesc_init(0, pixel_format);
++ layer_ctrldesc_init(*fbinfo, 0, pixel_format);
+
+- div = dcu_set_pixel_clock(info.var.pixclock);
++ div = dcu_set_pixel_clock(fbinfo->var.pixclock);
+ dcu_write32(&regs->div_ratio, (div - 1));
+
+ dcu_write32(&regs->update_mode, DCU_UPDATE_MODE_READREG);
+@@ -367,24 +370,26 @@ ulong board_get_usable_ram_top(ulong total_size)
+ return gd->ram_top - CONFIG_VIDEO_FSL_DCU_MAX_FB_SIZE_MB;
+ }
+
+-void *video_hw_init(void)
++int fsl_probe_common(struct fb_info *fbinfo, unsigned int *win_x,
++ unsigned int *win_y)
+ {
+- static GraphicDevice ctfb;
+ const char *options;
+ unsigned int depth = 0, freq = 0;
++
+ struct fb_videomode *fsl_dcu_mode_db = &fsl_dcu_mode_480_272;
+
+- if (!video_get_video_mode(&ctfb.winSizeX, &ctfb.winSizeY, &depth, &freq,
++ if (!video_get_video_mode(win_x, win_y, &depth, &freq,
+ &options))
+- return NULL;
++ return -EINVAL;
+
+ /* Find the monitor port, which is a required option */
+ if (!options)
+- return NULL;
++ return -EINVAL;
++
+ if (strncmp(options, "monitor=", 8) != 0)
+- return NULL;
++ return -EINVAL;
+
+- switch (RESOLUTION(ctfb.winSizeX, ctfb.winSizeY)) {
++ switch (RESOLUTION(*win_x, *win_y)) {
+ case RESOLUTION(480, 272):
+ fsl_dcu_mode_db = &fsl_dcu_mode_480_272;
+ break;
+@@ -402,25 +407,33 @@ void *video_hw_init(void)
+ break;
+ default:
+ printf("unsupported resolution %ux%u\n",
+- ctfb.winSizeX, ctfb.winSizeY);
++ *win_x, *win_y);
+ }
+
+- info.var.xres = fsl_dcu_mode_db->xres;
+- info.var.yres = fsl_dcu_mode_db->yres;
+- info.var.bits_per_pixel = 32;
+- info.var.pixclock = fsl_dcu_mode_db->pixclock;
+- info.var.left_margin = fsl_dcu_mode_db->left_margin;
+- info.var.right_margin = fsl_dcu_mode_db->right_margin;
+- info.var.upper_margin = fsl_dcu_mode_db->upper_margin;
+- info.var.lower_margin = fsl_dcu_mode_db->lower_margin;
+- info.var.hsync_len = fsl_dcu_mode_db->hsync_len;
+- info.var.vsync_len = fsl_dcu_mode_db->vsync_len;
+- info.var.sync = fsl_dcu_mode_db->sync;
+- info.var.vmode = fsl_dcu_mode_db->vmode;
+- info.fix.line_length = info.var.xres * info.var.bits_per_pixel / 8;
+-
+- if (platform_dcu_init(ctfb.winSizeX, ctfb.winSizeY,
+- options + 8, fsl_dcu_mode_db) < 0)
++ fbinfo->var.xres = fsl_dcu_mode_db->xres;
++ fbinfo->var.yres = fsl_dcu_mode_db->yres;
++ fbinfo->var.bits_per_pixel = 32;
++ fbinfo->var.pixclock = fsl_dcu_mode_db->pixclock;
++ fbinfo->var.left_margin = fsl_dcu_mode_db->left_margin;
++ fbinfo->var.right_margin = fsl_dcu_mode_db->right_margin;
++ fbinfo->var.upper_margin = fsl_dcu_mode_db->upper_margin;
++ fbinfo->var.lower_margin = fsl_dcu_mode_db->lower_margin;
++ fbinfo->var.hsync_len = fsl_dcu_mode_db->hsync_len;
++ fbinfo->var.vsync_len = fsl_dcu_mode_db->vsync_len;
++ fbinfo->var.sync = fsl_dcu_mode_db->sync;
++ fbinfo->var.vmode = fsl_dcu_mode_db->vmode;
++ fbinfo->fix.line_length = fbinfo->var.xres *
++ fbinfo->var.bits_per_pixel / 8;
++
++ return platform_dcu_init(fbinfo, *win_x, *win_y,
++ options + 8, fsl_dcu_mode_db);
++}
++
++void *video_hw_init(void)
++{
++ static GraphicDevice ctfb;
++
++ if (fsl_probe_common(&info, &ctfb.winSizeX, &ctfb.winSizeY) < 0)
+ return NULL;
+
+ ctfb.frameAdrs = (unsigned int)info.screen_base;
+diff --git a/include/fsl_dcu_fb.h b/include/fsl_dcu_fb.h
+index 2dd5f54c3e..7a5347a924 100644
+--- a/include/fsl_dcu_fb.h
++++ b/include/fsl_dcu_fb.h
+@@ -6,11 +6,17 @@
+ */
+ #include <linux/fb.h>
+
+-int fsl_dcu_init(unsigned int xres, unsigned int yres,
++int fsl_dcu_init(struct fb_info *fbinfo,
++ unsigned int xres,
++ unsigned int yres,
+ unsigned int pixel_format);
++
+ int fsl_dcu_fixedfb_setup(void *blob);
+
+ /* Prototypes for external board-specific functions */
+-int platform_dcu_init(unsigned int xres, unsigned int yres,
+- const char *port, struct fb_videomode *dcu_fb_videomode);
++int platform_dcu_init(struct fb_info *fbinfo,
++ unsigned int xres,
++ unsigned int yres,
++ const char *port,
++ struct fb_videomode *dcu_fb_videomode);
+ unsigned int dcu_set_pixel_clock(unsigned int pixclock);
+--
+2.13.6
+