[PATCH] fbdev: Fix greater than 1 bit monochrome color handling
Currently, fbcon assumes that the visual FB_VISUAL_MONO* is always 1 bit. According to Geert, there are old hardware where it's possible to have monochrome at 8-bit, but has only 2 colors, black - 0x00 and white - 0xff. Fix color handlers (fb_get_color_depth, and get_color) for this special case. Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:

committed by
Linus Torvalds

父節點
094bb659f5
當前提交
b8c909454f
@@ -214,7 +214,7 @@ static inline int fbcon_is_inactive(struct vc_data *vc, struct fb_info *info)
|
||||
static inline int get_color(struct vc_data *vc, struct fb_info *info,
|
||||
u16 c, int is_fg)
|
||||
{
|
||||
int depth = fb_get_color_depth(&info->var);
|
||||
int depth = fb_get_color_depth(&info->var, &info->fix);
|
||||
int color = 0;
|
||||
|
||||
if (console_blanked) {
|
||||
@@ -230,9 +230,13 @@ static inline int get_color(struct vc_data *vc, struct fb_info *info,
|
||||
switch (depth) {
|
||||
case 1:
|
||||
{
|
||||
int col = ~(0xfff << (max(info->var.green.length,
|
||||
max(info->var.red.length,
|
||||
info->var.blue.length)))) & 0xff;
|
||||
|
||||
/* 0 or 1 */
|
||||
int fg = (info->fix.visual != FB_VISUAL_MONO01) ? 1 : 0;
|
||||
int bg = (info->fix.visual != FB_VISUAL_MONO01) ? 0 : 1;
|
||||
int fg = (info->fix.visual != FB_VISUAL_MONO01) ? col : 0;
|
||||
int bg = (info->fix.visual != FB_VISUAL_MONO01) ? 0 : col;
|
||||
|
||||
if (console_blanked)
|
||||
fg = bg;
|
||||
@@ -246,7 +250,6 @@ static inline int get_color(struct vc_data *vc, struct fb_info *info,
|
||||
* is grayscale.
|
||||
*/
|
||||
color /= 4;
|
||||
break;
|
||||
case 3:
|
||||
/*
|
||||
* Last 8 entries of default 16-color palette is a more intense
|
||||
@@ -426,7 +429,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
|
||||
* remove underline attribute from erase character
|
||||
* if black and white framebuffer.
|
||||
*/
|
||||
if (fb_get_color_depth(&info->var) == 1)
|
||||
if (fb_get_color_depth(&info->var, &info->fix) == 1)
|
||||
erase &= ~0x400;
|
||||
logo_height = fb_prepare_logo(info);
|
||||
logo_lines = (logo_height + vc->vc_font.height - 1) /
|
||||
@@ -930,7 +933,7 @@ static void fbcon_init(struct vc_data *vc, int init)
|
||||
}
|
||||
if (p->userfont)
|
||||
charcnt = FNTCHARCNT(p->fontdata);
|
||||
vc->vc_can_do_color = (fb_get_color_depth(&info->var) != 1);
|
||||
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 (charcnt == 256) {
|
||||
vc->vc_hi_font_mask = 0;
|
||||
@@ -1178,7 +1181,12 @@ static void fbcon_set_disp(struct fb_info *info, struct fb_var_screeninfo *var,
|
||||
if (p->userfont)
|
||||
charcnt = FNTCHARCNT(p->fontdata);
|
||||
|
||||
vc->vc_can_do_color = (fb_get_color_depth(var) != 1);
|
||||
var->activate = FB_ACTIVATE_NOW;
|
||||
info->var.activate = var->activate;
|
||||
info->var.yoffset = info->var.xoffset = 0;
|
||||
fb_set_var(info, var);
|
||||
|
||||
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 (charcnt == 256) {
|
||||
vc->vc_hi_font_mask = 0;
|
||||
@@ -1967,7 +1975,7 @@ static int fbcon_switch(struct vc_data *vc)
|
||||
set_blitting_type(vc, info, p);
|
||||
((struct fbcon_ops *)info->fbcon_par)->cursor_reset = 1;
|
||||
|
||||
vc->vc_can_do_color = (fb_get_color_depth(&info->var) != 1);
|
||||
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;
|
||||
updatescrollmode(p, info, vc);
|
||||
|
||||
@@ -2332,7 +2340,7 @@ static int fbcon_set_palette(struct vc_data *vc, unsigned char *table)
|
||||
if (!CON_IS_VISIBLE(vc))
|
||||
return 0;
|
||||
|
||||
depth = fb_get_color_depth(&info->var);
|
||||
depth = fb_get_color_depth(&info->var, &info->fix);
|
||||
if (depth > 3) {
|
||||
for (i = j = 0; i < 16; i++) {
|
||||
k = table[i];
|
||||
|
Reference in New Issue
Block a user