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