Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

matroxfb: color setting fixes

- the pseudo_palette is only 16 elements long.
- do not write to the pseudo_palette if regno (array index) is more than 15
- remove code that writes to the 17th entry of the pseudo_palette

Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Acked-by: Petr Vandrovec <vandrove@vc.cvut.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Antonino A. Daplas and committed by
Linus Torvalds
08a498de 000d5335

+8 -15
+2 -7
drivers/video/matrox/matroxfb_accel.c
··· 145 145 ACCESS_FBINFO(fbops).fb_imageblit = matroxfb_imageblit; 146 146 } 147 147 break; 148 - case 16: if (ACCESS_FBINFO(fbcon).var.green.length == 5) { 148 + case 16: if (ACCESS_FBINFO(fbcon).var.green.length == 5) 149 149 maccess = 0xC0000001; 150 - ACCESS_FBINFO(cmap[16]) = 0x7FFF7FFF; 151 - } else { 150 + else 152 151 maccess = 0x40000001; 153 - ACCESS_FBINFO(cmap[16]) = 0xFFFFFFFF; 154 - } 155 152 mopmode = M_OPMODE_16BPP; 156 153 if (accel) { 157 154 ACCESS_FBINFO(fbops).fb_copyarea = matroxfb_copyarea; ··· 158 161 break; 159 162 case 24: maccess = 0x00000003; 160 163 mopmode = M_OPMODE_24BPP; 161 - ACCESS_FBINFO(cmap[16]) = 0xFFFFFFFF; 162 164 if (accel) { 163 165 ACCESS_FBINFO(fbops).fb_copyarea = matroxfb_copyarea; 164 166 ACCESS_FBINFO(fbops).fb_fillrect = matroxfb_fillrect; ··· 166 170 break; 167 171 case 32: maccess = 0x00000002; 168 172 mopmode = M_OPMODE_32BPP; 169 - ACCESS_FBINFO(cmap[16]) = 0xFFFFFFFF; 170 173 if (accel) { 171 174 ACCESS_FBINFO(fbops).fb_copyarea = matroxfb_copyarea; 172 175 ACCESS_FBINFO(fbops).fb_fillrect = matroxfb_fillrect;
+4
drivers/video/matrox/matroxfb_base.c
··· 679 679 mga_outb(M_DAC_VAL, blue); 680 680 break; 681 681 case 16: 682 + if (regno >= 16) 683 + break; 682 684 { 683 685 u_int16_t col = 684 686 (red << ACCESS_FBINFO(fbcon).var.red.offset) | ··· 692 690 break; 693 691 case 24: 694 692 case 32: 693 + if (regno >= 16) 694 + break; 695 695 ACCESS_FBINFO(cmap[regno]) = 696 696 (red << ACCESS_FBINFO(fbcon).var.red.offset) | 697 697 (green << ACCESS_FBINFO(fbcon).var.green.offset) |
+1 -1
drivers/video/matrox/matroxfb_base.h
··· 518 518 dll:1; 519 519 } memory; 520 520 } values; 521 - u_int32_t cmap[17]; 521 + u_int32_t cmap[16]; 522 522 }; 523 523 524 524 #define info2minfo(info) container_of(info, struct matrox_fb_info, fbcon)
-6
drivers/video/matrox/matroxfb_crtc2.c
··· 163 163 ACCESS_FBINFO(hw).crtc2.ctl = 0x00000004; 164 164 } 165 165 166 - static void matroxfb_dh_cfbX_init(struct matroxfb_dh_fb_info* m2info) { 167 - /* no acceleration for secondary head... */ 168 - m2info->cmap[16] = 0xFFFFFFFF; 169 - } 170 - 171 166 static void matroxfb_dh_pan_var(struct matroxfb_dh_fb_info* m2info, 172 167 struct fb_var_screeninfo* var) { 173 168 unsigned int pos; ··· 380 385 } 381 386 } 382 387 up_read(&ACCESS_FBINFO(altout).lock); 383 - matroxfb_dh_cfbX_init(m2info); 384 388 } 385 389 m2info->initialized = 1; 386 390 return 0;
+1 -1
drivers/video/matrox/matroxfb_crtc2.h
··· 28 28 29 29 unsigned int interlaced:1; 30 30 31 - u_int32_t cmap[17]; 31 + u_int32_t cmap[16]; 32 32 }; 33 33 34 34 #endif /* __MATROXFB_CRTC2_H__ */