1819833afSPeter Tyser /*
2819833afSPeter Tyser * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
3819833afSPeter Tyser * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
4819833afSPeter Tyser *
51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
6819833afSPeter Tyser */
7819833afSPeter Tyser
8819833afSPeter Tyser #ifndef _M68K_BYTEORDER_H
9819833afSPeter Tyser #define _M68K_BYTEORDER_H
10819833afSPeter Tyser
11819833afSPeter Tyser #include <asm/types.h>
12819833afSPeter Tyser
13819833afSPeter Tyser #ifdef __GNUC__
14819833afSPeter Tyser #define __sw16(x) \
15819833afSPeter Tyser ((__u16)( \
16819833afSPeter Tyser (((__u16)(x) & (__u16)0x00ffU) << 8) | \
17819833afSPeter Tyser (((__u16)(x) & (__u16)0xff00U) >> 8) ))
18819833afSPeter Tyser #define __sw32(x) \
19819833afSPeter Tyser ((__u32)( \
20819833afSPeter Tyser (((__u32)(x)) << 24) | \
21819833afSPeter Tyser (((__u32)(x) & (__u32)0x0000ff00UL) << 8) | \
22819833afSPeter Tyser (((__u32)(x) & (__u32)0x00ff0000UL) >> 8) | \
23819833afSPeter Tyser (((__u32)(x)) >> 24) ))
24819833afSPeter Tyser
ld_le16(const volatile unsigned short * addr)25*44d0677aSMåns Rullgård static __inline__ unsigned ld_le16(const volatile unsigned short *addr)
26819833afSPeter Tyser {
27819833afSPeter Tyser unsigned result = *addr;
28819833afSPeter Tyser return __sw16(result);
29819833afSPeter Tyser }
30819833afSPeter Tyser
st_le16(volatile unsigned short * addr,const unsigned val)31*44d0677aSMåns Rullgård static __inline__ void st_le16(volatile unsigned short *addr,
32819833afSPeter Tyser const unsigned val)
33819833afSPeter Tyser {
34819833afSPeter Tyser *addr = __sw16(val);
35819833afSPeter Tyser }
36819833afSPeter Tyser
ld_le32(const volatile unsigned * addr)37*44d0677aSMåns Rullgård static __inline__ unsigned ld_le32(const volatile unsigned *addr)
38819833afSPeter Tyser {
39819833afSPeter Tyser unsigned result = *addr;
40819833afSPeter Tyser return __sw32(result);
41819833afSPeter Tyser }
42819833afSPeter Tyser
st_le32(volatile unsigned * addr,const unsigned val)43*44d0677aSMåns Rullgård static __inline__ void st_le32(volatile unsigned *addr, const unsigned val)
44819833afSPeter Tyser {
45819833afSPeter Tyser *addr = __sw32(val);
46819833afSPeter Tyser }
47819833afSPeter Tyser
48819833afSPeter Tyser #if 0
49819833afSPeter Tyser /* alas, egcs sounds like it has a bug in this code that doesn't use the
50819833afSPeter Tyser inline asm correctly, and can cause file corruption. Until I hear that
51819833afSPeter Tyser it's fixed, I can live without the extra speed. I hope. */
52819833afSPeter Tyser #if !(__GNUC__ >= 2 && __GNUC_MINOR__ >= 90)
53819833afSPeter Tyser #if 0
54819833afSPeter Tyser # define __arch_swab16(x) ld_le16(&x)
55819833afSPeter Tyser # define __arch_swab32(x) ld_le32(&x)
56819833afSPeter Tyser #else
57819833afSPeter Tyser static __inline__ __attribute__ ((const))
58819833afSPeter Tyser __u16 ___arch__swab16(__u16 value)
59819833afSPeter Tyser {
60819833afSPeter Tyser return __sw16(value);
61819833afSPeter Tyser }
62819833afSPeter Tyser
63819833afSPeter Tyser static __inline__ __attribute__ ((const))
64819833afSPeter Tyser __u32 ___arch__swab32(__u32 value)
65819833afSPeter Tyser {
66819833afSPeter Tyser return __sw32(value);
67819833afSPeter Tyser }
68819833afSPeter Tyser
69819833afSPeter Tyser #define __arch__swab32(x) ___arch__swab32(x)
70819833afSPeter Tyser #define __arch__swab16(x) ___arch__swab16(x)
71819833afSPeter Tyser #endif /* 0 */
72819833afSPeter Tyser
73819833afSPeter Tyser #endif
74819833afSPeter Tyser
75819833afSPeter Tyser /* The same, but returns converted value from the location pointer by addr. */
76819833afSPeter Tyser #define __arch__swab16p(addr) ld_le16(addr)
77819833afSPeter Tyser #define __arch__swab32p(addr) ld_le32(addr)
78819833afSPeter Tyser
79819833afSPeter Tyser /* The same, but do the conversion in situ, ie. put the value back to addr. */
80819833afSPeter Tyser #define __arch__swab16s(addr) st_le16(addr,*addr)
81819833afSPeter Tyser #define __arch__swab32s(addr) st_le32(addr,*addr)
82819833afSPeter Tyser #endif
83819833afSPeter Tyser
84819833afSPeter Tyser #endif /* __GNUC__ */
85819833afSPeter Tyser
86819833afSPeter Tyser #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
87819833afSPeter Tyser #define __BYTEORDER_HAS_U64__
88819833afSPeter Tyser #endif
89819833afSPeter Tyser #include <linux/byteorder/big_endian.h>
90819833afSPeter Tyser
91819833afSPeter Tyser #endif /* _M68K_BYTEORDER_H */
92