[PATCH] Console rotation fixes
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 28 Nov 2005 21:43:52 +0000 (13:43 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 28 Nov 2005 22:42:23 +0000 (14:42 -0800)
Remove bogus usage of test/set_bit() from fbcon rotation code and just
manipulate the bits directly.  This fixes an oops on powerpc among others
and should be faster.  Seems to work fine on the G5 here.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Acked-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/video/console/fbcon_ccw.c
drivers/video/console/fbcon_rotate.h

index 3afd1eeb1adebc38b5432a36ecaca220a88eba88..4952b66ae2062996d13ce6efcbb0b7df29c68470 100644 (file)
@@ -34,7 +34,7 @@ static inline void ccw_update_attr(u8 *dst, u8 *src, int attribute,
                msk <<= (8 - mod);
 
        if (offset > mod)
-               set_bit(FBCON_BIT(7), (void *)&msk1);
+               msk1 |= 0x01;
 
        for (i = 0; i < vc->vc_font.width; i++) {
                for (j = 0; j < width; j++) {
index e504fbf5c6045bedb1319d76f968b0c4e425007f..1b8f92fdc6a82f3c02b8c02096832d053ba6e1d9 100644 (file)
         (s == SCROLL_REDRAW || s == SCROLL_MOVE || !(i)->fix.xpanstep) ? \
         (i)->var.xres : (i)->var.xres_virtual; })
 
-/*
- * The bitmap is always big endian
- */
-#if defined(__LITTLE_ENDIAN)
-#define FBCON_BIT(b) (7 - (b))
-#else
-#define FBCON_BIT(b) (b)
-#endif
 
 static inline int pattern_test_bit(u32 x, u32 y, u32 pitch, const char *pat)
 {
        u32 tmp = (y * pitch) + x, index = tmp / 8,  bit = tmp % 8;
 
        pat +=index;
-       return (test_bit(FBCON_BIT(bit), (void *)pat));
+       return (*pat) & (0x80 >> bit);
 }
 
 static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)
@@ -43,7 +35,8 @@ static inline void pattern_set_bit(u32 x, u32 y, u32 pitch, char *pat)
        u32 tmp = (y * pitch) + x, index = tmp / 8, bit = tmp % 8;
 
        pat += index;
-       set_bit(FBCON_BIT(bit), (void *)pat);
+
+       (*pat) |= 0x80 >> bit;
 }
 
 static inline void rotate_ud(const char *in, char *out, u32 width, u32 height)