xref: /openbmc/u-boot/arch/m68k/include/asm/byteorder.h (revision 0eee446e)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2819833afSPeter Tyser /*
3819833afSPeter Tyser  * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
4819833afSPeter Tyser  * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
5819833afSPeter Tyser  */
6819833afSPeter Tyser 
7819833afSPeter Tyser #ifndef _M68K_BYTEORDER_H
8819833afSPeter Tyser #define _M68K_BYTEORDER_H
9819833afSPeter Tyser 
10819833afSPeter Tyser #include <asm/types.h>
11819833afSPeter Tyser 
12819833afSPeter Tyser #ifdef __GNUC__
13*faae4954SAngelo Dureghello 
__sw32(__u32 x)14*faae4954SAngelo Dureghello static inline __u32 __sw32(__u32 x)
15*faae4954SAngelo Dureghello {
16*faae4954SAngelo Dureghello 	__u32 v = x;
17*faae4954SAngelo Dureghello 
18*faae4954SAngelo Dureghello 	return v << 24 |
19*faae4954SAngelo Dureghello 		(v & (__u32)0x0000ff00UL) <<  8 |
20*faae4954SAngelo Dureghello 		(v & (__u32)0x00ff0000UL) >>  8 |
21*faae4954SAngelo Dureghello 		v >> 24;
22*faae4954SAngelo Dureghello }
23*faae4954SAngelo Dureghello 
__sw16(__u16 x)24*faae4954SAngelo Dureghello static inline __u16 __sw16(__u16 x)
25*faae4954SAngelo Dureghello {
26*faae4954SAngelo Dureghello 	__u16 v = x;
27*faae4954SAngelo Dureghello 
28*faae4954SAngelo Dureghello 	return (v & (__u16)0x00ffU) << 8 |
29*faae4954SAngelo Dureghello 		(v & (__u16)0xff00U) >> 8;
30*faae4954SAngelo Dureghello }
31819833afSPeter Tyser 
ld_le16(const volatile unsigned short * addr)3244d0677aSMåns Rullgård static __inline__ unsigned ld_le16(const volatile unsigned short *addr)
33819833afSPeter Tyser {
34*faae4954SAngelo Dureghello 	return __sw16(*addr);
35819833afSPeter Tyser }
36819833afSPeter Tyser 
st_le16(volatile unsigned short * addr,const unsigned val)3744d0677aSMåns Rullgård static __inline__ void st_le16(volatile unsigned short *addr,
38819833afSPeter Tyser 			       const unsigned val)
39819833afSPeter Tyser {
40819833afSPeter Tyser 	*addr = __sw16(val);
41819833afSPeter Tyser }
42819833afSPeter Tyser 
ld_le32(const volatile unsigned * addr)4344d0677aSMåns Rullgård static __inline__ unsigned ld_le32(const volatile unsigned *addr)
44819833afSPeter Tyser {
45*faae4954SAngelo Dureghello 	return __sw32(*addr);
46819833afSPeter Tyser }
47819833afSPeter Tyser 
st_le32(volatile unsigned * addr,const unsigned val)4844d0677aSMåns Rullgård static __inline__ void st_le32(volatile unsigned *addr, const unsigned val)
49819833afSPeter Tyser {
50819833afSPeter Tyser 	*addr = __sw32(val);
51819833afSPeter Tyser }
52819833afSPeter Tyser 
53819833afSPeter Tyser #if 0
54819833afSPeter Tyser /* alas, egcs sounds like it has a bug in this code that doesn't use the
55819833afSPeter Tyser    inline asm correctly, and can cause file corruption. Until I hear that
56819833afSPeter Tyser    it's fixed, I can live without the extra speed. I hope. */
57819833afSPeter Tyser #if !(__GNUC__ >= 2 && __GNUC_MINOR__ >= 90)
58819833afSPeter Tyser #if 0
59819833afSPeter Tyser #  define __arch_swab16(x) ld_le16(&x)
60819833afSPeter Tyser #  define __arch_swab32(x) ld_le32(&x)
61819833afSPeter Tyser #else
62819833afSPeter Tyser static __inline__ __attribute__ ((const))
63819833afSPeter Tyser __u16 ___arch__swab16(__u16 value)
64819833afSPeter Tyser {
65819833afSPeter Tyser 	return __sw16(value);
66819833afSPeter Tyser }
67819833afSPeter Tyser 
68819833afSPeter Tyser static __inline__ __attribute__ ((const))
69819833afSPeter Tyser __u32 ___arch__swab32(__u32 value)
70819833afSPeter Tyser {
71819833afSPeter Tyser 	return __sw32(value);
72819833afSPeter Tyser }
73819833afSPeter Tyser 
74819833afSPeter Tyser #define __arch__swab32(x) ___arch__swab32(x)
75819833afSPeter Tyser #define __arch__swab16(x) ___arch__swab16(x)
76819833afSPeter Tyser #endif				/* 0 */
77819833afSPeter Tyser 
78819833afSPeter Tyser #endif
79819833afSPeter Tyser 
80819833afSPeter Tyser /* The same, but returns converted value from the location pointer by addr. */
81819833afSPeter Tyser #define __arch__swab16p(addr) ld_le16(addr)
82819833afSPeter Tyser #define __arch__swab32p(addr) ld_le32(addr)
83819833afSPeter Tyser 
84819833afSPeter Tyser /* The same, but do the conversion in situ, ie. put the value back to addr. */
85819833afSPeter Tyser #define __arch__swab16s(addr) st_le16(addr,*addr)
86819833afSPeter Tyser #define __arch__swab32s(addr) st_le32(addr,*addr)
87819833afSPeter Tyser #endif
88819833afSPeter Tyser 
89819833afSPeter Tyser #endif				/* __GNUC__ */
90819833afSPeter Tyser 
91819833afSPeter Tyser #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
92819833afSPeter Tyser #define __BYTEORDER_HAS_U64__
93819833afSPeter Tyser #endif
94819833afSPeter Tyser #include <linux/byteorder/big_endian.h>
95819833afSPeter Tyser 
96819833afSPeter Tyser #endif				/* _M68K_BYTEORDER_H */
97