Commit cc49d5d7 authored by Matthew Wilcox's avatar Matthew Wilcox Committed by Linus Torvalds

[PATCH] stifb bugfixes

 - Fix "sti= parameter ignored by stifb" bug (Stuart Brady)
 - Fix the STI crash with HCRX-24 in 32bpp mode (Helge Deller)
parent caa148f6
...@@ -112,6 +112,7 @@ struct stifb_info { ...@@ -112,6 +112,7 @@ struct stifb_info {
ngle_rom_t ngle_rom; ngle_rom_t ngle_rom;
struct sti_struct *sti; struct sti_struct *sti;
int deviceSpecificConfig; int deviceSpecificConfig;
u32 pseudo_palette[16];
}; };
static int __initdata bpp = 8; /* parameter from modprobe */ static int __initdata bpp = 8; /* parameter from modprobe */
...@@ -1030,6 +1031,14 @@ stifb_setcolreg(u_int regno, u_int red, u_int green, ...@@ -1030,6 +1031,14 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
/* 0x100 is same as used in WRITE_IMAGE_COLOR() */ /* 0x100 is same as used in WRITE_IMAGE_COLOR() */
START_COLORMAPLOAD(fb, lutBltCtl.all); START_COLORMAPLOAD(fb, lutBltCtl.all);
SETUP_FB(fb); SETUP_FB(fb);
/* info->var.bits_per_pixel == 32 */
if (regno < 16)
((u32 *)(info->pseudo_palette))[regno] =
(red << info->var.red.offset) |
(green << info->var.green.offset) |
(blue << info->var.blue.offset);
} else { } else {
/* cleanup colormap hardware */ /* cleanup colormap hardware */
FINISH_IMAGE_COLORMAP_ACCESS(fb); FINISH_IMAGE_COLORMAP_ACCESS(fb);
...@@ -1327,6 +1336,7 @@ stifb_init_fb(struct sti_struct *sti, int force_bpp) ...@@ -1327,6 +1336,7 @@ stifb_init_fb(struct sti_struct *sti, int force_bpp)
info->screen_base = (void*) REGION_BASE(fb,1); info->screen_base = (void*) REGION_BASE(fb,1);
info->flags = FBINFO_DEFAULT; info->flags = FBINFO_DEFAULT;
info->currcon = -1; info->currcon = -1;
info->pseudo_palette = &fb->pseudo_palette;
/* This has to been done !!! */ /* This has to been done !!! */
fb_alloc_cmap(&info->cmap, 256, 0); fb_alloc_cmap(&info->cmap, 256, 0);
...@@ -1383,6 +1393,7 @@ int __init ...@@ -1383,6 +1393,7 @@ int __init
stifb_init(void) stifb_init(void)
{ {
struct sti_struct *sti; struct sti_struct *sti;
struct sti_struct *def_sti;
int i; int i;
#ifndef MODULE #ifndef MODULE
...@@ -1397,9 +1408,19 @@ stifb_init(void) ...@@ -1397,9 +1408,19 @@ stifb_init(void)
return -ENXIO; return -ENXIO;
} }
def_sti = sti_get_rom(0);
if (def_sti) {
for (i = 1; i < MAX_STI_ROMS; i++) {
sti = sti_get_rom(i);
if (sti == def_sti && bpp > 0)
stifb_force_bpp[i] = bpp;
}
stifb_init_fb(def_sti, stifb_force_bpp[i]);
}
for (i = 1; i < MAX_STI_ROMS; i++) { for (i = 1; i < MAX_STI_ROMS; i++) {
sti = sti_get_rom(i); sti = sti_get_rom(i);
if (!sti) if (!sti || sti==def_sti)
break; break;
if (bpp > 0) if (bpp > 0)
stifb_force_bpp[i] = bpp; stifb_force_bpp[i] = bpp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment