aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/fb_draw.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/fb_draw.h')
-rw-r--r--drivers/video/fb_draw.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/drivers/video/fb_draw.h b/drivers/video/fb_draw.h
index c5c45203833b..816843f06bb7 100644
--- a/drivers/video/fb_draw.h
+++ b/drivers/video/fb_draw.h
@@ -2,6 +2,7 @@
2#define _FB_DRAW_H 2#define _FB_DRAW_H
3 3
4#include <asm/types.h> 4#include <asm/types.h>
5#include <linux/fb.h>
5 6
6 /* 7 /*
7 * Compose two values, using a bitmask as decision value 8 * Compose two values, using a bitmask as decision value
@@ -69,4 +70,71 @@ pixel_to_pat( u32 bpp, u32 pixel)
69 } 70 }
70} 71}
71#endif 72#endif
73
74#ifdef CONFIG_FB_CFB_REV_PIXELS_IN_BYTE
75
76static inline u32 fb_shifted_pixels_mask_u32(u32 index, u32 bswapmask)
77{
78 u32 mask;
79
80 if (!bswapmask) {
81 mask = FB_SHIFT_HIGH(~(u32)0, index);
82 } else {
83 mask = 0xff << FB_LEFT_POS(8);
84 mask = FB_SHIFT_LOW(mask, index & (bswapmask)) & mask;
85 mask = FB_SHIFT_HIGH(mask, index & ~(bswapmask));
86#if defined(__i386__) || defined(__x86_64__)
87 /* Shift argument is limited to 0 - 31 on x86 based CPU's */
88 if(index + bswapmask < 32)
89#endif
90 mask |= FB_SHIFT_HIGH(~(u32)0,
91 (index + bswapmask) & ~(bswapmask));
92 }
93 return mask;
94}
95
96static inline unsigned long fb_shifted_pixels_mask_long(u32 index, u32 bswapmask)
97{
98 unsigned long mask;
99
100 if (!bswapmask) {
101 mask = FB_SHIFT_HIGH(~0UL, index);
102 } else {
103 mask = 0xff << FB_LEFT_POS(8);
104 mask = FB_SHIFT_LOW(mask, index & (bswapmask)) & mask;
105 mask = FB_SHIFT_HIGH(mask, index & ~(bswapmask));
106#if defined(__i386__) || defined(__x86_64__)
107 /* Shift argument is limited to 0 - 31 on x86 based CPU's */
108 if(index + bswapmask < BITS_PER_LONG)
109#endif
110 mask |= FB_SHIFT_HIGH(~0UL,
111 (index + bswapmask) & ~(bswapmask));
112 }
113 return mask;
114}
115
116
117static inline u32 fb_compute_bswapmask(struct fb_info *info)
118{
119 u32 bswapmask = 0;
120 unsigned bpp = info->var.bits_per_pixel;
121
122 if ((bpp < 8) && (info->var.nonstd & FB_NONSTD_REV_PIX_IN_B)) {
123 /*
124 * Reversed order of pixel layout in bytes
125 * works only for 1, 2 and 4 bpp
126 */
127 bswapmask = 7 - bpp + 1;
128 }
129 return bswapmask;
130}
131
132#else /* CONFIG_FB_CFB_REV_PIXELS_IN_BYTE */
133
134#define fb_shifted_pixels_mask_u32(i, b) FB_SHIFT_HIGH(~(u32)0, (i))
135#define fb_shifted_pixels_mask_long(i, b) FB_SHIFT_HIGH(~0UL, (i))
136#define fb_compute_bswapmask(...) 0
137
138#endif /* CONFIG_FB_CFB_REV_PIXELS_IN_BYTE */
139
72#endif /* FB_DRAW_H */ 140#endif /* FB_DRAW_H */