diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c index 66167830fefd..1c27d12e7cdd 100644 --- a/drivers/video/fbdev/core/fbcon.c +++ b/drivers/video/fbdev/core/fbcon.c @@ -1121,9 +1121,8 @@ static void fbcon_init(struct vc_data *vc, int init) fvc->vc_font.data); vc->vc_font.width = fvc->vc_font.width; vc->vc_font.height = fvc->vc_font.height; - p->userfont = t->userfont; - if (p->userfont) + if (is_dyn_font(p->fontdata)) REFCOUNT(p->fontdata)++; } else { const struct font_desc *font = NULL; @@ -1141,7 +1140,7 @@ static void fbcon_init(struct vc_data *vc, int init) } } - if (p->userfont) + if (is_dyn_font(p->fontdata)) charcnt = FNTCHARCNT(p->fontdata); vc->vc_can_do_color = (fb_get_color_depth(&info->var, &info->fix)!=1); @@ -1233,10 +1232,9 @@ static void fbcon_init(struct vc_data *vc, int init) static void fbcon_free_font(struct fbcon_display *p, bool freefont) { - if (freefont && p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0)) + if (freefont && is_dyn_font(p->fontdata) && (--REFCOUNT(p->fontdata) == 0)) kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int)); p->fontdata = NULL; - p->userfont = 0; } static void set_vc_hi_font(struct vc_data *vc, bool set); @@ -1443,11 +1441,10 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var, vc->vc_font.data = (void *)(p->fontdata = t->fontdata); vc->vc_font.width = (*default_mode)->vc_font.width; vc->vc_font.height = (*default_mode)->vc_font.height; - p->userfont = t->userfont; - if (p->userfont) + if (is_dyn_font(p->fontdata)) REFCOUNT(p->fontdata)++; } - if (p->userfont) + if (is_dyn_font(p->fontdata)) charcnt = FNTCHARCNT(p->fontdata); var->activate = FB_ACTIVATE_NOW; @@ -2203,7 +2200,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width, struct fb_var_screeninfo var = info->var; int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh; - if (ops->p && ops->p->userfont && FNTSIZE(vc->vc_font.data)) { + if (is_dyn_font(vc->vc_font.data) && FNTSIZE(vc->vc_font.data)) { int size; int pitch = PITCH(vc->vc_font.width); @@ -2349,7 +2346,7 @@ static int fbcon_switch(struct vc_data *vc) vc->vc_can_do_color = (fb_get_color_depth(&info->var, &info->fix)!=1); vc->vc_complement_mask = vc->vc_can_do_color ? 0x7700 : 0x0800; - if (p->userfont) + if (is_dyn_font(vc->vc_font.data)) charcnt = FNTCHARCNT(vc->vc_font.data); if (charcnt > 256) @@ -2590,8 +2587,7 @@ static void set_vc_hi_font(struct vc_data *vc, bool set) } } -static int fbcon_do_set_font(struct vc_data *vc, int w, int h, - const u8 * data, int userfont) +static int fbcon_do_set_font(struct vc_data *vc, int w, int h, const u8 *data) { struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; struct fbcon_ops *ops = info->fbcon_par; @@ -2604,14 +2600,14 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, fbcon_set_origin(vc); resize = (w != vc->vc_font.width) || (h != vc->vc_font.height); - if (p->userfont) + if (is_dyn_font(vc->vc_font.data)) old_data = vc->vc_font.data; - if (userfont) + if (is_dyn_font(data)) cnt = FNTCHARCNT(data); else cnt = 256; vc->vc_font.data = (void *)(p->fontdata = data); - if ((p->userfont = userfont)) + if (is_dyn_font(data)) REFCOUNT(data)++; vc->vc_font.width = w; vc->vc_font.height = h; @@ -2648,7 +2644,7 @@ static int fbcon_copy_font(struct vc_data *vc, int con) if (od->fontdata == f->data) return 0; /* already the same font... */ - return fbcon_do_set_font(vc, f->width, f->height, od->fontdata, od->userfont); + return fbcon_do_set_font(vc, f->width, f->height, od->fontdata); } /* @@ -2713,8 +2709,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, for (i = first_fb_vc; i <= last_fb_vc; i++) { struct vc_data *tmp = vc_cons[i].d; - if (fb_display[i].userfont && - fb_display[i].fontdata && + if (is_dyn_font(fb_display[i].fontdata) && FNTSUM(fb_display[i].fontdata) == csum && FNTSIZE(fb_display[i].fontdata) == size && tmp->vc_font.width == w && @@ -2724,7 +2719,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, break; } } - return fbcon_do_set_font(vc, font->width, font->height, new_data, 1); + return fbcon_do_set_font(vc, font->width, font->height, new_data); } static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, char *name) @@ -2740,7 +2735,7 @@ static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, cha font->width = f->width; font->height = f->height; - return fbcon_do_set_font(vc, f->width, f->height, f->data, 0); + return fbcon_do_set_font(vc, f->width, f->height, f->data); } static u16 palette_red[16]; @@ -3350,7 +3345,7 @@ void fbcon_get_requirement(struct fb_info *info, p = &fb_display[i]; caps->x |= 1 << (vc->vc_font.width - 1); caps->y |= 1 << (vc->vc_font.height - 1); - charcnt = (p->userfont) ? + charcnt = is_dyn_font(p->fontdata) ? FNTCHARCNT(p->fontdata) : 256; if (caps->len < charcnt) caps->len = charcnt; @@ -3364,7 +3359,7 @@ void fbcon_get_requirement(struct fb_info *info, p = &fb_display[fg_console]; caps->x = 1 << (vc->vc_font.width - 1); caps->y = 1 << (vc->vc_font.height - 1); - caps->len = (p->userfont) ? + caps->len = is_dyn_font(p->fontdata) ? FNTCHARCNT(p->fontdata) : 256; } } diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h index 20dea853765f..ecf9da744d92 100644 --- a/drivers/video/fbdev/core/fbcon.h +++ b/drivers/video/fbdev/core/fbcon.h @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -28,7 +29,6 @@ struct fbcon_display { /* Filled in by the low-level console driver */ const u_char *fontdata; - int userfont; /* != 0 if fontdata kmalloc()ed */ u_short scrollmode; /* Scroll Method */ u_short inverse; /* != 0 text black on white as default */ short yscroll; /* Hardware scrolling */ diff --git a/drivers/video/fbdev/core/fbcon_rotate.c b/drivers/video/fbdev/core/fbcon_rotate.c index c0d445294aa7..41b155d3c69b 100644 --- a/drivers/video/fbdev/core/fbcon_rotate.c +++ b/drivers/video/fbdev/core/fbcon_rotate.c @@ -32,7 +32,7 @@ static int fbcon_rotate_font(struct fb_info *info, struct vc_data *vc) src = ops->fontdata = vc->vc_font.data; ops->cur_rotate = ops->p->con_rotate; - len = (!ops->p->userfont) ? 256 : FNTCHARCNT(src); + len = !is_dyn_font(src) ? 256 : FNTCHARCNT(src); s_cellsize = ((vc->vc_font.width + 7)/8) * vc->vc_font.height; d_cellsize = s_cellsize; diff --git a/drivers/video/fbdev/core/tileblit.c b/drivers/video/fbdev/core/tileblit.c index 1dfaff0881fb..1fa389253110 100644 --- a/drivers/video/fbdev/core/tileblit.c +++ b/drivers/video/fbdev/core/tileblit.c @@ -144,7 +144,7 @@ void fbcon_set_tileops(struct vc_data *vc, struct fb_info *info) map.width = vc->vc_font.width; map.height = vc->vc_font.height; map.depth = 1; - map.length = (ops->p->userfont) ? + map.length = is_dyn_font(ops->p->fontdata) ? FNTCHARCNT(ops->p->fontdata) : 256; map.data = ops->p->fontdata; info->tileops->fb_settile(info, &map); diff --git a/include/linux/font.h b/include/linux/font.h index 51b91c8b69d5..9a4f6d96f75f 100644 --- a/include/linux/font.h +++ b/include/linux/font.h @@ -51,6 +51,10 @@ extern const struct font_desc font_vga_8x8, extern const struct font_desc *find_font(const char *name); +/* Check if font data seems to be dynamic */ + +extern bool is_dyn_font(const void *data); + /* Get the default font for a specific screen size */ extern const struct font_desc *get_default_font(int xres, int yres, diff --git a/lib/fonts/fonts.c b/lib/fonts/fonts.c index e7258d8c252b..777c19d299bf 100644 --- a/lib/fonts/fonts.c +++ b/lib/fonts/fonts.c @@ -19,6 +19,7 @@ #include #endif #include +#include static const struct font_desc *fonts[] = { #ifdef CONFIG_FONT_8x8 @@ -88,6 +89,22 @@ const struct font_desc *find_font(const char *name) } EXPORT_SYMBOL(find_font); +/** + * is_dyn_font - check if font data seems to be dynamic + * @data: font data to examine + * + * Returns true if @data seems to be dynamic, false otherwise. + */ +bool is_dyn_font(const void *data) +{ + unsigned int i; + + for (i = 0; i < num_fonts; i++) + if (fonts[i]->data == data) + return false; + return !ZERO_OR_NULL_PTR(data) && !IS_ERR(data); +} +EXPORT_SYMBOL(is_dyn_font); /** * get_default_font - get default font