Merge rsync://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[firefly-linux-kernel-4.4.55.git] / drivers / video / console / vgacon.c
index e64d42e2449e4dd5ac104042000d0fe005ce09ca..05735ff4e9c5205d311c7cf39e20ff62dcececc9 100644 (file)
@@ -33,7 +33,6 @@
  *  more details.
  */
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/sched.h>
@@ -114,6 +113,7 @@ static int          vga_512_chars;
 static int             vga_video_font_height;
 static int             vga_scan_lines;
 static unsigned int    vga_rolled_over = 0;
+static int              vga_init_done;
 
 static int __init no_scroll(char *str)
 {
@@ -190,7 +190,7 @@ static void vgacon_scrollback_init(int pitch)
        }
 }
 
-static void __init vgacon_scrollback_startup(void)
+static void vgacon_scrollback_startup(void)
 {
        vgacon_scrollback = alloc_bootmem(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE
                                          * 1024);
@@ -355,7 +355,7 @@ static int vgacon_scrolldelta(struct vc_data *c, int lines)
 }
 #endif /* CONFIG_VGACON_SOFT_SCROLLBACK */
 
-static const char __init *vgacon_startup(void)
+static const char *vgacon_startup(void)
 {
        const char *display_desc = NULL;
        u16 saved1, saved2;
@@ -389,7 +389,7 @@ static const char __init *vgacon_startup(void)
                vga_video_port_val = VGA_CRT_DM;
                if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) {
                        static struct resource ega_console_resource =
-                           { "ega", 0x3B0, 0x3BF };
+                           { .name = "ega", .start = 0x3B0, .end = 0x3BF };
                        vga_video_type = VIDEO_TYPE_EGAM;
                        vga_vram_size = 0x8000;
                        display_desc = "EGA+";
@@ -397,9 +397,9 @@ static const char __init *vgacon_startup(void)
                                         &ega_console_resource);
                } else {
                        static struct resource mda1_console_resource =
-                           { "mda", 0x3B0, 0x3BB };
+                           { .name = "mda", .start = 0x3B0, .end = 0x3BB };
                        static struct resource mda2_console_resource =
-                           { "mda", 0x3BF, 0x3BF };
+                           { .name = "mda", .start = 0x3BF, .end = 0x3BF };
                        vga_video_type = VIDEO_TYPE_MDA;
                        vga_vram_size = 0x2000;
                        display_desc = "*MDA";
@@ -422,14 +422,14 @@ static const char __init *vgacon_startup(void)
 
                        if (!ORIG_VIDEO_ISVGA) {
                                static struct resource ega_console_resource
-                                   = { "ega", 0x3C0, 0x3DF };
+                                   = { .name = "ega", .start = 0x3C0, .end = 0x3DF };
                                vga_video_type = VIDEO_TYPE_EGAC;
                                display_desc = "EGA";
                                request_resource(&ioport_resource,
                                                 &ega_console_resource);
                        } else {
                                static struct resource vga_console_resource
-                                   = { "vga+", 0x3C0, 0x3DF };
+                                   = { .name = "vga+", .start = 0x3C0, .end = 0x3DF };
                                vga_video_type = VIDEO_TYPE_VGAC;
                                display_desc = "VGA+";
                                request_resource(&ioport_resource,
@@ -473,7 +473,7 @@ static const char __init *vgacon_startup(void)
                        }
                } else {
                        static struct resource cga_console_resource =
-                           { "cga", 0x3D4, 0x3D5 };
+                           { .name = "cga", .start = 0x3D4, .end = 0x3D5 };
                        vga_video_type = VIDEO_TYPE_CGA;
                        vga_vram_size = 0x2000;
                        display_desc = "*CGA";
@@ -523,7 +523,12 @@ static const char __init *vgacon_startup(void)
 
        vgacon_xres = ORIG_VIDEO_COLS * VGA_FONTWIDTH;
        vgacon_yres = vga_scan_lines;
-       vgacon_scrollback_startup();
+
+       if (!vga_init_done) {
+               vgacon_scrollback_startup();
+               vga_init_done = 1;
+       }
+
        return display_desc;
 }
 
@@ -531,10 +536,20 @@ static void vgacon_init(struct vc_data *c, int init)
 {
        unsigned long p;
 
-       /* We cannot be loaded as a module, therefore init is always 1 */
+       /*
+        * We cannot be loaded as a module, therefore init is always 1,
+        * but vgacon_init can be called more than once, and init will
+        * not be 1.
+        */
        c->vc_can_do_color = vga_can_do_color;
-       c->vc_cols = vga_video_num_columns;
-       c->vc_rows = vga_video_num_lines;
+
+       /* set dimensions manually if init != 0 since vc_resize() will fail */
+       if (init) {
+               c->vc_cols = vga_video_num_columns;
+               c->vc_rows = vga_video_num_lines;
+       } else
+               vc_resize(c, vga_video_num_columns, vga_video_num_lines);
+
        c->vc_scan_lines = vga_scan_lines;
        c->vc_font.height = vga_video_font_height;
        c->vc_complement_mask = 0x7700;