Commit 60d300c02fe2e0be9bb02904361e41e0307264b2
Committed by
Linus Torvalds
1 parent
42d77c7017
Exists in
master
and in
39 other branches
[PATCH] include/linux/soundcard.h: endianness fix
Fixes for big-endian systems in soundcard.h and awe_voice.h This patch fixes the AFMT_S16_NE (include/linux/soundcard.h) and AWE_PATCH (awe_voice.h) macros on big-endian systems. It also moves _PATCHKEY into a new file, patchkey.h, in order to remove a duplicate definition of it from awe_voice.h. Signed-off-by: Stuart Brady <sdbrady@ntlworld.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 3 changed files with 75 additions and 10 deletions Side-by-side Diff
include/linux/awe_voice.h
... | ... | @@ -29,9 +29,9 @@ |
29 | 29 | #define SAMPLE_TYPE_AWE32 0x20 |
30 | 30 | #endif |
31 | 31 | |
32 | -#ifndef _PATCHKEY | |
33 | -#define _PATCHKEY(id) ((id<<8)|0xfd) | |
34 | -#endif | |
32 | +#define _LINUX_PATCHKEY_H_INDIRECT | |
33 | +#include <linux/patchkey.h> | |
34 | +#undef _LINUX_PATCHKEY_H_INDIRECT | |
35 | 35 | |
36 | 36 | /*---------------------------------------------------------------- |
37 | 37 | * patch information record |
include/linux/patchkey.h
1 | +/* | |
2 | + * <linux/patchkey.h> -- definition of _PATCHKEY macro | |
3 | + * | |
4 | + * Copyright (C) 2005 Stuart Brady | |
5 | + * | |
6 | + * This exists because awe_voice.h defined its own _PATCHKEY and it wasn't | |
7 | + * clear whether removing this would break anything in userspace. | |
8 | + * | |
9 | + * Do not include this file directly. Please use <sys/soundcard.h> instead. | |
10 | + * For kernel code, use <linux/soundcard.h> | |
11 | + */ | |
12 | + | |
13 | +#ifndef _LINUX_PATCHKEY_H_INDIRECT | |
14 | +#error "patchkey.h included directly" | |
15 | +#endif | |
16 | + | |
17 | +#ifndef _LINUX_PATCHKEY_H | |
18 | +#define _LINUX_PATCHKEY_H | |
19 | + | |
20 | +/* Endian macros. */ | |
21 | +#ifdef __KERNEL__ | |
22 | +# include <asm/byteorder.h> | |
23 | +#else | |
24 | +# include <endian.h> | |
25 | +#endif | |
26 | + | |
27 | +#if defined(__KERNEL__) | |
28 | +# if defined(__BIG_ENDIAN) | |
29 | +# define _PATCHKEY(id) (0xfd00|id) | |
30 | +# elif defined(__LITTLE_ENDIAN) | |
31 | +# define _PATCHKEY(id) ((id<<8)|0x00fd) | |
32 | +# else | |
33 | +# error "could not determine byte order" | |
34 | +# endif | |
35 | +#elif defined(__BYTE_ORDER) | |
36 | +# if __BYTE_ORDER == __BIG_ENDIAN | |
37 | +# define _PATCHKEY(id) (0xfd00|id) | |
38 | +# elif __BYTE_ORDER == __LITTLE_ENDIAN | |
39 | +# define _PATCHKEY(id) ((id<<8)|0x00fd) | |
40 | +# else | |
41 | +# error "could not determine byte order" | |
42 | +# endif | |
43 | +#endif | |
44 | + | |
45 | +#endif /* _LINUX_PATCHKEY_H */ |
include/linux/soundcard.h
... | ... | @@ -39,6 +39,13 @@ |
39 | 39 | /* In Linux we need to be prepared for cross compiling */ |
40 | 40 | #include <linux/ioctl.h> |
41 | 41 | |
42 | +/* Endian macros. */ | |
43 | +#ifdef __KERNEL__ | |
44 | +# include <asm/byteorder.h> | |
45 | +#else | |
46 | +# include <endian.h> | |
47 | +#endif | |
48 | + | |
42 | 49 | /* |
43 | 50 | * Supported card ID numbers (Should be somewhere else?) |
44 | 51 | */ |
... | ... | @@ -179,13 +186,26 @@ |
179 | 186 | * Some big endian/little endian handling macros |
180 | 187 | */ |
181 | 188 | |
182 | -#if defined(_AIX) || defined(AIX) || defined(sparc) || defined(__sparc__) || defined(HPPA) || defined(PPC) || defined(__mc68000__) | |
183 | -/* Big endian machines */ | |
184 | -# define _PATCHKEY(id) (0xfd00|id) | |
185 | -# define AFMT_S16_NE AFMT_S16_BE | |
186 | -#else | |
187 | -# define _PATCHKEY(id) ((id<<8)|0xfd) | |
188 | -# define AFMT_S16_NE AFMT_S16_LE | |
189 | +#define _LINUX_PATCHKEY_H_INDIRECT | |
190 | +#include <linux/patchkey.h> | |
191 | +#undef _LINUX_PATCHKEY_H_INDIRECT | |
192 | + | |
193 | +#if defined(__KERNEL__) | |
194 | +# if defined(__BIG_ENDIAN) | |
195 | +# define AFMT_S16_NE AFMT_S16_BE | |
196 | +# elif defined(__LITTLE_ENDIAN) | |
197 | +# define AFMT_S16_NE AFMT_S16_LE | |
198 | +# else | |
199 | +# error "could not determine byte order" | |
200 | +# endif | |
201 | +#elif defined(__BYTE_ORDER) | |
202 | +# if __BYTE_ORDER == __BIG_ENDIAN | |
203 | +# define AFMT_S16_NE AFMT_S16_BE | |
204 | +# elif __BYTE_ORDER == __LITTLE_ENDIAN | |
205 | +# define AFMT_S16_NE AFMT_S16_LE | |
206 | +# else | |
207 | +# error "could not determine byte order" | |
208 | +# endif | |
189 | 209 | #endif |
190 | 210 | |
191 | 211 | /* |