summaryrefslogtreecommitdiff
path: root/recipes-bsp/u-boot-mainline/files/0003-video-fsl_dcu_fb-add-DM_VIDEO-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-bsp/u-boot-mainline/files/0003-video-fsl_dcu_fb-add-DM_VIDEO-support.patch')
-rw-r--r--recipes-bsp/u-boot-mainline/files/0003-video-fsl_dcu_fb-add-DM_VIDEO-support.patch229
1 files changed, 229 insertions, 0 deletions
diff --git a/recipes-bsp/u-boot-mainline/files/0003-video-fsl_dcu_fb-add-DM_VIDEO-support.patch b/recipes-bsp/u-boot-mainline/files/0003-video-fsl_dcu_fb-add-DM_VIDEO-support.patch
new file mode 100644
index 0000000..200bd27
--- /dev/null
+++ b/recipes-bsp/u-boot-mainline/files/0003-video-fsl_dcu_fb-add-DM_VIDEO-support.patch
@@ -0,0 +1,229 @@
+From da8fee6e8e96c0737d842f6a3f988670ca35bb83 Mon Sep 17 00:00:00 2001
+From: Igor Opaniuk <igor.opaniuk@toradex.com>
+Date: Mon, 10 Jun 2019 14:47:50 +0300
+Subject: [PATCH 3/7] video: fsl_dcu_fb: add DM_VIDEO support
+
+Extend the driver to build with DM_VIDEO enabled. DTS files
+must additionally include 'u-boot,dm-pre-reloc' property in
+soc and child nodes to enable driver binding to fsl_dcu_fb device.
+
+Currently display timings aren't obtained from DT.
+
+Signed-off-by: Igor Opaniuk <igor.opaniuk@toradex.com>
+---
+ board/toradex/colibri_vf/colibri_vf.c | 4 +-
+ drivers/video/Kconfig | 2 +-
+ drivers/video/fsl_dcu_fb.c | 112 ++++++++++++++++++++++++++++------
+ 3 files changed, 97 insertions(+), 21 deletions(-)
+
+diff --git a/board/toradex/colibri_vf/colibri_vf.c b/board/toradex/colibri_vf/colibri_vf.c
+index 9d63fbf3bd..dad754b31f 100644
+--- a/board/toradex/colibri_vf/colibri_vf.c
++++ b/board/toradex/colibri_vf/colibri_vf.c
+@@ -430,7 +430,9 @@ int checkboard(void)
+ #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
+ int ft_board_setup(void *blob, bd_t *bd)
+ {
++#ifndef CONFIG_DM_VIDEO
+ int ret = 0;
++#endif
+ #ifdef CONFIG_FDT_FIXUP_PARTITIONS
+ static const struct node_info nodes[] = {
+ { "fsl,vf610-nfc", MTD_DEV_TYPE_NAND, }, /* NAND flash */
+@@ -440,7 +442,7 @@ int ft_board_setup(void *blob, bd_t *bd)
+ puts(" Updating MTD partitions...\n");
+ fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
+ #endif
+-#ifdef CONFIG_VIDEO_FSL_DCU_FB
++#if defined(CONFIG_VIDEO_FSL_DCU_FB) && !defined(CONFIG_DM_VIDEO)
+ ret = fsl_dcu_fixedfb_setup(blob);
+ if (ret)
+ return ret;
+diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
+index a40df01500..f6f00c2830 100644
+--- a/drivers/video/Kconfig
++++ b/drivers/video/Kconfig
+@@ -484,7 +484,7 @@ config VIDEO_IVYBRIDGE_IGD
+
+ config VIDEO_FSL_DCU_FB
+ bool "Enable Freescale Display Control Unit"
+- depends on VIDEO
++ depends on VIDEO || DM_VIDEO
+ help
+ This enables support for Freescale Display Control Unit (DCU4)
+ module found on Freescale Vybrid and QorIQ family of SoCs.
+diff --git a/drivers/video/fsl_dcu_fb.c b/drivers/video/fsl_dcu_fb.c
+index f789ec597d..add64b85b5 100644
+--- a/drivers/video/fsl_dcu_fb.c
++++ b/drivers/video/fsl_dcu_fb.c
+@@ -8,10 +8,12 @@
+
+ #include <asm/io.h>
+ #include <common.h>
++#include <dm.h>
+ #include <fdt_support.h>
+ #include <fsl_dcu_fb.h>
+ #include <linux/fb.h>
+ #include <malloc.h>
++#include <video.h>
+ #include <video_fb.h>
+ #include "videomodes.h"
+
+@@ -219,8 +221,6 @@ struct dcu_reg {
+ u32 ctrldescl[DCU_LAYER_MAX_NUM][16];
+ };
+
+-static struct fb_info info;
+-
+ static void reset_total_layers(void)
+ {
+ struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
+@@ -302,7 +302,11 @@ int fsl_dcu_init(struct fb_info *fbinfo, unsigned int xres,
+ {
+ struct dcu_reg *regs = (struct dcu_reg *)CONFIG_SYS_DCU_ADDR;
+ unsigned int div, mode;
+-
++/*
++ * When DM_VIDEO is enabled reservation of framebuffer is done
++ * in advance during bind() call.
++ */
++#if !CONFIG_IS_ENABLED(DM_VIDEO)
+ fbinfo->screen_size = fbinfo->var.xres * fbinfo->var.yres *
+ (fbinfo->var.bits_per_pixel / 8);
+
+@@ -310,13 +314,13 @@ int fsl_dcu_init(struct fb_info *fbinfo, unsigned int xres,
+ 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 - fbinfo->screen_size;
+ fbinfo->screen_base = (char *)gd->fb_base;
+
+ memset(fbinfo->screen_base, 0, fbinfo->screen_size);
++#endif
+
+ reset_total_layers();
+
+@@ -429,6 +433,32 @@ int fsl_probe_common(struct fb_info *fbinfo, unsigned int *win_x,
+ options + 8, fsl_dcu_mode_db);
+ }
+
++#ifndef CONFIG_DM_VIDEO
++static struct fb_info info;
++
++#if defined(CONFIG_OF_BOARD_SETUP)
++int fsl_dcu_fixedfb_setup(void *blob)
++{
++ u64 start, size;
++ int ret;
++
++ start = gd->bd->bi_dram[0].start;
++ size = gd->bd->bi_dram[0].size - info.screen_size;
++
++ /*
++ * Align size on section size (1 MiB).
++ */
++ size &= 0xfff00000;
++ ret = fdt_fixup_memory_banks(blob, &start, &size, 1);
++ if (ret) {
++ eprintf("Cannot setup fb: Error reserving memory\n");
++ return ret;
++ }
++
++ return 0;
++}
++#endif
++
+ void *video_hw_init(void)
+ {
+ static GraphicDevice ctfb;
+@@ -448,25 +478,69 @@ void *video_hw_init(void)
+ return &ctfb;
+ }
+
+-#if defined(CONFIG_OF_BOARD_SETUP)
+-int fsl_dcu_fixedfb_setup(void *blob)
++#else /* ifndef CONFIG_DM_VIDEO */
++
++static int fsl_dcu_video_probe(struct udevice *dev)
+ {
+- u64 start, size;
+- int ret;
++ struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
++ struct video_priv *uc_priv = dev_get_uclass_priv(dev);
++ struct fb_info fbinfo = { 0 };
++ unsigned int win_x;
++ unsigned int win_y;
++ u32 fb_start, fb_end;
++ int ret = 0;
++
++ fb_start = plat->base & ~(MMU_SECTION_SIZE - 1);
++ fb_end = plat->base + plat->size;
++ fb_end = ALIGN(fb_end, 1 << MMU_SECTION_SHIFT);
++
++ fbinfo.screen_base = (char *)fb_start;
++ fbinfo.screen_size = plat->size;
++
++ ret = fsl_probe_common(&fbinfo, &win_x, &win_y);
++ if (ret < 0)
++ return ret;
+
+- start = gd->bd->bi_dram[0].start;
+- size = gd->bd->bi_dram[0].size - info.screen_size;
++ uc_priv->bpix = VIDEO_BPP32;
++ uc_priv->xsize = win_x;
++ uc_priv->ysize = win_y;
+
+- /*
+- * Align size on section size (1 MiB).
+- */
+- size &= 0xfff00000;
+- ret = fdt_fixup_memory_banks(blob, &start, &size, 1);
+- if (ret) {
+- eprintf("Cannot setup fb: Error reserving memory\n");
++ /* Enable dcache for the frame buffer */
++ mmu_set_region_dcache_behaviour(fb_start, fb_end - fb_start,
++ DCACHE_WRITEBACK);
++ video_set_flush_dcache(dev, true);
++ return ret;
++}
++
++static int fsl_dcu_video_bind(struct udevice *dev)
++{
++ struct video_uc_platdata *plat = dev_get_uclass_platdata(dev);
++ unsigned int win_x;
++ unsigned int win_y;
++ unsigned int depth = 0, freq = 0;
++ const char *options;
++ int ret = 0;
++
++ ret = video_get_video_mode(&win_x, &win_y, &depth, &freq, &options);
++ if (ret < 0)
+ return ret;
+- }
++
++ plat->size = win_x * win_y * 32;
+
+ return 0;
+ }
+-#endif
++
++static const struct udevice_id fsl_dcu_video_ids[] = {
++ { .compatible = "fsl,vf610-dcu" },
++ { /* sentinel */ }
++};
++
++U_BOOT_DRIVER(fsl_dcu_video) = {
++ .name = "fsl_dcu_video",
++ .id = UCLASS_VIDEO,
++ .of_match = fsl_dcu_video_ids,
++ .bind = fsl_dcu_video_bind,
++ .probe = fsl_dcu_video_probe,
++ .flags = DM_FLAG_PRE_RELOC,
++};
++#endif /* ifndef CONFIG_DM_VIDEO */
+--
+2.13.6
+