Merge tag 'fbdev-for-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[sfrench/cifs-2.6.git] / drivers / video / fbdev / core / fbcon.c
index 4b67b32fdbc7af27a4b3c485446b7119495be7a7..fcabc668e9fbe794c5f94b10db26f93387ec4ebd 100644 (file)
@@ -351,7 +351,7 @@ static void fb_flashcursor(struct work_struct *work)
        struct fb_info *info;
        struct vc_data *vc = NULL;
        int c;
-       int mode;
+       bool enable;
        int ret;
 
        /* FIXME: we should sort out the unbind locking instead */
@@ -375,9 +375,8 @@ static void fb_flashcursor(struct work_struct *work)
        }
 
        c = scr_readw((u16 *) vc->vc_pos);
-       mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
-               CM_ERASE : CM_DRAW;
-       ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
+       enable = ops->cursor_flash && !ops->cursor_state.enable;
+       ops->cursor(vc, info, enable, get_color(vc, info, c, 1),
                    get_color(vc, info, c, 0));
        console_unlock();
 
@@ -920,7 +919,7 @@ static void display_to_var(struct fb_var_screeninfo *var,
 
 static const char *fbcon_startup(void)
 {
-       const char *display_desc = "frame buffer device";
+       static const char display_desc[] = "frame buffer device";
        struct fbcon_display *p = &fb_display[fg_console];
        struct vc_data *vc = vc_cons[fg_console].d;
        const struct font_desc *font = NULL;
@@ -987,7 +986,7 @@ static const char *fbcon_startup(void)
        return display_desc;
 }
 
-static void fbcon_init(struct vc_data *vc, int init)
+static void fbcon_init(struct vc_data *vc, bool init)
 {
        struct fb_info *info;
        struct fbcon_ops *ops;
@@ -1234,8 +1233,8 @@ finished:
  *  restriction is simplicity & efficiency at the moment.
  */
 
-static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height,
-                       int width)
+static void __fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx,
+                         unsigned int height, unsigned int width)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_ops *ops = info->fbcon_par;
@@ -1272,8 +1271,14 @@ static void fbcon_clear(struct vc_data *vc, int sy, int sx, int height,
                ops->clear(vc, info, real_y(p, sy), sx, height, width);
 }
 
-static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
-                       int count, int ypos, int xpos)
+static void fbcon_clear(struct vc_data *vc, unsigned int sy, unsigned int sx,
+                       unsigned int width)
+{
+       __fbcon_clear(vc, sy, sx, 1, width);
+}
+
+static void fbcon_putcs(struct vc_data *vc, const u16 *s, unsigned int count,
+                       unsigned int ypos, unsigned int xpos)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_display *p = &fb_display[vc->vc_num];
@@ -1285,14 +1290,6 @@ static void fbcon_putcs(struct vc_data *vc, const unsigned short *s,
                           get_color(vc, info, scr_readw(s), 0));
 }
 
-static void fbcon_putc(struct vc_data *vc, int c, int ypos, int xpos)
-{
-       unsigned short chr;
-
-       scr_writew(c, &chr);
-       fbcon_putcs(vc, &chr, 1, ypos, xpos);
-}
-
 static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
@@ -1302,7 +1299,7 @@ static void fbcon_clear_margins(struct vc_data *vc, int bottom_only)
                ops->clear_margins(vc, info, margin_color, bottom_only);
 }
 
-static void fbcon_cursor(struct vc_data *vc, int mode)
+static void fbcon_cursor(struct vc_data *vc, bool enable)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_ops *ops = info->fbcon_par;
@@ -1318,12 +1315,12 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
        else
                fbcon_add_cursor_work(info);
 
-       ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
+       ops->cursor_flash = enable;
 
        if (!ops->cursor)
                return;
 
-       ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
+       ops->cursor(vc, info, enable, get_color(vc, info, c, 1),
                    get_color(vc, info, c, 0));
 }
 
@@ -1743,7 +1740,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
        if (fbcon_is_inactive(vc, info))
                return true;
 
-       fbcon_cursor(vc, CM_ERASE);
+       fbcon_cursor(vc, false);
 
        /*
         * ++Geert: Only use ywrap/ypan if the console is in text mode
@@ -1759,7 +1756,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                case SCROLL_MOVE:
                        fbcon_redraw_blit(vc, info, p, t, b - t - count,
                                     count);
-                       fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
                        scr_memsetw((unsigned short *) (vc->vc_origin +
                                                        vc->vc_size_row *
                                                        (b - count)),
@@ -1782,7 +1779,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                                            b - t - count, vc->vc_cols);
                        else
                                goto redraw_up;
-                       fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
                        break;
 
                case SCROLL_PAN_REDRAW:
@@ -1800,7 +1797,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                                                          vc->vc_rows - b, b);
                        } else
                                fbcon_redraw_move(vc, p, t + count, b - t - count, t);
-                       fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
                        break;
 
                case SCROLL_PAN_MOVE:
@@ -1823,14 +1820,14 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                                            b - t - count, vc->vc_cols);
                        else
                                goto redraw_up;
-                       fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
                        break;
 
                case SCROLL_REDRAW:
                      redraw_up:
                        fbcon_redraw(vc, t, b - t - count,
                                     count * vc->vc_cols);
-                       fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, b - count, 0, count, vc->vc_cols);
                        scr_memsetw((unsigned short *) (vc->vc_origin +
                                                        vc->vc_size_row *
                                                        (b - count)),
@@ -1847,7 +1844,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                case SCROLL_MOVE:
                        fbcon_redraw_blit(vc, info, p, b - 1, b - t - count,
                                     -count);
-                       fbcon_clear(vc, t, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, t, 0, count, vc->vc_cols);
                        scr_memsetw((unsigned short *) (vc->vc_origin +
                                                        vc->vc_size_row *
                                                        t),
@@ -1870,7 +1867,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                                            b - t - count, vc->vc_cols);
                        else
                                goto redraw_down;
-                       fbcon_clear(vc, t, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, t, 0, count, vc->vc_cols);
                        break;
 
                case SCROLL_PAN_MOVE:
@@ -1892,7 +1889,7 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                                            b - t - count, vc->vc_cols);
                        else
                                goto redraw_down;
-                       fbcon_clear(vc, t, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, t, 0, count, vc->vc_cols);
                        break;
 
                case SCROLL_PAN_REDRAW:
@@ -1909,14 +1906,14 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
                                        fbcon_redraw_move(vc, p, count, t, 0);
                        } else
                                fbcon_redraw_move(vc, p, t, b - t - count, t + count);
-                       fbcon_clear(vc, t, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, t, 0, count, vc->vc_cols);
                        break;
 
                case SCROLL_REDRAW:
                      redraw_down:
                        fbcon_redraw(vc, b - 1, b - t - count,
                                     -count * vc->vc_cols);
-                       fbcon_clear(vc, t, 0, count, vc->vc_cols);
+                       __fbcon_clear(vc, t, 0, count, vc->vc_cols);
                        scr_memsetw((unsigned short *) (vc->vc_origin +
                                                        vc->vc_size_row *
                                                        t),
@@ -1995,7 +1992,7 @@ static void updatescrollmode(struct fbcon_display *p,
 #define CALC_FONTSZ(h, p, c) ((h) * (p) * (c)) /* size = height * pitch * charcount */
 
 static int fbcon_resize(struct vc_data *vc, unsigned int width,
-                       unsigned int height, unsigned int user)
+                       unsigned int height, bool from_user)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_ops *ops = info->fbcon_par;
@@ -2058,7 +2055,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
        return 0;
 }
 
-static int fbcon_switch(struct vc_data *vc)
+static bool fbcon_switch(struct vc_data *vc)
 {
        struct fb_info *info, *old_info = NULL;
        struct fbcon_ops *ops;
@@ -2180,9 +2177,9 @@ static int fbcon_switch(struct vc_data *vc)
                              vc->vc_origin + vc->vc_size_row * vc->vc_top,
                              vc->vc_size_row * (vc->vc_bottom -
                                                 vc->vc_top) / 2);
-               return 0;
+               return false;
        }
-       return 1;
+       return true;
 }
 
 static void fbcon_generic_blank(struct vc_data *vc, struct fb_info *info,
@@ -2195,12 +2192,13 @@ static void fbcon_generic_blank(struct vc_data *vc, struct fb_info *info,
 
                oldc = vc->vc_video_erase_char;
                vc->vc_video_erase_char &= charmask;
-               fbcon_clear(vc, 0, 0, vc->vc_rows, vc->vc_cols);
+               __fbcon_clear(vc, 0, 0, vc->vc_rows, vc->vc_cols);
                vc->vc_video_erase_char = oldc;
        }
 }
 
-static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
+static bool fbcon_blank(struct vc_data *vc, enum vesa_blank_mode blank,
+                       bool mode_switch)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_ops *ops = info->fbcon_par;
@@ -2222,7 +2220,7 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
        if (!fbcon_is_inactive(vc, info)) {
                if (ops->blank_state != blank) {
                        ops->blank_state = blank;
-                       fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW);
+                       fbcon_cursor(vc, !blank);
                        ops->cursor_flash = (!blank);
 
                        if (fb_blank(info, blank))
@@ -2239,10 +2237,10 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch)
        else
                fbcon_add_cursor_work(info);
 
-       return 0;
+       return false;
 }
 
-static int fbcon_debug_enter(struct vc_data *vc)
+static void fbcon_debug_enter(struct vc_data *vc)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_ops *ops = info->fbcon_par;
@@ -2252,10 +2250,9 @@ static int fbcon_debug_enter(struct vc_data *vc)
        if (info->fbops->fb_debug_enter)
                info->fbops->fb_debug_enter(info);
        fbcon_set_palette(vc, color_table);
-       return 0;
 }
 
-static int fbcon_debug_leave(struct vc_data *vc)
+static void fbcon_debug_leave(struct vc_data *vc)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        struct fbcon_ops *ops = info->fbcon_par;
@@ -2263,7 +2260,6 @@ static int fbcon_debug_leave(struct vc_data *vc)
        ops->graphics = ops->save_graphics;
        if (info->fbops->fb_debug_leave)
                info->fbops->fb_debug_leave(info);
-       return 0;
 }
 
 static int fbcon_get_font(struct vc_data *vc, struct console_font *font, unsigned int vpitch)
@@ -2399,11 +2395,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,
        struct fbcon_ops *ops = info->fbcon_par;
        struct fbcon_display *p = &fb_display[vc->vc_num];
        int resize, ret, old_userfont, old_width, old_height, old_charcount;
-       char *old_data = NULL;
+       u8 *old_data = vc->vc_font.data;
 
        resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
-       if (p->userfont)
-               old_data = vc->vc_font.data;
        vc->vc_font.data = (void *)(p->fontdata = data);
        old_userfont = p->userfont;
        if ((p->userfont = userfont))
@@ -2437,13 +2431,13 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,
                update_screen(vc);
        }
 
-       if (old_data && (--REFCOUNT(old_data) == 0))
+       if (old_userfont && (--REFCOUNT(old_data) == 0))
                kfree(old_data - FONT_EXTRA_WORDS * sizeof(int));
        return 0;
 
 err_out:
        p->fontdata = old_data;
-       vc->vc_font.data = (void *)old_data;
+       vc->vc_font.data = old_data;
 
        if (userfont) {
                p->userfont = old_userfont;
@@ -2463,7 +2457,7 @@ err_out:
  *  but lets not assume that, since charcount of 512 is small for unicode support.
  */
 
-static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
+static int fbcon_set_font(struct vc_data *vc, const struct console_font *font,
                          unsigned int vpitch, unsigned int flags)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
@@ -2536,7 +2530,8 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
        return fbcon_do_set_font(vc, font->width, font->height, charcount, new_data, 1);
 }
 
-static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, char *name)
+static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font,
+                             const char *name)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        const struct font_desc *f;
@@ -2595,35 +2590,6 @@ static void fbcon_set_palette(struct vc_data *vc, const unsigned char *table)
        fb_set_cmap(&palette_cmap, info);
 }
 
-static u16 *fbcon_screen_pos(const struct vc_data *vc, int offset)
-{
-       return (u16 *) (vc->vc_origin + offset);
-}
-
-static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
-                                int *px, int *py)
-{
-       unsigned long ret;
-       int x, y;
-
-       if (pos >= vc->vc_origin && pos < vc->vc_scr_end) {
-               unsigned long offset = (pos - vc->vc_origin) / 2;
-
-               x = offset % vc->vc_cols;
-               y = offset / vc->vc_cols;
-               ret = pos + (vc->vc_cols - x) * 2;
-       } else {
-               /* Should not happen */
-               x = y = 0;
-               ret = vc->vc_origin;
-       }
-       if (px)
-               *px = x;
-       if (py)
-               *py = y;
-       return ret;
-}
-
 /* As we might be inside of softback, we may work with non-contiguous buffer,
    that's why we have to use a separate routine. */
 static void fbcon_invert_region(struct vc_data *vc, u16 * p, int cnt)
@@ -2652,7 +2618,7 @@ void fbcon_suspended(struct fb_info *info)
        vc = vc_cons[ops->currcon].d;
 
        /* Clear cursor, restore saved data */
-       fbcon_cursor(vc, CM_ERASE);
+       fbcon_cursor(vc, false);
 }
 
 void fbcon_resumed(struct fb_info *info)
@@ -3156,7 +3122,6 @@ static const struct consw fb_con = {
        .con_init               = fbcon_init,
        .con_deinit             = fbcon_deinit,
        .con_clear              = fbcon_clear,
-       .con_putc               = fbcon_putc,
        .con_putcs              = fbcon_putcs,
        .con_cursor             = fbcon_cursor,
        .con_scroll             = fbcon_scroll,
@@ -3167,8 +3132,6 @@ static const struct consw fb_con = {
        .con_font_default       = fbcon_set_def_font,
        .con_set_palette        = fbcon_set_palette,
        .con_invert_region      = fbcon_invert_region,
-       .con_screen_pos         = fbcon_screen_pos,
-       .con_getxy              = fbcon_getxy,
        .con_resize             = fbcon_resize,
        .con_debug_enter        = fbcon_debug_enter,
        .con_debug_leave        = fbcon_debug_leave,