1 1.1 nisimura /*- 2 1.1 nisimura * Copyright (c) 2012 The NetBSD Foundation, Inc. 3 1.1 nisimura * All rights reserved. 4 1.1 nisimura * 5 1.1 nisimura * This code is derived from software contributed to The NetBSD Foundation 6 1.1 nisimura * by Paul Fleischer <paul (at) xpg.dk> 7 1.1 nisimura * 8 1.1 nisimura * Redistribution and use in source and binary forms, with or without 9 1.1 nisimura * modification, are permitted provided that the following conditions 10 1.1 nisimura * are met: 11 1.1 nisimura * 1. Redistributions of source code must retain the above copyright 12 1.1 nisimura * notice, this list of conditions and the following disclaimer. 13 1.1 nisimura * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 nisimura * notice, this list of conditions and the following disclaimer in the 15 1.1 nisimura * documentation and/or other materials provided with the distribution. 16 1.1 nisimura * 17 1.1 nisimura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 1.1 nisimura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 1.1 nisimura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 1.1 nisimura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 1.1 nisimura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 1.1 nisimura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 1.1 nisimura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 1.1 nisimura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 1.1 nisimura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 1.1 nisimura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 1.1 nisimura * POSSIBILITY OF SUCH DAMAGE. 28 1.1 nisimura */ 29 1.1 nisimura /* This file implements a simple interface towards the S3C2440 DMA controller. 30 1.1 nisimura At this point queueing of transfers is not supported. In other words, one 31 1.1 nisimura has to be very careful that noone else is using a DMA channel when trying to use it. 32 1.1 nisimura 33 1.1 nisimura Only device<->memory transfers are supported at this time. 34 1.1 nisimura 35 1.1 nisimura Currently, the only usage of S3C2440 DMA is in the S3C2440 SD-Interface driver 36 1.1 nisimura (s3c2440_sdi.c). 37 1.1 nisimura */ 38 1.1 nisimura 39 1.1 nisimura #ifndef __S3C2440_DMA_H__ 40 1.1 nisimura #define __S3C2440_DMA_H__ 41 1.1 nisimura 42 1.1 nisimura #include <sys/types.h> 43 1.1 nisimura 44 1.1 nisimura void s3c2440_dma_init(void); 45 1.1 nisimura int s3c2440_dma_intr(void *arg); 46 1.1 nisimura 47 1.1 nisimura typedef enum { 48 1.1 nisimura DMAC_BUS_TYPE_SYSTEM = 0, 49 1.1 nisimura DMAC_BUS_TYPE_PERIPHERAL 50 1.1 nisimura } dmac_bus_type_t; 51 1.1 nisimura 52 1.1 nisimura typedef enum { 53 1.1 nisimura DMAC_SYNC_BUS_AUTO = 0, 54 1.1 nisimura DMAC_SYNC_BUS_SYSTEM, 55 1.1 nisimura DMAC_SYNC_BUS_PERIPHERAL 56 1.1 nisimura } dmac_sync_bus_t; 57 1.1 nisimura 58 1.1 nisimura typedef enum { 59 1.1 nisimura DMAC_XFER_WIDTH_8BIT = 0, 60 1.1 nisimura DMAC_XFER_WIDTH_16BIT = 1, 61 1.1 nisimura DMAC_XFER_WIDTH_32BIT = 2 62 1.1 nisimura } dmac_xfer_width_t; 63 1.1 nisimura 64 1.1 nisimura typedef enum { 65 1.1 nisimura DMAC_XFER_MODE_DEMAND = 0, 66 1.1 nisimura DMAC_XFER_MODE_HANDSHAKE = 1 67 1.1 nisimura } dmac_xfer_mode_t; 68 1.1 nisimura 69 1.1 nisimura typedef struct dmac_xfer_desc* dmac_xfer_desc_t; 70 1.1 nisimura struct dmac_xfer_desc { 71 1.1 nisimura dmac_bus_type_t xd_bus_type; 72 1.1 nisimura bool xd_increment; 73 1.1 nisimura u_int xd_nsegs; 74 1.1 nisimura bus_dma_segment_t *xd_dma_segs; 75 1.1 nisimura }; 76 1.1 nisimura 77 1.1 nisimura typedef u_int dmac_peripheral_t; 78 1.1 nisimura #define DMAC_PERIPH_NONE 0 /* Software triggered transfer */ 79 1.1 nisimura #define DMAC_PERIPH_XDREQ0 1 80 1.1 nisimura #define DMAC_PERIPH_XDREQ1 2 81 1.1 nisimura #define DMAC_PERIPH_UART0 3 82 1.1 nisimura #define DMAC_PERIPH_UART1 4 83 1.1 nisimura #define DMAC_PERIPH_UART2 5 84 1.1 nisimura #define DMAC_PERIPH_I2SSDO 6 85 1.1 nisimura #define DMAC_PERIPH_I2SSDI 7 86 1.1 nisimura #define DMAC_PERIPH_SDI 8 87 1.1 nisimura #define DMAC_PERIPH_SPI0 9 88 1.1 nisimura #define DMAC_PERIPH_SPI1 10 89 1.1 nisimura #define DMAC_PERIPH_PCMIN 11 90 1.1 nisimura #define DMAC_PERIPH_PCMOUT 12 91 1.1 nisimura #define DMAC_PERIPH_MICIN 13 92 1.1 nisimura #define DMAC_PERIPH_MICOUT 14 93 1.1 nisimura #define DMAC_PERIPH_TIMER 15 94 1.1 nisimura #define DMAC_PERIPH_USBEP1 16 95 1.1 nisimura #define DMAC_PERIPH_USBEP2 17 96 1.1 nisimura #define DMAC_PERIPH_USBEP3 18 97 1.1 nisimura #define DMAC_PERIPH_USBEP4 19 98 1.1 nisimura #define DMAC_N_PERIPH 20 99 1.1 nisimura 100 1.1 nisimura typedef struct dmac_xfer* dmac_xfer_t; 101 1.1 nisimura struct dmac_xfer { 102 1.1 nisimura void (*dx_done)(dmac_xfer_t, void*); 103 1.1 nisimura void *dx_cookie; 104 1.1 nisimura dmac_peripheral_t dx_peripheral; /* Controls trigger mechanism 105 1.1 nisimura and DMA channel to use */ 106 1.1 nisimura struct dmac_xfer_desc dx_desc[2]; 107 1.1 nisimura #define DMAC_DESC_SRC 0 108 1.1 nisimura #define DMAC_DESC_DST 1 109 1.1 nisimura 110 1.1 nisimura dmac_sync_bus_t dx_sync_bus; 111 1.1 nisimura 112 1.1 nisimura dmac_xfer_width_t dx_xfer_width; 113 1.1 nisimura 114 1.1 nisimura dmac_xfer_mode_t dx_xfer_mode; 115 1.1 nisimura }; 116 1.1 nisimura 117 1.1 nisimura /* DMA API, inspired by pxa2x0_dmac.h */ 118 1.2 chs dmac_xfer_t s3c2440_dmac_allocate_xfer(void); 119 1.1 nisimura void s3c2440_dmac_free_xfer(dmac_xfer_t); 120 1.1 nisimura int s3c2440_dmac_start_xfer(dmac_xfer_t); 121 1.1 nisimura void s3c2440_dmac_abort_xfer(dmac_xfer_t); 122 1.1 nisimura int s3c2440_dmac_wait_xfer(dmac_xfer_t, int); 123 1.1 nisimura 124 1.1 nisimura #endif 125