]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - drivers/video/video-uclass.c
CONFIG_SPL_SYS_[DI]CACHE_OFF: add
[thirdparty/u-boot.git] / drivers / video / video-uclass.c
index dd0873767ba5ef6c38ea771ce2e51d1cc13f7c53..b19bfb4f2ff587e821c959afd511ad289737da8d 100644 (file)
@@ -86,7 +86,7 @@ int video_reserve(ulong *addrp)
        return 0;
 }
 
-void video_clear(struct udevice *dev)
+int video_clear(struct udevice *dev)
 {
        struct video_priv *priv = dev_get_uclass_priv(dev);
 
@@ -111,31 +111,45 @@ void video_clear(struct udevice *dev)
                memset(priv->fb, priv->colour_bg, priv->fb_size);
                break;
        }
+
+       return 0;
 }
 
-void video_set_default_colors(struct video_priv *priv)
+void video_set_default_colors(struct udevice *dev, bool invert)
 {
+       struct video_priv *priv = dev_get_uclass_priv(dev);
+       int fore, back;
+
 #ifdef CONFIG_SYS_WHITE_ON_BLACK
        /* White is used when switching to bold, use light gray here */
-       priv->fg_col_idx = VID_LIGHT_GRAY;
-       priv->colour_fg = vid_console_color(priv, VID_LIGHT_GRAY);
-       priv->colour_bg = vid_console_color(priv, VID_BLACK);
+       fore = VID_LIGHT_GRAY;
+       back = VID_BLACK;
 #else
-       priv->fg_col_idx = VID_BLACK;
-       priv->colour_fg = vid_console_color(priv, VID_BLACK);
-       priv->colour_bg = vid_console_color(priv, VID_WHITE);
+       fore = VID_BLACK;
+       back = VID_WHITE;
 #endif
+       if (invert) {
+               int temp;
+
+               temp = fore;
+               fore = back;
+               back = temp;
+       }
+       priv->fg_col_idx = fore;
+       priv->bg_col_idx = back;
+       priv->colour_fg = vid_console_color(priv, fore);
+       priv->colour_bg = vid_console_color(priv, back);
 }
 
 /* Flush video activity to the caches */
-void video_sync(struct udevice *vid)
+void video_sync(struct udevice *vid, bool force)
 {
        /*
         * flush_dcache_range() is declared in common.h but it seems that some
         * architectures do not actually implement it. Is there a way to find
         * out whether it exists? For now, ARM is safe.
         */
-#if defined(CONFIG_ARM) && !defined(CONFIG_SYS_DCACHE_OFF)
+#if defined(CONFIG_ARM) && !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
        struct video_priv *priv = dev_get_uclass_priv(vid);
 
        if (priv->flush_dcache) {
@@ -147,7 +161,7 @@ void video_sync(struct udevice *vid)
        struct video_priv *priv = dev_get_uclass_priv(vid);
        static ulong last_sync;
 
-       if (get_timer(last_sync) > 10) {
+       if (force || get_timer(last_sync) > 10) {
                sandbox_sdl_sync(priv->fb);
                last_sync = get_timer(0);
        }
@@ -162,7 +176,7 @@ void video_sync_all(void)
             dev;
             uclass_find_next_device(&dev)) {
                if (device_active(dev))
-                       video_sync(dev);
+                       video_sync(dev, true);
        }
 }
 
@@ -213,11 +227,13 @@ static int video_post_probe(struct udevice *dev)
 
        /* Set up the line and display size */
        priv->fb = map_sysmem(plat->base, plat->size);
-       priv->line_length = priv->xsize * VNBYTES(priv->bpix);
+       if (!priv->line_length)
+               priv->line_length = priv->xsize * VNBYTES(priv->bpix);
+
        priv->fb_size = priv->line_length * priv->ysize;
 
        /* Set up colors  */
-       video_set_default_colors(priv);
+       video_set_default_colors(dev, false);
 
        if (!CONFIG_IS_ENABLED(NO_FB_CLEAR))
                video_clear(dev);