1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
7 #ifndef __BASIC_TYPES_H__
8 #define __BASIC_TYPES_H__
10 #include <linux/types.h>
14 /* TODO: Macros Below are Sync from SD7-Driver. It is necessary
15 * to check correctness
19 * Call endian free function when
20 * 1. Read/write packet content.
21 * 2. Before write integer to IO.
22 * 3. After read integer from IO.
25 /* Convert little data endian to host ordering */
26 #define EF1BYTE(_val) \
28 #define EF2BYTE(_val) \
30 #define EF4BYTE(_val) \
35 * BIT_LEN_MASK_32(0) => 0x00000000
36 * BIT_LEN_MASK_32(1) => 0x00000001
37 * BIT_LEN_MASK_32(2) => 0x00000003
38 * BIT_LEN_MASK_32(32) => 0xFFFFFFFF
40 #define BIT_LEN_MASK_32(__bitlen) \
41 (0xFFFFFFFF >> (32 - (__bitlen)))
42 #define BIT_LEN_MASK_16(__bitlen) \
43 (0xFFFF >> (16 - (__bitlen)))
44 #define BIT_LEN_MASK_8(__bitlen) \
45 (0xFF >> (8 - (__bitlen)))
47 /* Create an offset bit mask
49 * BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003
50 * BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000
52 #define BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen) \
53 (BIT_LEN_MASK_32(__bitlen) << (__bitoffset))
54 #define BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen) \
55 (BIT_LEN_MASK_16(__bitlen) << (__bitoffset))
56 #define BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen) \
57 (BIT_LEN_MASK_8(__bitlen) << (__bitoffset))
60 * Return 4-byte value in host byte ordering from
61 * 4-byte pointer in little-endian system.
63 #define LE_P4BYTE_TO_HOST_4BYTE(__pstart) \
64 (EF4BYTE(*((__le32 *)(__pstart))))
65 #define LE_P2BYTE_TO_HOST_2BYTE(__pstart) \
66 (EF2BYTE(*((__le16 *)(__pstart))))
67 #define LE_P1BYTE_TO_HOST_1BYTE(__pstart) \
68 (EF1BYTE(*((u8 *)(__pstart))))
71 * Translate subfield (continuous bits in little-endian) of 4-byte
72 * value to host byte ordering.
74 #define LE_BITS_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
76 (LE_P4BYTE_TO_HOST_4BYTE(__pstart) >> (__bitoffset)) & \
77 BIT_LEN_MASK_32(__bitlen) \
79 #define LE_BITS_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
81 (LE_P2BYTE_TO_HOST_2BYTE(__pstart) >> (__bitoffset)) & \
82 BIT_LEN_MASK_16(__bitlen) \
84 #define LE_BITS_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
86 (LE_P1BYTE_TO_HOST_1BYTE(__pstart) >> (__bitoffset)) & \
87 BIT_LEN_MASK_8(__bitlen) \
91 * Mask subfield (continuous bits in little-endian) of 4-byte value
92 * and return the result in 4-byte value in host byte ordering.
94 #define LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) \
96 LE_P4BYTE_TO_HOST_4BYTE(__pstart) & \
97 (~BIT_OFFSET_LEN_MASK_32(__bitoffset, __bitlen)) \
99 #define LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) \
101 LE_P2BYTE_TO_HOST_2BYTE(__pstart) & \
102 (~BIT_OFFSET_LEN_MASK_16(__bitoffset, __bitlen)) \
104 #define LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) \
106 LE_P1BYTE_TO_HOST_1BYTE(__pstart) & \
107 (~BIT_OFFSET_LEN_MASK_8(__bitoffset, __bitlen)) \
111 * Set subfield of little-endian 4-byte value to specified value.
113 #define SET_BITS_TO_LE_4BYTE(__pstart, __bitoffset, __bitlen, __val) \
114 *((u32 *)(__pstart)) = \
116 LE_BITS_CLEARED_TO_4BYTE(__pstart, __bitoffset, __bitlen) | \
117 ((((u32)__val) & BIT_LEN_MASK_32(__bitlen)) << (__bitoffset)) \
120 #define SET_BITS_TO_LE_2BYTE(__pstart, __bitoffset, __bitlen, __val) \
121 *((u16 *)(__pstart)) = \
123 LE_BITS_CLEARED_TO_2BYTE(__pstart, __bitoffset, __bitlen) | \
124 ((((u16)__val) & BIT_LEN_MASK_16(__bitlen)) << (__bitoffset)) \
127 #define SET_BITS_TO_LE_1BYTE(__pstart, __bitoffset, __bitlen, __val) \
128 *((u8 *)(__pstart)) = EF1BYTE \
130 LE_BITS_CLEARED_TO_1BYTE(__pstart, __bitoffset, __bitlen) | \
131 ((((u8)__val) & BIT_LEN_MASK_8(__bitlen)) << (__bitoffset)) \
134 #endif /* __BASIC_TYPES_H__ */