Home | History | Annotate | Line # | Download | only in s3c2xx0
      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