On Thu, 11 Jul 2019 at 17:26, Igor Opaniuk <igor.opan...@gmail.com> wrote: > > + Oleksandr, Philippe > > On Mon, Jun 10, 2019 at 2:47 PM Igor Opaniuk <igor.opan...@gmail.com> wrote: > > > > From: Igor Opaniuk <igor.opan...@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.opan...@toradex.com>
Reviewed-by: Oleksandr Suvorov <oleksandr.suvo...@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.opan...@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 -- Best regards Oleksandr Suvorov Toradex AG Altsagenstrasse 5 | 6048 Horw/Luzern | Switzerland | T: +41 41 500 4800 (main line) _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot