diff options
author | Geert Uytterhoeven <geert@linux-m68k.org> | 2009-01-04 05:58:20 -0500 |
---|---|---|
committer | Geert Uytterhoeven <geert@linux-m68k.org> | 2009-01-12 14:56:31 -0500 |
commit | 2cd1de0a0ff1d3da08ff1f1437cf4a44deae6a00 (patch) | |
tree | d384dea3a349ee2f2f897e242882cbbb7e56a705 /drivers/video | |
parent | 1f034456c140a8677d0ff3a9bdb3c4b620aae2cb (diff) |
fbdev: c2p - Extract common c2p core to c2p_core.h
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/c2p.c | 92 | ||||
-rw-r--r-- | drivers/video/c2p_core.h | 106 |
2 files changed, 107 insertions, 91 deletions
diff --git a/drivers/video/c2p.c b/drivers/video/c2p.c index c170fff0d35e..1238c8b912ea 100644 --- a/drivers/video/c2p.c +++ b/drivers/video/c2p.c | |||
@@ -3,10 +3,6 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2003-2008 Geert Uytterhoeven | 4 | * Copyright (C) 2003-2008 Geert Uytterhoeven |
5 | * | 5 | * |
6 | * NOTES: | ||
7 | * - This code was inspired by Scout's C2P tutorial | ||
8 | * - It assumes to run on a big endian system | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | 6 | * This file is subject to the terms and conditions of the GNU General Public |
11 | * License. See the file COPYING in the main directory of this archive | 7 | * License. See the file COPYING in the main directory of this archive |
12 | * for more details. | 8 | * for more details. |
@@ -18,82 +14,7 @@ | |||
18 | #include <asm/unaligned.h> | 14 | #include <asm/unaligned.h> |
19 | 15 | ||
20 | #include "c2p.h" | 16 | #include "c2p.h" |
21 | 17 | #include "c2p_core.h" | |
22 | |||
23 | /* | ||
24 | * Basic transpose step | ||
25 | */ | ||
26 | |||
27 | static inline void _transp(u32 d[], unsigned int i1, unsigned int i2, | ||
28 | unsigned int shift, u32 mask) | ||
29 | { | ||
30 | u32 t = (d[i1] ^ (d[i2] >> shift)) & mask; | ||
31 | |||
32 | d[i1] ^= t; | ||
33 | d[i2] ^= t << shift; | ||
34 | } | ||
35 | |||
36 | extern void c2p_unsupported(void); | ||
37 | |||
38 | static inline u32 get_mask(unsigned int n) | ||
39 | { | ||
40 | switch (n) { | ||
41 | case 1: | ||
42 | return 0x55555555; | ||
43 | |||
44 | case 2: | ||
45 | return 0x33333333; | ||
46 | |||
47 | case 4: | ||
48 | return 0x0f0f0f0f; | ||
49 | |||
50 | case 8: | ||
51 | return 0x00ff00ff; | ||
52 | |||
53 | case 16: | ||
54 | return 0x0000ffff; | ||
55 | } | ||
56 | |||
57 | c2p_unsupported(); | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static inline void transp8(u32 d[], unsigned int n, unsigned int m) | ||
62 | { | ||
63 | u32 mask = get_mask(n); | ||
64 | |||
65 | switch (m) { | ||
66 | case 1: | ||
67 | /* First n x 1 block */ | ||
68 | _transp(d, 0, 1, n, mask); | ||
69 | /* Second n x 1 block */ | ||
70 | _transp(d, 2, 3, n, mask); | ||
71 | /* Third n x 1 block */ | ||
72 | _transp(d, 4, 5, n, mask); | ||
73 | /* Fourth n x 1 block */ | ||
74 | _transp(d, 6, 7, n, mask); | ||
75 | return; | ||
76 | |||
77 | case 2: | ||
78 | /* First n x 2 block */ | ||
79 | _transp(d, 0, 2, n, mask); | ||
80 | _transp(d, 1, 3, n, mask); | ||
81 | /* Second n x 2 block */ | ||
82 | _transp(d, 4, 6, n, mask); | ||
83 | _transp(d, 5, 7, n, mask); | ||
84 | return; | ||
85 | |||
86 | case 4: | ||
87 | /* Single n x 4 block */ | ||
88 | _transp(d, 0, 4, n, mask); | ||
89 | _transp(d, 1, 5, n, mask); | ||
90 | _transp(d, 2, 6, n, mask); | ||
91 | _transp(d, 3, 7, n, mask); | ||
92 | return; | ||
93 | } | ||
94 | |||
95 | c2p_unsupported(); | ||
96 | } | ||
97 | 18 | ||
98 | 19 | ||
99 | /* | 20 | /* |
@@ -121,17 +42,6 @@ static const int perm_c2p_32x8[8] = { 7, 5, 3, 1, 6, 4, 2, 0 }; | |||
121 | 42 | ||
122 | 43 | ||
123 | /* | 44 | /* |
124 | * Compose two values, using a bitmask as decision value | ||
125 | * This is equivalent to (a & mask) | (b & ~mask) | ||
126 | */ | ||
127 | |||
128 | static inline u32 comp(u32 a, u32 b, u32 mask) | ||
129 | { | ||
130 | return ((a ^ b) & mask) ^ b; | ||
131 | } | ||
132 | |||
133 | |||
134 | /* | ||
135 | * Store a full block of planar data after c2p conversion | 45 | * Store a full block of planar data after c2p conversion |
136 | */ | 46 | */ |
137 | 47 | ||
diff --git a/drivers/video/c2p_core.h b/drivers/video/c2p_core.h new file mode 100644 index 000000000000..3573cf723e43 --- /dev/null +++ b/drivers/video/c2p_core.h | |||
@@ -0,0 +1,106 @@ | |||
1 | /* | ||
2 | * Fast C2P (Chunky-to-Planar) Conversion | ||
3 | * | ||
4 | * Copyright (C) 2003-2008 Geert Uytterhoeven | ||
5 | * | ||
6 | * NOTES: | ||
7 | * - This code was inspired by Scout's C2P tutorial | ||
8 | * - It assumes to run on a big endian system | ||
9 | * | ||
10 | * This file is subject to the terms and conditions of the GNU General Public | ||
11 | * License. See the file COPYING in the main directory of this archive | ||
12 | * for more details. | ||
13 | */ | ||
14 | |||
15 | |||
16 | /* | ||
17 | * Basic transpose step | ||
18 | */ | ||
19 | |||
20 | static inline void _transp(u32 d[], unsigned int i1, unsigned int i2, | ||
21 | unsigned int shift, u32 mask) | ||
22 | { | ||
23 | u32 t = (d[i1] ^ (d[i2] >> shift)) & mask; | ||
24 | |||
25 | d[i1] ^= t; | ||
26 | d[i2] ^= t << shift; | ||
27 | } | ||
28 | |||
29 | |||
30 | extern void c2p_unsupported(void); | ||
31 | |||
32 | static inline u32 get_mask(unsigned int n) | ||
33 | { | ||
34 | switch (n) { | ||
35 | case 1: | ||
36 | return 0x55555555; | ||
37 | |||
38 | case 2: | ||
39 | return 0x33333333; | ||
40 | |||
41 | case 4: | ||
42 | return 0x0f0f0f0f; | ||
43 | |||
44 | case 8: | ||
45 | return 0x00ff00ff; | ||
46 | |||
47 | case 16: | ||
48 | return 0x0000ffff; | ||
49 | } | ||
50 | |||
51 | c2p_unsupported(); | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | |||
56 | /* | ||
57 | * Transpose operations on 8 32-bit words | ||
58 | */ | ||
59 | |||
60 | static inline void transp8(u32 d[], unsigned int n, unsigned int m) | ||
61 | { | ||
62 | u32 mask = get_mask(n); | ||
63 | |||
64 | switch (m) { | ||
65 | case 1: | ||
66 | /* First n x 1 block */ | ||
67 | _transp(d, 0, 1, n, mask); | ||
68 | /* Second n x 1 block */ | ||
69 | _transp(d, 2, 3, n, mask); | ||
70 | /* Third n x 1 block */ | ||
71 | _transp(d, 4, 5, n, mask); | ||
72 | /* Fourth n x 1 block */ | ||
73 | _transp(d, 6, 7, n, mask); | ||
74 | return; | ||
75 | |||
76 | case 2: | ||
77 | /* First n x 2 block */ | ||
78 | _transp(d, 0, 2, n, mask); | ||
79 | _transp(d, 1, 3, n, mask); | ||
80 | /* Second n x 2 block */ | ||
81 | _transp(d, 4, 6, n, mask); | ||
82 | _transp(d, 5, 7, n, mask); | ||
83 | return; | ||
84 | |||
85 | case 4: | ||
86 | /* Single n x 4 block */ | ||
87 | _transp(d, 0, 4, n, mask); | ||
88 | _transp(d, 1, 5, n, mask); | ||
89 | _transp(d, 2, 6, n, mask); | ||
90 | _transp(d, 3, 7, n, mask); | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | c2p_unsupported(); | ||
95 | } | ||
96 | |||
97 | |||
98 | /* | ||
99 | * Compose two values, using a bitmask as decision value | ||
100 | * This is equivalent to (a & mask) | (b & ~mask) | ||
101 | */ | ||
102 | |||
103 | static inline u32 comp(u32 a, u32 b, u32 mask) | ||
104 | { | ||
105 | return ((a ^ b) & mask) ^ b; | ||
106 | } | ||