
On Thu, 11 Jul 2019 at 17:26, Igor Opaniuk igor.opaniuk@gmail.com wrote:
- Oleksandr, Philippe
On Mon, Jun 10, 2019 at 2:47 PM Igor Opaniuk igor.opaniuk@gmail.com wrote:
From: Igor Opaniuk igor.opaniuk@toradex.com
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
Reviewed-by: Oleksandr Suvorov oleksandr.suvorov@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.17.1
-- Best regards - Freundliche GrĂ¼sse - Meilleures salutations
Igor Opaniuk
mailto: igor.opaniuk@gmail.com skype: igor.opanyuk +380 (93) 836 40 67 http://ua.linkedin.com/in/iopaniuk _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot