[U-Boot] [RFC 1/4] video: fsl_dcu_fb: refactor init functions

Oleksandr Suvorov oleksandr.suvorov at toradex.com
Thu Jul 11 15:16:57 UTC 2019


On Thu, 11 Jul 2019 at 17:26, Igor Opaniuk <igor.opaniuk at gmail.com> wrote:
>
> + Oleksandr, Philippe
>
> On Mon, Jun 10, 2019 at 2:47 PM Igor Opaniuk <igor.opaniuk at gmail.com> wrote:
> >
> > From: Igor Opaniuk <igor.opaniuk at 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 at toradex.com>

Reviewed-by: Oleksandr Suvorov <oleksandr.suvorov at 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.17.1
> >
>
>
> --
> Best regards - Freundliche GrĂ¼sse - Meilleures salutations
>
> Igor Opaniuk
>
> mailto: igor.opaniuk at gmail.com
> skype: igor.opanyuk
> +380 (93) 836 40 67
> http://ua.linkedin.com/in/iopaniuk
> _______________________________________________
> U-Boot mailing list
> U-Boot at 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)


More information about the U-Boot mailing list