ar71xx_bus_space_reversed.c revision 330897
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2009, Oleksandr Tymoshenko <gonzo@FreeBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice unmodified, this list of conditions, and the following
12 *    disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: stable/11/sys/mips/atheros/ar71xx_bus_space_reversed.c 330897 2018-03-14 03:19:51Z eadler $");
31
32#include <sys/param.h>
33#include <sys/systm.h>
34#include <sys/bus.h>
35
36#include <machine/bus.h>
37#include <mips/atheros/ar71xx_bus_space_reversed.h>
38
39static bs_r_1_proto(reversed);
40static bs_r_2_proto(reversed);
41static bs_w_1_proto(reversed);
42static bs_w_2_proto(reversed);
43
44/*
45 * Bus space that handles offsets in word for 1/2 bytes read/write access.
46 * Byte order of values is handled by device drivers itself.
47 */
48static struct bus_space bus_space_reversed = {
49	/* cookie */
50	(void *) 0,
51
52	/* mapping/unmapping */
53	generic_bs_map,
54	generic_bs_unmap,
55	generic_bs_subregion,
56
57	/* allocation/deallocation */
58	NULL,
59	NULL,
60
61	/* barrier */
62	generic_bs_barrier,
63
64	/* read (single) */
65	reversed_bs_r_1,
66	reversed_bs_r_2,
67	generic_bs_r_4,
68	NULL,
69
70	/* read multiple */
71	generic_bs_rm_1,
72	generic_bs_rm_2,
73	generic_bs_rm_4,
74	NULL,
75
76	/* read region */
77	generic_bs_rr_1,
78	generic_bs_rr_2,
79	generic_bs_rr_4,
80	NULL,
81
82	/* write (single) */
83	reversed_bs_w_1,
84	reversed_bs_w_2,
85	generic_bs_w_4,
86	NULL,
87
88	/* write multiple */
89	generic_bs_wm_1,
90	generic_bs_wm_2,
91	generic_bs_wm_4,
92	NULL,
93
94	/* write region */
95	NULL,
96	generic_bs_wr_2,
97	generic_bs_wr_4,
98	NULL,
99
100	/* set multiple */
101	NULL,
102	NULL,
103	NULL,
104	NULL,
105
106	/* set region */
107	NULL,
108	generic_bs_sr_2,
109	generic_bs_sr_4,
110	NULL,
111
112	/* copy */
113	NULL,
114	generic_bs_c_2,
115	NULL,
116	NULL,
117
118	/* read (single) stream */
119	generic_bs_r_1,
120	generic_bs_r_2,
121	generic_bs_r_4,
122	NULL,
123
124	/* read multiple stream */
125	generic_bs_rm_1,
126	generic_bs_rm_2,
127	generic_bs_rm_4,
128	NULL,
129
130	/* read region stream */
131	generic_bs_rr_1,
132	generic_bs_rr_2,
133	generic_bs_rr_4,
134	NULL,
135
136	/* write (single) stream */
137	generic_bs_w_1,
138	generic_bs_w_2,
139	generic_bs_w_4,
140	NULL,
141
142	/* write multiple stream */
143	generic_bs_wm_1,
144	generic_bs_wm_2,
145	generic_bs_wm_4,
146	NULL,
147
148	/* write region stream */
149	NULL,
150	generic_bs_wr_2,
151	generic_bs_wr_4,
152	NULL,
153};
154
155bus_space_tag_t ar71xx_bus_space_reversed = &bus_space_reversed;
156
157static uint8_t
158reversed_bs_r_1(void *t, bus_space_handle_t h, bus_size_t o)
159{
160
161	return readb(h + (o &~ 3) + (3 - (o & 3)));
162}
163
164static void
165reversed_bs_w_1(void *t, bus_space_handle_t h, bus_size_t o, u_int8_t v)
166{
167
168	writeb(h + (o &~ 3) + (3 - (o & 3)), v);
169}
170
171static uint16_t
172reversed_bs_r_2(void *t, bus_space_handle_t h, bus_size_t o)
173{
174
175	return readw(h + (o &~ 3) + (2 - (o & 3)));
176}
177
178static void
179reversed_bs_w_2(void *t, bus_space_handle_t h, bus_size_t o, uint16_t v)
180{
181
182	writew(h + (o &~ 3) + (2 - (o & 3)), v);
183}
184