colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / common / lcd_simplefb.c
index 2ba00f6d34c040d81c192636ba8df26a4b5a30d8..fca600691e9aa7a9dba1fe8887f99f0e73a61351 100644 (file)
@@ -1,32 +1,60 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Simplefb device tree support
  *
  * (C) Copyright 2015
  * Stephen Warren <swarren@wwwdotorg.org>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
+#include <dm.h>
 #include <lcd.h>
 #include <fdt_support.h>
-#include <libfdt.h>
+#include <linux/libfdt.h>
+#include <video.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 static int lcd_dt_simplefb_configure_node(void *blob, int off)
 {
-       int vl_col = lcd_get_pixel_width();
-       int vl_row = lcd_get_pixel_height();
-#if LCD_BPP == LCD_COLOR16
-       return fdt_setup_simplefb_node(blob, off, gd->fb_base, vl_col, vl_row,
-                                      vl_col * 2, "r5g6b5");
-#elif LCD_BPP == LCD_COLOR32
-       return fdt_setup_simplefb_node(blob, off, gd->fb_base, vl_col, vl_row,
-                                      vl_col * 4, "a8r8g8b8");
+       int xsize, ysize;
+       int bpix; /* log2 of bits per pixel */
+       const char *name;
+       ulong fb_base;
+#ifdef CONFIG_DM_VIDEO
+       struct video_uc_platdata *plat;
+       struct video_priv *uc_priv;
+       struct udevice *dev;
+       int ret;
+
+       ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
+       if (ret)
+               return ret;
+       uc_priv = dev_get_uclass_priv(dev);
+       plat = dev_get_uclass_platdata(dev);
+       xsize = uc_priv->xsize;
+       ysize = uc_priv->ysize;
+       bpix = uc_priv->bpix;
+       fb_base = plat->base;
 #else
-       return -1;
+       xsize = lcd_get_pixel_width();
+       ysize = lcd_get_pixel_height();
+       bpix = LCD_BPP;
+       fb_base = gd->fb_base;
 #endif
+       switch (bpix) {
+       case 4: /* VIDEO_BPP16 */
+               name = "r5g6b5";
+               break;
+       case 5: /* VIDEO_BPP32 */
+               name = "a8r8g8b8";
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return fdt_setup_simplefb_node(blob, off, fb_base, xsize, ysize,
+                                      xsize * (1 << bpix) / 8, name);
 }
 
 int lcd_dt_simplefb_add_node(void *blob)