1 1.2 dyoung /* $NetBSD: adm5120_cfio.c,v 1.2 2011/07/01 18:38:48 dyoung Exp $ */ 2 1.1 dyoung 3 1.1 dyoung /*- 4 1.1 dyoung * Copyright (c) 2007 David Young. All rights reserved. 5 1.1 dyoung * 6 1.1 dyoung * Redistribution and use in source and binary forms, with or 7 1.1 dyoung * without modification, are permitted provided that the following 8 1.1 dyoung * conditions are met: 9 1.1 dyoung * 1. Redistributions of source code must retain the above copyright 10 1.1 dyoung * notice, this list of conditions and the following disclaimer. 11 1.1 dyoung * 2. Redistributions in binary form must reproduce the above 12 1.1 dyoung * copyright notice, this list of conditions and the following 13 1.1 dyoung * disclaimer in the documentation and/or other materials provided 14 1.1 dyoung * with the distribution. 15 1.1 dyoung * 3. The name of the author may not be used to endorse or promote 16 1.1 dyoung * products derived from this software without specific prior 17 1.1 dyoung * written permission. 18 1.1 dyoung * 19 1.1 dyoung * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY 20 1.1 dyoung * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 1.1 dyoung * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 22 1.1 dyoung * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 23 1.1 dyoung * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 24 1.1 dyoung * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 1.1 dyoung * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 26 1.1 dyoung * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 1.1 dyoung * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 28 1.1 dyoung * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 29 1.1 dyoung * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 30 1.1 dyoung * OF SUCH DAMAGE. 31 1.1 dyoung */ 32 1.1 dyoung #include <sys/cdefs.h> 33 1.2 dyoung __KERNEL_RCSID(0, "$NetBSD: adm5120_cfio.c,v 1.2 2011/07/01 18:38:48 dyoung Exp $"); 34 1.1 dyoung 35 1.1 dyoung #include <sys/param.h> 36 1.1 dyoung #include <sys/systm.h> 37 1.1 dyoung #include <sys/device.h> 38 1.1 dyoung 39 1.2 dyoung #include <sys/bus.h> 40 1.1 dyoung 41 1.1 dyoung #include <mips/cache.h> 42 1.1 dyoung #include <mips/cpuregs.h> 43 1.1 dyoung 44 1.1 dyoung #include <mips/adm5120/include/adm5120reg.h> 45 1.1 dyoung #include <mips/adm5120/include/adm5120var.h> 46 1.1 dyoung #include <mips/adm5120/include/adm5120_mainbusvar.h> 47 1.1 dyoung #include <mips/adm5120/include/adm5120_extiovar.h> 48 1.1 dyoung 49 1.1 dyoung #ifdef CFIO_DEBUG 50 1.1 dyoung int cfio_debug = 1; 51 1.1 dyoung #define CFIO_DPRINTF(__fmt, ...) \ 52 1.1 dyoung do { \ 53 1.1 dyoung if (cfio_debug) \ 54 1.1 dyoung printf((__fmt), __VA_ARGS__); \ 55 1.1 dyoung } while (/*CONSTCOND*/0) 56 1.1 dyoung #else /* !CFIO_DEBUG */ 57 1.1 dyoung #define CFIO_DPRINTF(__fmt, ...) do { } while (/*CONSTCOND*/0) 58 1.1 dyoung #endif /* CFIO_DEBUG */ 59 1.1 dyoung 60 1.1 dyoung static struct { 61 1.1 dyoung bus_space_handle_t ch_handle[2]; 62 1.1 dyoung int ch_inuse; 63 1.1 dyoung int ch_parent; 64 1.1 dyoung } cf_handles[16]; 65 1.1 dyoung 66 1.1 dyoung static int cf_handle_alloc(int); 67 1.1 dyoung static void cf_handle_free(int); 68 1.1 dyoung static void cf_bs_unmap(void *, bus_space_handle_t, bus_size_t, int); 69 1.1 dyoung static int cf_bs_map(void *, bus_addr_t, bus_size_t, int, 70 1.1 dyoung bus_space_handle_t *, int); 71 1.1 dyoung static int cf_bs_subregion(void *, bus_space_handle_t, bus_size_t, 72 1.1 dyoung bus_size_t, bus_space_handle_t *); 73 1.1 dyoung static int cf_bs_translate(void *, bus_addr_t, bus_size_t, int, 74 1.1 dyoung struct mips_bus_space_translation *); 75 1.1 dyoung static int cf_bs_get_window(void *, int, struct mips_bus_space_translation *); 76 1.1 dyoung static int cf_bs_translate(void *, bus_addr_t, bus_size_t, int, 77 1.1 dyoung struct mips_bus_space_translation *); 78 1.1 dyoung static int cf_bs_get_window(void *, int, struct mips_bus_space_translation *); 79 1.1 dyoung static int cf_bs_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t, 80 1.1 dyoung bus_size_t, int, bus_addr_t *, bus_space_handle_t *); 81 1.1 dyoung static void cf_bs_free(void *, bus_space_handle_t, bus_size_t size); 82 1.1 dyoung static void *cf_bs_vaddr(void *, bus_space_handle_t); 83 1.1 dyoung static paddr_t cf_bs_mmap(void *, bus_addr_t, off_t off, int prot, int); 84 1.1 dyoung static void cf_bs_barrier(void *, bus_space_handle_t, bus_size_t, 85 1.1 dyoung bus_size_t length, int); 86 1.1 dyoung static uint8_t cf_bs_r_1(void *, bus_space_handle_t, bus_size_t offset); 87 1.1 dyoung static void cf_bs_rm_1(void *, bus_space_handle_t, bus_size_t, 88 1.1 dyoung uint8_t *, bus_size_t); 89 1.1 dyoung static void cf_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t val); 90 1.1 dyoung static void cf_bs_wm_1(void *, bus_space_handle_t, bus_size_t, 91 1.1 dyoung const uint8_t *, bus_size_t); 92 1.1 dyoung static uint8_t cf_bs_rs_1(void *, bus_space_handle_t, bus_size_t offset); 93 1.1 dyoung static void cf_bs_rms_1(void *, bus_space_handle_t, bus_size_t, 94 1.1 dyoung uint8_t *, bus_size_t); 95 1.1 dyoung static void cf_bs_ws_1(void *, bus_space_handle_t, bus_size_t, uint8_t val); 96 1.1 dyoung static void cf_bs_wms_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *, 97 1.1 dyoung bus_size_t); 98 1.1 dyoung static void cf_bs_sm_1(void *, bus_space_handle_t, bus_size_t, uint8_t, 99 1.1 dyoung bus_size_t); 100 1.1 dyoung 101 1.1 dyoung static const struct mips_bus_space cfio_space = { 102 1.1 dyoung /* cookie */ 103 1.1 dyoung .bs_cookie = NULL, 104 1.1 dyoung 105 1.1 dyoung /* mapping/unmapping */ 106 1.1 dyoung .bs_map = cf_bs_map, 107 1.1 dyoung .bs_unmap = cf_bs_unmap, 108 1.1 dyoung .bs_subregion = cf_bs_subregion, 109 1.1 dyoung 110 1.1 dyoung .bs_translate = cf_bs_translate, 111 1.1 dyoung .bs_get_window = cf_bs_get_window, 112 1.1 dyoung .bs_alloc = cf_bs_alloc, 113 1.1 dyoung .bs_free = cf_bs_free, 114 1.1 dyoung .bs_vaddr = cf_bs_vaddr, 115 1.1 dyoung .bs_mmap = cf_bs_mmap, 116 1.1 dyoung .bs_barrier = cf_bs_barrier, 117 1.1 dyoung .bs_r_1 = cf_bs_r_1, 118 1.1 dyoung .bs_r_2 = NULL, 119 1.1 dyoung .bs_r_4 = NULL, 120 1.1 dyoung .bs_r_8 = NULL, 121 1.1 dyoung .bs_rm_1 = cf_bs_rm_1, 122 1.1 dyoung .bs_rm_2 = NULL, 123 1.1 dyoung .bs_rm_4 = NULL, 124 1.1 dyoung .bs_rm_8 = NULL, 125 1.1 dyoung .bs_rr_1 = NULL, 126 1.1 dyoung .bs_rr_2 = NULL, 127 1.1 dyoung .bs_rr_4 = NULL, 128 1.1 dyoung .bs_rr_8 = NULL, 129 1.1 dyoung .bs_w_1 = cf_bs_w_1, 130 1.1 dyoung .bs_w_2 = NULL, 131 1.1 dyoung .bs_w_4 = NULL, 132 1.1 dyoung .bs_w_8 = NULL, 133 1.1 dyoung 134 1.1 dyoung .bs_wm_1 = cf_bs_wm_1, 135 1.1 dyoung .bs_wm_2 = NULL, 136 1.1 dyoung .bs_wm_4 = NULL, 137 1.1 dyoung .bs_wm_8 = NULL, 138 1.1 dyoung 139 1.1 dyoung .bs_wr_1 = NULL, 140 1.1 dyoung .bs_wr_2 = NULL, 141 1.1 dyoung .bs_wr_4 = NULL, 142 1.1 dyoung .bs_wr_8 = NULL, 143 1.1 dyoung 144 1.1 dyoung /* read (single) stream */ 145 1.1 dyoung .bs_rs_1 = cf_bs_rs_1, 146 1.1 dyoung .bs_rs_2 = NULL, 147 1.1 dyoung .bs_rs_4 = NULL, 148 1.1 dyoung .bs_rs_8 = NULL, 149 1.1 dyoung 150 1.1 dyoung /* read multiple stream */ 151 1.1 dyoung .bs_rms_1 = cf_bs_rms_1, 152 1.1 dyoung .bs_rms_2 = NULL, 153 1.1 dyoung .bs_rms_4 = NULL, 154 1.1 dyoung .bs_rms_8 = NULL, 155 1.1 dyoung 156 1.1 dyoung /* read region stream */ 157 1.1 dyoung .bs_rrs_1 = NULL, 158 1.1 dyoung .bs_rrs_2 = NULL, 159 1.1 dyoung .bs_rrs_4 = NULL, 160 1.1 dyoung .bs_rrs_8 = NULL, 161 1.1 dyoung 162 1.1 dyoung /* write (single) stream */ 163 1.1 dyoung .bs_ws_1 = cf_bs_ws_1, 164 1.1 dyoung .bs_ws_2 = NULL, 165 1.1 dyoung .bs_ws_4 = NULL, 166 1.1 dyoung .bs_ws_8 = NULL, 167 1.1 dyoung 168 1.1 dyoung /* write multiple stream */ 169 1.1 dyoung .bs_wms_1 = cf_bs_wms_1, 170 1.1 dyoung .bs_wms_2 = NULL, 171 1.1 dyoung .bs_wms_4 = NULL, 172 1.1 dyoung .bs_wms_8 = NULL, 173 1.1 dyoung 174 1.1 dyoung /* write region stream */ 175 1.1 dyoung .bs_wrs_1 = NULL, 176 1.1 dyoung .bs_wrs_2 = NULL, 177 1.1 dyoung .bs_wrs_4 = NULL, 178 1.1 dyoung .bs_wrs_8 = NULL, 179 1.1 dyoung 180 1.1 dyoung /* set multiple */ 181 1.1 dyoung .bs_sm_1 = cf_bs_sm_1, 182 1.1 dyoung .bs_sm_2 = NULL, 183 1.1 dyoung .bs_sm_4 = NULL, 184 1.1 dyoung .bs_sm_8 = NULL, 185 1.1 dyoung 186 1.1 dyoung /* set region */ 187 1.1 dyoung .bs_sr_1 = NULL, 188 1.1 dyoung .bs_sr_2 = NULL, 189 1.1 dyoung .bs_sr_4 = NULL, 190 1.1 dyoung .bs_sr_8 = NULL, 191 1.1 dyoung 192 1.1 dyoung /* copy */ 193 1.1 dyoung .bs_c_1 = NULL, 194 1.1 dyoung .bs_c_2 = NULL, 195 1.1 dyoung .bs_c_4 = NULL, 196 1.1 dyoung .bs_c_8 = NULL, 197 1.1 dyoung }; 198 1.1 dyoung 199 1.1 dyoung void 200 1.1 dyoung cfio_bus_mem_init(bus_space_tag_t cfio, bus_space_tag_t extio) 201 1.1 dyoung { 202 1.1 dyoung *cfio = cfio_space; 203 1.1 dyoung cfio->bs_cookie = (void *)extio; 204 1.1 dyoung } 205 1.1 dyoung 206 1.1 dyoung static void 207 1.1 dyoung cf_bs_unmap(void *cookie, bus_space_handle_t bh, bus_size_t size, int acct) 208 1.1 dyoung { 209 1.1 dyoung KASSERT(acct == 1); 210 1.1 dyoung bus_space_unmap((bus_space_tag_t)cookie, 211 1.1 dyoung cf_handles[bh].ch_handle[1], size); 212 1.1 dyoung bus_space_unmap((bus_space_tag_t)cookie, 213 1.1 dyoung cf_handles[bh].ch_handle[0], size); 214 1.1 dyoung cf_handle_free(bh); 215 1.1 dyoung } 216 1.1 dyoung 217 1.1 dyoung static void 218 1.1 dyoung cf_handle_free(int which) 219 1.1 dyoung { 220 1.1 dyoung int i, parent; 221 1.1 dyoung 222 1.1 dyoung KASSERT(cf_handles[which].ch_inuse); 223 1.1 dyoung for (i = 0; i < __arraycount(cf_handles); i++) { 224 1.1 dyoung for (parent = cf_handles[i].ch_parent; parent != -1; 225 1.1 dyoung parent = cf_handles[parent].ch_parent) { 226 1.1 dyoung if (parent == which) { 227 1.1 dyoung CFIO_DPRINTF("%s: free %d (ancestor %d)\n", 228 1.1 dyoung __func__, i, which); 229 1.1 dyoung cf_handles[i].ch_inuse = 0; 230 1.1 dyoung break; 231 1.1 dyoung } 232 1.1 dyoung } 233 1.1 dyoung } 234 1.1 dyoung cf_handles[which].ch_inuse = 0; 235 1.1 dyoung for (i = 0; i < __arraycount(cf_handles); i++) { 236 1.1 dyoung if (!cf_handles[i].ch_inuse) 237 1.1 dyoung cf_handles[i].ch_parent = -1; 238 1.1 dyoung } 239 1.1 dyoung } 240 1.1 dyoung 241 1.1 dyoung static int 242 1.1 dyoung cf_handle_alloc(int parent) 243 1.1 dyoung { 244 1.1 dyoung int i; 245 1.1 dyoung 246 1.1 dyoung for (i = 0; i < __arraycount(cf_handles) && cf_handles[i].ch_inuse; i++) 247 1.1 dyoung ; 248 1.1 dyoung if (i >= __arraycount(cf_handles)) 249 1.1 dyoung return -1; 250 1.1 dyoung cf_handles[i].ch_inuse = 1; 251 1.1 dyoung cf_handles[i].ch_parent = parent; 252 1.1 dyoung return i; 253 1.1 dyoung } 254 1.1 dyoung 255 1.1 dyoung static int 256 1.1 dyoung cf_bs_map(void *cookie, bus_addr_t addr, bus_size_t size, int flags, 257 1.1 dyoung bus_space_handle_t *bhp, int acct) 258 1.1 dyoung { 259 1.1 dyoung int bh, rc; 260 1.1 dyoung 261 1.1 dyoung KASSERT(acct == 1); 262 1.1 dyoung 263 1.1 dyoung if ((bh = cf_handle_alloc(-1)) == -1) 264 1.1 dyoung return EBUSY; 265 1.1 dyoung 266 1.1 dyoung rc = bus_space_map((bus_space_tag_t)cookie, 267 1.1 dyoung addr + ADM5120_BASE_EXTIO1 - ADM5120_BASE_EXTIO0, size, flags, 268 1.1 dyoung &cf_handles[bh].ch_handle[1]); 269 1.1 dyoung if (rc != 0) 270 1.1 dyoung return rc; 271 1.1 dyoung 272 1.1 dyoung rc = bus_space_map((bus_space_tag_t)cookie, addr, size, flags, 273 1.1 dyoung &cf_handles[bh].ch_handle[0]); 274 1.1 dyoung if (rc != 0) { 275 1.1 dyoung bus_space_unmap((bus_space_tag_t)cookie, 276 1.1 dyoung cf_handles[bh].ch_handle[1], size); 277 1.1 dyoung cf_handle_free(bh); 278 1.1 dyoung } else 279 1.1 dyoung *bhp = bh; 280 1.1 dyoung 281 1.1 dyoung return rc; 282 1.1 dyoung } 283 1.1 dyoung 284 1.1 dyoung static int 285 1.1 dyoung cf_bs_subregion(void *cookie, bus_space_handle_t h, bus_size_t offset, 286 1.1 dyoung bus_size_t size, bus_space_handle_t *bhp) 287 1.1 dyoung { 288 1.1 dyoung int bh, rc; 289 1.1 dyoung 290 1.1 dyoung if ((bh = cf_handle_alloc(h)) == -1) 291 1.1 dyoung return EBUSY; 292 1.1 dyoung 293 1.1 dyoung rc = bus_space_subregion((bus_space_tag_t)cookie, 294 1.1 dyoung cf_handles[h].ch_handle[1], offset, size, 295 1.1 dyoung &cf_handles[bh].ch_handle[1]); 296 1.1 dyoung if (rc != 0) 297 1.1 dyoung return rc; 298 1.1 dyoung 299 1.1 dyoung rc = bus_space_subregion((bus_space_tag_t)cookie, 300 1.1 dyoung cf_handles[h].ch_handle[0], offset, size, 301 1.1 dyoung &cf_handles[bh].ch_handle[0]); 302 1.1 dyoung if (rc != 0) 303 1.1 dyoung cf_handle_free(bh); 304 1.1 dyoung else 305 1.1 dyoung *bhp = bh; 306 1.1 dyoung 307 1.1 dyoung return rc; 308 1.1 dyoung } 309 1.1 dyoung 310 1.1 dyoung static int 311 1.1 dyoung cf_bs_translate(void *cookie, bus_addr_t addr, bus_size_t len, int flags, 312 1.1 dyoung struct mips_bus_space_translation *mbst) 313 1.1 dyoung { 314 1.1 dyoung panic("%s: not implemented\n", __func__); 315 1.1 dyoung } 316 1.1 dyoung 317 1.1 dyoung static int 318 1.1 dyoung cf_bs_get_window(void *cookie, int window, 319 1.1 dyoung struct mips_bus_space_translation *mbst) 320 1.1 dyoung { 321 1.1 dyoung panic("%s: not implemented\n", __func__); 322 1.1 dyoung } 323 1.1 dyoung 324 1.1 dyoung static int 325 1.1 dyoung cf_bs_alloc(void *cookie, bus_addr_t reg_start, 326 1.1 dyoung bus_addr_t reg_end, bus_size_t size, bus_size_t alignment, 327 1.1 dyoung bus_size_t boundary, int flags, bus_addr_t *addrp, 328 1.1 dyoung bus_space_handle_t *bhp) 329 1.1 dyoung { 330 1.1 dyoung bus_addr_t tmp; 331 1.1 dyoung int bh, rc; 332 1.1 dyoung 333 1.1 dyoung if ((bh = cf_handle_alloc(-1)) == -1) 334 1.1 dyoung return EBUSY; 335 1.1 dyoung 336 1.1 dyoung rc = bus_space_alloc((bus_space_tag_t)cookie, 337 1.1 dyoung reg_start + ADM5120_BASE_EXTIO1 - ADM5120_BASE_EXTIO0, 338 1.1 dyoung reg_end + ADM5120_BASE_EXTIO1 - ADM5120_BASE_EXTIO0, 339 1.1 dyoung size, alignment, boundary, flags, &tmp, 340 1.1 dyoung &cf_handles[bh].ch_handle[1]); 341 1.1 dyoung if (rc != 0) 342 1.1 dyoung return rc; 343 1.1 dyoung 344 1.1 dyoung rc = bus_space_alloc((bus_space_tag_t)cookie, reg_start, reg_end, size, 345 1.1 dyoung alignment, boundary, flags, addrp, &cf_handles[bh].ch_handle[0]); 346 1.1 dyoung if (rc != 0) { 347 1.1 dyoung bus_space_free((bus_space_tag_t)cookie, 348 1.1 dyoung cf_handles[bh].ch_handle[1], size); 349 1.1 dyoung cf_handle_free(bh); 350 1.1 dyoung } else 351 1.1 dyoung *bhp = bh; 352 1.1 dyoung 353 1.1 dyoung return rc; 354 1.1 dyoung } 355 1.1 dyoung 356 1.1 dyoung static void 357 1.1 dyoung cf_bs_free(void *cookie, bus_space_handle_t bh, bus_size_t size) 358 1.1 dyoung { 359 1.1 dyoung bus_space_free((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[0], 360 1.1 dyoung size); 361 1.1 dyoung bus_space_free((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[1], 362 1.1 dyoung size); 363 1.1 dyoung cf_handle_free(bh); 364 1.1 dyoung } 365 1.1 dyoung 366 1.1 dyoung static void * 367 1.1 dyoung cf_bs_vaddr(void *cookie, bus_space_handle_t bh) 368 1.1 dyoung { 369 1.1 dyoung panic("%s: not implemented", __func__); 370 1.1 dyoung } 371 1.1 dyoung 372 1.1 dyoung static paddr_t 373 1.1 dyoung cf_bs_mmap(void *cookie, bus_addr_t addr, off_t off, int prot, int flags) 374 1.1 dyoung { 375 1.1 dyoung panic("%s: not implemented", __func__); 376 1.1 dyoung } 377 1.1 dyoung 378 1.1 dyoung static void 379 1.1 dyoung cf_bs_barrier(void *cookie, bus_space_handle_t bh, bus_size_t offset, 380 1.1 dyoung bus_size_t length, int flags) 381 1.1 dyoung { 382 1.1 dyoung bus_space_barrier((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[0], 383 1.1 dyoung offset, length, flags); 384 1.1 dyoung bus_space_barrier((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[1], 385 1.1 dyoung offset, length, flags); 386 1.1 dyoung } 387 1.1 dyoung 388 1.1 dyoung /* read (single) */ 389 1.1 dyoung static uint8_t 390 1.1 dyoung cf_bs_r_1(void *cookie, bus_space_handle_t bh, bus_size_t offset) 391 1.1 dyoung { 392 1.1 dyoung (void)bus_space_read_1((bus_space_tag_t)cookie, 393 1.1 dyoung cf_handles[bh].ch_handle[0], offset); 394 1.1 dyoung return bus_space_read_1((bus_space_tag_t)cookie, 395 1.1 dyoung cf_handles[bh].ch_handle[1], offset); 396 1.1 dyoung } 397 1.1 dyoung 398 1.1 dyoung /* read multiple */ 399 1.1 dyoung static void 400 1.1 dyoung cf_bs_rm_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, 401 1.1 dyoung uint8_t *datap, bus_size_t count) 402 1.1 dyoung { 403 1.1 dyoung while (count-- > 0) 404 1.1 dyoung *datap++ = cf_bs_r_1(cookie, bh, offset); 405 1.1 dyoung } 406 1.1 dyoung 407 1.1 dyoung /* write (single) */ 408 1.1 dyoung static void 409 1.1 dyoung cf_bs_w_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, uint8_t val) 410 1.1 dyoung { 411 1.1 dyoung bus_space_write_1((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[0], 412 1.1 dyoung offset, val); 413 1.1 dyoung bus_space_write_1((bus_space_tag_t)cookie, cf_handles[bh].ch_handle[1], 414 1.1 dyoung offset, val); 415 1.1 dyoung } 416 1.1 dyoung 417 1.1 dyoung /* write multiple */ 418 1.1 dyoung static void 419 1.1 dyoung cf_bs_wm_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, 420 1.1 dyoung const uint8_t *datap, bus_size_t count) 421 1.1 dyoung { 422 1.1 dyoung while (count-- > 0) 423 1.1 dyoung cf_bs_w_1(cookie, bh, offset, *datap++); 424 1.1 dyoung } 425 1.1 dyoung 426 1.1 dyoung /* read (single) stream */ 427 1.1 dyoung static uint8_t 428 1.1 dyoung cf_bs_rs_1(void *cookie, bus_space_handle_t bh, bus_size_t offset) 429 1.1 dyoung { 430 1.1 dyoung (void)bus_space_read_stream_1((bus_space_tag_t)cookie, 431 1.1 dyoung cf_handles[bh].ch_handle[0], offset); 432 1.1 dyoung return bus_space_read_stream_1((bus_space_tag_t)cookie, 433 1.1 dyoung cf_handles[bh].ch_handle[1], offset); 434 1.1 dyoung } 435 1.1 dyoung 436 1.1 dyoung /* read multiple stream */ 437 1.1 dyoung static void 438 1.1 dyoung cf_bs_rms_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, 439 1.1 dyoung uint8_t *datap, bus_size_t count) 440 1.1 dyoung { 441 1.1 dyoung while (count-- > 0) 442 1.1 dyoung *datap++ = cf_bs_rs_1(cookie, bh, offset); 443 1.1 dyoung } 444 1.1 dyoung 445 1.1 dyoung /* write (single) stream */ 446 1.1 dyoung static void 447 1.1 dyoung cf_bs_ws_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, uint8_t val) 448 1.1 dyoung { 449 1.1 dyoung bus_space_write_stream_1((bus_space_tag_t)cookie, 450 1.1 dyoung cf_handles[bh].ch_handle[0], offset, val); 451 1.1 dyoung bus_space_write_stream_1((bus_space_tag_t)cookie, 452 1.1 dyoung cf_handles[bh].ch_handle[1], offset, val); 453 1.1 dyoung } 454 1.1 dyoung 455 1.1 dyoung /* write multiple stream */ 456 1.1 dyoung static void 457 1.1 dyoung cf_bs_wms_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, 458 1.1 dyoung const uint8_t *datap, bus_size_t count) 459 1.1 dyoung { 460 1.1 dyoung while (count-- > 0) 461 1.1 dyoung cf_bs_ws_1(cookie, bh, offset, *datap++); 462 1.1 dyoung } 463 1.1 dyoung 464 1.1 dyoung /* set multiple */ 465 1.1 dyoung static void 466 1.1 dyoung cf_bs_sm_1(void *cookie, bus_space_handle_t bh, bus_size_t offset, 467 1.1 dyoung uint8_t value, bus_size_t count) 468 1.1 dyoung { 469 1.1 dyoung while (count-- > 0) 470 1.1 dyoung cf_bs_w_1(cookie, bh, offset, value); 471 1.1 dyoung } 472