FBCON_LOGO_DONTSHOW     = -3    /* do not show the logo */
 };
 
-struct display fb_display[MAX_NR_CONSOLES];
-EXPORT_SYMBOL(fb_display);
+static struct display fb_display[MAX_NR_CONSOLES];
 
 static signed char con2fb_map[MAX_NR_CONSOLES];
 static signed char con2fb_map_boot[MAX_NR_CONSOLES];
 {
        struct fbcon_ops *ops = info->fbcon_par;
 
+       ops->p = (p) ? p : &fb_display[vc->vc_num];
+
        if ((info->flags & FBINFO_MISC_TILEBLITTING))
                fbcon_set_tileops(vc, info, p, ops);
        else {
-               struct display *disp;
-
-               disp = (p) ? p : &fb_display[vc->vc_num];
-               fbcon_set_rotation(info, disp);
+               fbcon_set_rotation(info, ops->p);
                fbcon_set_bitops(ops);
        }
 }
                              struct display *p)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *disp;
 
        info->flags &= ~FBINFO_MISC_TILEBLITTING;
-       disp = (p) ? p : &fb_display[vc->vc_num];
-       fbcon_set_rotation(info, disp);
+       ops->p = (p) ? p : &fb_display[vc->vc_num];
+       fbcon_set_rotation(info, ops->p);
        fbcon_set_bitops(ops);
 }
 #endif /* CONFIG_MISC_TILEBLITTING */
 
     struct fb_videomode *mode;
 };
 
-extern struct display fb_display[];
-
 struct fbcon_ops {
        void (*bmove)(struct vc_data *vc, struct fb_info *info, int sy,
                      int sx, int dy, int dx, int height, int width);
        struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo */
        struct timer_list cursor_timer; /* Cursor timer */
        struct fb_cursor cursor_state;
+       struct display *p;
         int    currcon;                        /* Current VC. */
        int    cursor_flash;
        int    cursor_reset;
 
 static void ccw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int dy, int dx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_copyarea area;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
 
        area.sx = sy * vc->vc_font.height;
        area.sy = vyres - ((sx + width) * vc->vc_font.width);
 static void ccw_clear(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_fillrect region;
        int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
 
        region.color = attr_bgcol_ec(bgshift,vc);
        region.dx = sy * vc->vc_font.height;
                      int fg, int bg)
 {
        struct fb_image image;
-       struct display *p = &fb_display[vc->vc_num];
        struct fbcon_ops *ops = info->fbcon_par;
        u32 width = (vc->vc_font.height + 7)/8;
        u32 cellsize = width * vc->vc_font.width;
        u32 cnt, pitch, size;
        u32 attribute = get_attribute(info, scr_readw(s));
        u8 *dst, *buf = NULL;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
 
        if (!ops->fontbuffer)
                return;
 int ccw_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *p = &fb_display[ops->currcon];
        u32 yoffset;
-       u32 vyres = GETVYRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
        int err;
 
        yoffset = (vyres - info->var.yres) - ops->var.xoffset;
 
 static void cw_bmove(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int dy, int dx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_copyarea area;
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        area.sx = vxres - ((sy + height) * vc->vc_font.height);
        area.sy = sx * vc->vc_font.width;
 static void cw_clear(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_fillrect region;
        int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        region.color = attr_bgcol_ec(bgshift,vc);
        region.dx = vxres - ((sy + height) * vc->vc_font.height);
                      int fg, int bg)
 {
        struct fb_image image;
-       struct display *p = &fb_display[vc->vc_num];
        struct fbcon_ops *ops = info->fbcon_par;
        u32 width = (vc->vc_font.height + 7)/8;
        u32 cellsize = width * vc->vc_font.width;
        u32 cnt, pitch, size;
        u32 attribute = get_attribute(info, scr_readw(s));
        u8 *dst, *buf = NULL;
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        if (!ops->fontbuffer)
                return;
 int cw_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *p = &fb_display[ops->currcon];
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
        u32 xoffset;
        int err;
 
 
 static void ud_bmove(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int dy, int dx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_copyarea area;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        area.sy = vyres - ((sy + height) * vc->vc_font.height);
        area.sx = vxres - ((sx + width) * vc->vc_font.width);
 static void ud_clear(struct vc_data *vc, struct fb_info *info, int sy,
                     int sx, int height, int width)
 {
-       struct display *p = &fb_display[vc->vc_num];
+       struct fbcon_ops *ops = info->fbcon_par;
        struct fb_fillrect region;
        int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        region.color = attr_bgcol_ec(bgshift,vc);
        region.dy = vyres - ((sy + height) * vc->vc_font.height);
                      int fg, int bg)
 {
        struct fb_image image;
-       struct display *p = &fb_display[vc->vc_num];
        struct fbcon_ops *ops = info->fbcon_par;
        u32 width = (vc->vc_font.width + 7)/8;
        u32 cellsize = width * vc->vc_font.height;
        u32 mod = vc->vc_font.width % 8, cnt, pitch, size;
        u32 attribute = get_attribute(info, scr_readw(s));
        u8 *dst, *buf = NULL;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
 
        if (!ops->fontbuffer)
                return;
 int ud_update_start(struct fb_info *info)
 {
        struct fbcon_ops *ops = info->fbcon_par;
-       struct display *p = &fb_display[ops->currcon];
        u32 xoffset, yoffset;
-       u32 vyres = GETVYRES(p->scrollmode, info);
-       u32 vxres = GETVXRES(p->scrollmode, info);
+       u32 vyres = GETVYRES(ops->p->scrollmode, info);
+       u32 vxres = GETVXRES(ops->p->scrollmode, info);
        int err;
 
        xoffset = (vxres - info->var.xres) - ops->var.xoffset;