xref: /OK3568_Linux_fs/u-boot/arch/m68k/include/asm/byteorder.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
3*4882a593Smuzhiyun  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _M68K_BYTEORDER_H
9*4882a593Smuzhiyun #define _M68K_BYTEORDER_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <asm/types.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #ifdef __GNUC__
14*4882a593Smuzhiyun #define __sw16(x) \
15*4882a593Smuzhiyun 	((__u16)( \
16*4882a593Smuzhiyun 		(((__u16)(x) & (__u16)0x00ffU) << 8) | \
17*4882a593Smuzhiyun 		(((__u16)(x) & (__u16)0xff00U) >> 8) ))
18*4882a593Smuzhiyun #define __sw32(x) \
19*4882a593Smuzhiyun 	((__u32)( \
20*4882a593Smuzhiyun 		(((__u32)(x)) << 24) | \
21*4882a593Smuzhiyun 		(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) | \
22*4882a593Smuzhiyun 		(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) | \
23*4882a593Smuzhiyun 		(((__u32)(x)) >> 24) ))
24*4882a593Smuzhiyun 
ld_le16(const volatile unsigned short * addr)25*4882a593Smuzhiyun static __inline__ unsigned ld_le16(const volatile unsigned short *addr)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun 	unsigned result = *addr;
28*4882a593Smuzhiyun 	return __sw16(result);
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun 
st_le16(volatile unsigned short * addr,const unsigned val)31*4882a593Smuzhiyun static __inline__ void st_le16(volatile unsigned short *addr,
32*4882a593Smuzhiyun 			       const unsigned val)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	*addr = __sw16(val);
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
ld_le32(const volatile unsigned * addr)37*4882a593Smuzhiyun static __inline__ unsigned ld_le32(const volatile unsigned *addr)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	unsigned result = *addr;
40*4882a593Smuzhiyun 	return __sw32(result);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
st_le32(volatile unsigned * addr,const unsigned val)43*4882a593Smuzhiyun static __inline__ void st_le32(volatile unsigned *addr, const unsigned val)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	*addr = __sw32(val);
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #if 0
49*4882a593Smuzhiyun /* alas, egcs sounds like it has a bug in this code that doesn't use the
50*4882a593Smuzhiyun    inline asm correctly, and can cause file corruption. Until I hear that
51*4882a593Smuzhiyun    it's fixed, I can live without the extra speed. I hope. */
52*4882a593Smuzhiyun #if !(__GNUC__ >= 2 && __GNUC_MINOR__ >= 90)
53*4882a593Smuzhiyun #if 0
54*4882a593Smuzhiyun #  define __arch_swab16(x) ld_le16(&x)
55*4882a593Smuzhiyun #  define __arch_swab32(x) ld_le32(&x)
56*4882a593Smuzhiyun #else
57*4882a593Smuzhiyun static __inline__ __attribute__ ((const))
58*4882a593Smuzhiyun __u16 ___arch__swab16(__u16 value)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	return __sw16(value);
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun static __inline__ __attribute__ ((const))
64*4882a593Smuzhiyun __u32 ___arch__swab32(__u32 value)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun 	return __sw32(value);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define __arch__swab32(x) ___arch__swab32(x)
70*4882a593Smuzhiyun #define __arch__swab16(x) ___arch__swab16(x)
71*4882a593Smuzhiyun #endif				/* 0 */
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #endif
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* The same, but returns converted value from the location pointer by addr. */
76*4882a593Smuzhiyun #define __arch__swab16p(addr) ld_le16(addr)
77*4882a593Smuzhiyun #define __arch__swab32p(addr) ld_le32(addr)
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /* The same, but do the conversion in situ, ie. put the value back to addr. */
80*4882a593Smuzhiyun #define __arch__swab16s(addr) st_le16(addr,*addr)
81*4882a593Smuzhiyun #define __arch__swab32s(addr) st_le32(addr,*addr)
82*4882a593Smuzhiyun #endif
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #endif				/* __GNUC__ */
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
87*4882a593Smuzhiyun #define __BYTEORDER_HAS_U64__
88*4882a593Smuzhiyun #endif
89*4882a593Smuzhiyun #include <linux/byteorder/big_endian.h>
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #endif				/* _M68K_BYTEORDER_H */
92