diff options
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.patch | 288 |
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(®s->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(®s->ctrldescl[index][1], + DCU_CTRLDESCLN_2_POSY(0) | + DCU_CTRLDESCLN_2_POSX(0)); + +- dcu_write32(®s->ctrldescl[index][2], (unsigned int)info.screen_base); ++ dcu_write32(®s->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(®s->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(®s->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(®s->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(®s->synpol, + DCU_SYN_POL_INV_PXCK_FALL | +@@ -352,9 +355,9 @@ int fsl_dcu_init(unsigned int xres, unsigned int yres, + mode = dcu_read32(®s->mode); + dcu_write32(®s->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(®s->div_ratio, (div - 1)); + + dcu_write32(®s->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 + |