1819833afSPeter Tyser /*
2819833afSPeter Tyser  * include/asm-microblaze/byteorder.h -- Endian id and conversion ops
3819833afSPeter Tyser  *
4819833afSPeter Tyser  *  Copyright (C) 2003  John Williams <jwilliams@itee.uq.edu.au>
5819833afSPeter Tyser  *  Copyright (C) 2001  NEC Corporation
6819833afSPeter Tyser  *  Copyright (C) 2001  Miles Bader <miles@gnu.org>
7819833afSPeter Tyser  *
8819833afSPeter Tyser  * This file is subject to the terms and conditions of the GNU General
9819833afSPeter Tyser  * Public License.  See the file COPYING in the main directory of this
10819833afSPeter Tyser  * archive for more details.
11819833afSPeter Tyser  *
12819833afSPeter Tyser  * Written by Miles Bader <miles@gnu.org>
13819833afSPeter Tyser  * Microblaze port by John Williams
14819833afSPeter Tyser  */
15819833afSPeter Tyser 
16819833afSPeter Tyser #ifndef __MICROBLAZE_BYTEORDER_H__
17819833afSPeter Tyser #define __MICROBLAZE_BYTEORDER_H__
18819833afSPeter Tyser 
19819833afSPeter Tyser #include <asm/types.h>
20819833afSPeter Tyser 
21819833afSPeter Tyser #ifdef __GNUC__
22819833afSPeter Tyser 
23819833afSPeter Tyser /* This is effectively a dupe of the arch-independent byteswap
24819833afSPeter Tyser    code in include/linux/byteorder/swab.h, however we force a cast
25819833afSPeter Tyser    of the result up to 32 bits.  This in turn forces the compiler
26819833afSPeter Tyser    to explicitly clear the high 16 bits, which it wasn't doing otherwise.
27819833afSPeter Tyser 
28819833afSPeter Tyser    I think this is a symptom of a bug in mb-gcc.  JW 20040303
29819833afSPeter Tyser */
30819833afSPeter Tyser 
31819833afSPeter Tyser 
32819833afSPeter Tyser static __inline__ __u16 ___arch__swab16 (__u16 half_word)
33819833afSPeter Tyser {
34819833afSPeter Tyser 	/* 32 bit temp to cast result, forcing clearing of high word */
35819833afSPeter Tyser 	__u32 temp;
36819833afSPeter Tyser 
37819833afSPeter Tyser 	temp = ((half_word & 0x00FFU) << 8) | ((half_word & 0xFF00U) >> 8);
38819833afSPeter Tyser 
39819833afSPeter Tyser 	return (__u16) temp;
40819833afSPeter Tyser }
41819833afSPeter Tyser 
42819833afSPeter Tyser #define __arch__swab16(x) ___arch__swab16(x)
43819833afSPeter Tyser 
44819833afSPeter Tyser /* Microblaze has no arch-specific endian conversion insns */
45819833afSPeter Tyser 
46819833afSPeter Tyser #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
47819833afSPeter Tyser #  define __BYTEORDER_HAS_U64__
48819833afSPeter Tyser #  define __SWAB_64_THRU_32__
49819833afSPeter Tyser #endif
50819833afSPeter Tyser 
51819833afSPeter Tyser #endif /* __GNUC__ */
52819833afSPeter Tyser 
53*b98cba09SMichal Simek #ifdef __MICROBLAZEEL__
54*b98cba09SMichal Simek #include <linux/byteorder/little_endian.h>
55*b98cba09SMichal Simek #else
56819833afSPeter Tyser #include <linux/byteorder/big_endian.h>
57*b98cba09SMichal Simek #endif
58819833afSPeter Tyser 
59819833afSPeter Tyser #endif /* __MICROBLAZE_BYTEORDER_H__ */
60