1 1.4 jmcneill /* $NetBSD: pxa2x0_dmac.h,v 1.4 2011/11/23 23:07:29 jmcneill Exp $ */ 2 1.1 scw 3 1.1 scw /* 4 1.1 scw * Copyright (c) 2003, 2005 Wasabi Systems, Inc. 5 1.1 scw * All rights reserved. 6 1.1 scw * 7 1.1 scw * Written by Steve C. Woodford for Wasabi Systems, Inc. 8 1.1 scw * 9 1.1 scw * Redistribution and use in source and binary forms, with or without 10 1.1 scw * modification, are permitted provided that the following conditions 11 1.1 scw * are met: 12 1.1 scw * 1. Redistributions of source code must retain the above copyright 13 1.1 scw * notice, this list of conditions and the following disclaimer. 14 1.1 scw * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 scw * notice, this list of conditions and the following disclaimer in the 16 1.1 scw * documentation and/or other materials provided with the distribution. 17 1.1 scw * 3. All advertising materials mentioning features or use of this software 18 1.1 scw * must display the following acknowledgement: 19 1.1 scw * This product includes software developed for the NetBSD Project by 20 1.1 scw * Wasabi Systems, Inc. 21 1.1 scw * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 1.1 scw * or promote products derived from this software without specific prior 23 1.1 scw * written permission. 24 1.1 scw * 25 1.1 scw * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 1.1 scw * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 1.1 scw * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 1.1 scw * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 1.1 scw * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 1.1 scw * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 1.1 scw * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 1.1 scw * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 1.1 scw * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 1.1 scw * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 1.1 scw * POSSIBILITY OF SUCH DAMAGE. 36 1.1 scw */ 37 1.1 scw 38 1.1 scw #ifndef __PXA2X0_DMAC_H 39 1.1 scw #define __PXA2X0_DMAC_H 40 1.1 scw 41 1.1 scw typedef u_int dmac_peripheral_t; 42 1.1 scw #define DMAC_PERIPH_NONE (~0) 43 1.1 scw #define DMAC_PERIPH_DREQ0 0 44 1.1 scw #define DMAC_PERIPH_DREQ1 1 45 1.1 scw #define DMAC_PERIPH_I2SRX 2 46 1.1 scw #define DMAC_PERIPH_I2STX 3 47 1.1 scw #define DMAC_PERIPH_BTUARTRX 4 48 1.1 scw #define DMAC_PERIPH_BTUARTTX 5 49 1.1 scw #define DMAC_PERIPH_FFUARTRX 6 50 1.1 scw #define DMAC_PERIPH_FFUARTTX 7 51 1.1 scw #define DMAC_PERIPH_AC97MIC 8 52 1.1 scw #define DMAC_PERIPH_AC97MODEMRX 9 53 1.1 scw #define DMAC_PERIPH_AC97MODEMTX 10 54 1.1 scw #define DMAC_PERIPH_AC97AUDIORX 11 55 1.1 scw #define DMAC_PERIPH_AC97AUDIOTX 12 56 1.1 scw #define DMAC_PERIPH_SSPRX 13 57 1.1 scw #define DMAC_PERIPH_SSPTX 14 58 1.1 scw #define DMAC_PERIPH_FICPRX 17 59 1.1 scw #define DMAC_PERIPH_FICPTX 18 60 1.1 scw #define DMAC_PERIPH_STUARTRX 19 61 1.1 scw #define DMAC_PERIPH_STUARTTX 20 62 1.1 scw #define DMAC_PERIPH_MMCRX 21 63 1.1 scw #define DMAC_PERIPH_MMCTX 22 64 1.1 scw #define DMAC_PERIPH_USBEP(n) (24+(n)) /* for endpoint 1..4,6..9,11..14 */ 65 1.1 scw #define DMAC_N_PERIPH 40 66 1.1 scw 67 1.1 scw typedef enum { 68 1.1 scw #define DMAC_PRIORITY_NORMAL DMAC_PRIORITY_LOW 69 1.1 scw DMAC_PRIORITY_LOW = 0, 70 1.1 scw DMAC_PRIORITY_MED, 71 1.1 scw DMAC_PRIORITY_HIGH 72 1.1 scw } dmac_priority_t; 73 1.1 scw 74 1.1 scw typedef enum { 75 1.1 scw DMAC_FLOW_CTRL_NONE, 76 1.1 scw DMAC_FLOW_CTRL_SRC, 77 1.1 scw DMAC_FLOW_CTRL_DEST 78 1.1 scw } dmac_flow_ctrl_t; 79 1.1 scw 80 1.1 scw typedef enum { 81 1.1 scw DMAC_DEV_WIDTH_DEFAULT = 0, 82 1.1 scw DMAC_DEV_WIDTH_1, 83 1.1 scw DMAC_DEV_WIDTH_2, 84 1.1 scw DMAC_DEV_WIDTH_4 85 1.1 scw } dmac_dev_width_t; 86 1.1 scw 87 1.1 scw typedef enum { 88 1.1 scw DMAC_BURST_SIZE_8 = 1, 89 1.1 scw DMAC_BURST_SIZE_16, 90 1.1 scw DMAC_BURST_SIZE_32 91 1.1 scw } dmac_burst_size_t; 92 1.1 scw 93 1.1 scw struct dmac_xfer_desc { 94 1.1 scw /* 95 1.1 scw * Hold the source/destination address. 96 1.1 scw * Note that if this is TRUE, then xd_nsegs must be at least '1', 97 1.1 scw * and the first dma segment in xd_dma_segs must have a non-zero 98 1.1 scw * ds_len field. 99 1.1 scw */ 100 1.3 thorpej bool xd_addr_hold; 101 1.1 scw 102 1.1 scw u_int xd_nsegs; 103 1.1 scw bus_dma_segment_t *xd_dma_segs; 104 1.1 scw }; 105 1.1 scw 106 1.1 scw struct dmac_xfer { 107 1.1 scw /* 108 1.1 scw * The following fields must be initialised by clients of the 109 1.1 scw * DMAC driver. 110 1.1 scw * The DMAC driver treats all these fields as Read-Only. 111 1.1 scw */ 112 1.1 scw 113 1.1 scw /* Client-specific cookie for this request */ 114 1.1 scw void *dx_cookie; 115 1.1 scw 116 1.1 scw /* Client function to invoke when the transfer completes */ 117 1.1 scw void (*dx_done)(struct dmac_xfer *, int); 118 1.1 scw 119 1.1 scw /* Priority to assign to the transfer */ 120 1.1 scw dmac_priority_t dx_priority; 121 1.1 scw 122 1.1 scw /* Peripheral device involved in the transfer */ 123 1.1 scw dmac_peripheral_t dx_peripheral; 124 1.1 scw 125 1.1 scw /* Flow Control */ 126 1.1 scw dmac_flow_ctrl_t dx_flow; 127 1.1 scw 128 1.1 scw /* Device width */ 129 1.1 scw dmac_dev_width_t dx_dev_width; 130 1.1 scw 131 1.1 scw /* Burst size */ 132 1.1 scw dmac_burst_size_t dx_burst_size; 133 1.1 scw 134 1.1 scw /* Loop notification period */ 135 1.1 scw size_t dx_loop_notify; 136 1.1 scw /* 137 1.1 scw * Initialise dx_loop_notify to the following value if you do not 138 1.1 scw * need to use the looping facility of the DMA engine. (Looping is 139 1.1 scw * primarily for use by the AC97 driver, but may be of interest to 140 1.1 scw * other drivers...) 141 1.1 scw */ 142 1.1 scw #define DMAC_DONT_LOOP 0 143 1.1 scw 144 1.1 scw /* Source/Destination descriptors */ 145 1.1 scw struct dmac_xfer_desc dx_desc[2]; 146 1.1 scw #define DMAC_DESC_SRC 0 147 1.1 scw #define DMAC_DESC_DST 1 148 1.1 scw }; 149 1.1 scw 150 1.4 jmcneill extern struct dmac_xfer *pxa2x0_dmac_allocate_xfer(void); 151 1.1 scw extern void pxa2x0_dmac_free_xfer(struct dmac_xfer *); 152 1.1 scw extern int pxa2x0_dmac_start_xfer(struct dmac_xfer *); 153 1.1 scw extern void pxa2x0_dmac_abort_xfer(struct dmac_xfer *); 154 1.1 scw 155 1.1 scw #endif /* __PXA2X0_DMAC_H */ 156