Setting up repository
[linux-libre-firmware.git] / ath9k_htc / target_firmware / magpie_fw_dev / target / inc / adf_os_io.h
1 /*
2  * Copyright (c) 2013 Qualcomm Atheros, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted (subject to the limitations in the
7  * disclaimer below) provided that the following conditions are met:
8  *
9  *  * Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  *  * Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the
15  *    distribution.
16  *
17  *  * Neither the name of Qualcomm Atheros nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22  * GRANTED BY THIS LICENSE.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23  * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 /**
36  * @ingroup adf_os_public
37  * @file adf_os_io.h
38  * This file abstracts I/O operations.
39  */
40
41 #ifndef _ADF_OS_IO_H
42 #define _ADF_OS_IO_H
43
44 #include <adf_os_io_pvt.h>
45
46 static inline uint8_t ioread8(const volatile uint32_t addr)
47 {
48         return *(const volatile uint8_t *) addr;
49 }
50
51 static inline uint16_t ioread16(const volatile uint32_t addr)
52 {
53         return *(const volatile uint16_t *) addr;
54 }
55
56 static inline uint32_t ioread32(const volatile uint32_t addr)
57 {
58         return *(const volatile uint32_t *) addr;
59 }
60
61 static inline void iowrite8(volatile uint32_t addr, const uint8_t b)
62 {
63         *(volatile uint8_t *) addr = b;
64 }
65
66 static inline void iowrite16(volatile uint32_t addr, const uint16_t b)
67 {
68         *(volatile uint16_t *) addr = b;
69 }
70
71 static inline void iowrite32(volatile uint32_t addr, const uint32_t b)
72 {
73         *(volatile uint32_t *) addr = b;
74 }
75
76 static inline void io8_rmw(volatile uint32_t addr,
77                             const uint8_t set, const uint8_t clr)
78 {
79         uint8_t val;
80
81         val = ioread8(addr);
82         val &= ~clr;
83         val |= set;
84         iowrite8(addr, val);
85 }
86
87 static inline void io32_rmw(volatile uint32_t addr,
88                             const uint32_t set, const uint32_t clr)
89 {
90         uint32_t val;
91
92         val = ioread32(addr);
93         val &= ~clr;
94         val |= set;
95         iowrite32(addr, val);
96 }
97
98 /* generic functions */
99 #define io8_set(addr, s)        io8_rmw((addr), (s), 0)
100 #define io8_clr(addr, c)        io8_rmw((addr), 0, (c))
101 #define io32_set(addr, s)       io32_rmw((addr), (s), 0)
102 #define io32_clr(addr, c)       io32_rmw((addr), 0, (c))
103
104 /* mac specific functions */
105 #define ioread32_mac(addr)      ioread32(WLAN_BASE_ADDRESS + (addr))
106 #define iowrite32_mac(addr, b)  iowrite32(WLAN_BASE_ADDRESS + (addr), (b))
107
108 /* usb specific functions */
109 #define ioread8_usb(addr)       ioread8(USB_CTRL_BASE_ADDRESS | (addr)^3)
110 #define ioread16_usb(addr)      ioread16(USB_CTRL_BASE_ADDRESS | (addr))
111 #define ioread32_usb(addr)      ioread32(USB_CTRL_BASE_ADDRESS | (addr))
112
113 #define iowrite8_usb(addr, b)   iowrite8(USB_CTRL_BASE_ADDRESS | (addr)^3, (b))
114 #define iowrite16_usb(addr, b)  iowrite16(USB_CTRL_BASE_ADDRESS | (addr), (b))
115 #define iowrite32_usb(addr, b)  iowrite32(USB_CTRL_BASE_ADDRESS | (addr), (b))
116
117 #define io8_rmw_usb(addr, s, c) \
118                 io8_rmw(USB_CTRL_BASE_ADDRESS | (addr)^3, (s), (c))
119 #define io8_set_usb(addr, s)    \
120                 io8_rmw(USB_CTRL_BASE_ADDRESS | (addr)^3, (s), 0)
121 #define io8_clr_usb(addr, c)    \
122                 io8_rmw(USB_CTRL_BASE_ADDRESS | (addr)^3, 0, (c))
123
124 #define io32_rmw_usb(addr, s, c) \
125                 io32_rmw(USB_CTRL_BASE_ADDRESS | (addr), (s), (c))
126 #define io32_set_usb(addr, s)   io32_rmw(USB_CTRL_BASE_ADDRESS | (addr), (s), 0)
127 #define io32_clr_usb(addr, c)   io32_rmw(USB_CTRL_BASE_ADDRESS | (addr), 0, (c))
128
129 /**
130  * @brief Convert a 16-bit value from network byte order to host byte order
131  */
132 #define adf_os_ntohs(x)                         __adf_os_ntohs(x)
133
134 /**
135  * @brief Convert a 32-bit value from network byte order to host byte order
136  */
137 #define adf_os_ntohl(x)                         __adf_os_ntohl(x)
138
139 /**
140  * @brief Convert a 16-bit value from host byte order to network byte order
141  */
142 #define adf_os_htons(x)                         __adf_os_htons(x)
143
144 /**
145  * @brief Convert a 32-bit value from host byte order to network byte order
146  */
147 #define adf_os_htonl(x)                         __adf_os_htonl(x)
148
149 /**
150  * @brief Convert a 16-bit value from CPU byte order to little-endian byte order
151  */
152 #define adf_os_cpu_to_le16(x)                   __adf_os_cpu_to_le16(x)
153
154 #endif