dma.h 5.4 KB
Newer Older
1
/* arch/arm/mach-s3c2410/include/mach/dma.h
L
Linus Torvalds 已提交
2
 *
3
 * Copyright (C) 2003-2006 Simtec Electronics
L
Linus Torvalds 已提交
4 5
 *	Ben Dooks <ben@simtec.co.uk>
 *
6
 * Samsung S3C24XX DMA support
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
*/

#ifndef __ASM_ARCH_DMA_H
#define __ASM_ARCH_DMA_H __FILE__

16
#include <linux/device.h>
L
Linus Torvalds 已提交
17 18 19

#define MAX_DMA_TRANSFER_SIZE   0x100000 /* Data Unit is half word  */

20
/* We use `virtual` dma channels to hide the fact we have only a limited
L
Lucas De Marchi 已提交
21
 * number of DMA channels, and not of all of them (dependent on the device)
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
 * can be attached to any DMA source. We therefore let the DMA core handle
 * the allocation of hardware channels to clients.
*/

enum dma_ch {
	DMACH_XD0,
	DMACH_XD1,
	DMACH_SDI,
	DMACH_SPI0,
	DMACH_SPI1,
	DMACH_UART0,
	DMACH_UART1,
	DMACH_UART2,
	DMACH_TIMER,
	DMACH_I2S_IN,
	DMACH_I2S_OUT,
	DMACH_PCM_IN,
	DMACH_PCM_OUT,
	DMACH_MIC_IN,
	DMACH_USB_EP1,
	DMACH_USB_EP2,
	DMACH_USB_EP3,
	DMACH_USB_EP4,
45 46 47
	DMACH_UART0_SRC2,	/* s3c2412 second uart sources */
	DMACH_UART1_SRC2,
	DMACH_UART2_SRC2,
48 49
	DMACH_UART3,		/* s3c2443 has extra uart */
	DMACH_UART3_SRC2,
50 51 52 53
	DMACH_SPI0_TX,		/* s3c2443/2416/2450 hsspi0 */
	DMACH_SPI0_RX,		/* s3c2443/2416/2450 hsspi0 */
	DMACH_SPI1_TX,		/* s3c2443/2450 hsspi1 */
	DMACH_SPI1_RX,		/* s3c2443/2450 hsspi1 */
54 55 56
	DMACH_MAX,		/* the end entry */
};

B
Boojin Kim 已提交
57 58 59 60 61
static inline bool samsung_dma_has_circular(void)
{
	return false;
}

62 63 64 65 66 67 68
static inline bool samsung_dma_is_dmadev(void)
{
	return false;
}

#include <plat/dma.h>

69 70
#define DMACH_LOW_LEVEL	(1<<28)	/* use this to specifiy hardware ch no */

L
Linus Torvalds 已提交
71
/* we have 4 dma channels */
72
#if !defined(CONFIG_CPU_S3C2443) && !defined(CONFIG_CPU_S3C2416)
73
#define S3C_DMA_CHANNELS		(4)
74
#else
75
#define S3C_DMA_CHANNELS		(6)
76
#endif
L
Linus Torvalds 已提交
77 78 79

/* types */

80
enum s3c2410_dma_state {
L
Linus Torvalds 已提交
81 82 83
	S3C2410_DMA_IDLE,
	S3C2410_DMA_RUNNING,
	S3C2410_DMA_PAUSED
84
};
L
Linus Torvalds 已提交
85

86
/* enum s3c2410_dma_loadst
L
Linus Torvalds 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
 *
 * This represents the state of the DMA engine, wrt to the loaded / running
 * transfers. Since we don't have any way of knowing exactly the state of
 * the DMA transfers, we need to know the state to make decisions on wether
 * we can
 *
 * S3C2410_DMA_NONE
 *
 * There are no buffers loaded (the channel should be inactive)
 *
 * S3C2410_DMA_1LOADED
 *
 * There is one buffer loaded, however it has not been confirmed to be
 * loaded by the DMA engine. This may be because the channel is not
 * yet running, or the DMA driver decided that it was too costly to
 * sit and wait for it to happen.
 *
 * S3C2410_DMA_1RUNNING
 *
 * The buffer has been confirmed running, and not finisged
 *
 * S3C2410_DMA_1LOADED_1RUNNING
 *
 * There is a buffer waiting to be loaded by the DMA engine, and one
 * currently running.
*/

114
enum s3c2410_dma_loadst {
L
Linus Torvalds 已提交
115 116 117 118
	S3C2410_DMALOAD_NONE,
	S3C2410_DMALOAD_1LOADED,
	S3C2410_DMALOAD_1RUNNING,
	S3C2410_DMALOAD_1LOADED_1RUNNING,
119
};
L
Linus Torvalds 已提交
120 121 122 123 124 125 126 127


/* flags */

#define S3C2410_DMAF_SLOW         (1<<0)   /* slow, so don't worry about
					    * waiting for reloads */
#define S3C2410_DMAF_AUTOSTART    (1<<1)   /* auto-start if buffer queued */

128 129
#define S3C2410_DMAF_CIRCULAR	(1 << 2)	/* no circular dma support */

L
Linus Torvalds 已提交
130 131
/* dma buffer */

132
struct s3c2410_dma_buf;
L
Linus Torvalds 已提交
133

134
/* s3c2410_dma_buf
L
Linus Torvalds 已提交
135 136 137 138 139
 *
 * internally used buffer structure to describe a queued or running
 * buffer.
*/

140
struct s3c2410_dma_buf {
141 142 143 144 145 146
	struct s3c2410_dma_buf	*next;
	int			 magic;		/* magic */
	int			 size;		/* buffer size in bytes */
	dma_addr_t		 data;		/* start of DMA data */
	dma_addr_t		 ptr;		/* where the DMA got to [1] */
	void			*id;		/* client's id */
L
Linus Torvalds 已提交
147 148 149 150
};

/* [1] is this updated for both recv/send modes? */

151
struct s3c2410_dma_stats {
152 153 154 155 156
	unsigned long		loads;
	unsigned long		timeout_longest;
	unsigned long		timeout_shortest;
	unsigned long		timeout_avg;
	unsigned long		timeout_failed;
L
Linus Torvalds 已提交
157 158
};

159 160
struct s3c2410_dma_map;

161
/* struct s3c2410_dma_chan
L
Linus Torvalds 已提交
162 163 164 165
 *
 * full state information for each DMA channel
*/

166
struct s3c2410_dma_chan {
L
Linus Torvalds 已提交
167
	/* channel state flags and information */
168 169 170 171 172
	unsigned char		 number;      /* number of this dma channel */
	unsigned char		 in_use;      /* channel allocated */
	unsigned char		 irq_claimed; /* irq claimed for channel */
	unsigned char		 irq_enabled; /* irq enabled for channel */
	unsigned char		 xfer_unit;   /* size of an transfer */
L
Linus Torvalds 已提交
173 174 175

	/* channel state */

176 177 178
	enum s3c2410_dma_state	 state;
	enum s3c2410_dma_loadst	 load_state;
	struct s3c2410_dma_client *client;
L
Linus Torvalds 已提交
179 180

	/* channel configuration */
181
	enum dma_data_direction	 source;
182
	enum dma_ch		 req_ch;
183 184 185
	unsigned long		 dev_addr;
	unsigned long		 load_timeout;
	unsigned int		 flags;		/* channel flags */
L
Linus Torvalds 已提交
186

187 188
	struct s3c24xx_dma_map	*map;		/* channel hw maps */

L
Linus Torvalds 已提交
189
	/* channel's hardware position and configuration */
190 191 192 193
	void __iomem		*regs;		/* channels registers */
	void __iomem		*addr_reg;	/* data address register */
	unsigned int		 irq;		/* channel irq */
	unsigned long		 dcon;		/* default value of DCON */
L
Linus Torvalds 已提交
194 195

	/* driver handles */
196 197
	s3c2410_dma_cbfn_t	 callback_fn;	/* buffer done callback */
	s3c2410_dma_opfn_t	 op_fn;		/* channel op callback */
L
Linus Torvalds 已提交
198 199

	/* stats gathering */
200 201
	struct s3c2410_dma_stats *stats;
	struct s3c2410_dma_stats  stats_store;
L
Linus Torvalds 已提交
202 203

	/* buffer list and information */
204 205 206
	struct s3c2410_dma_buf	*curr;		/* current dma buffer */
	struct s3c2410_dma_buf	*next;		/* next buffer to load */
	struct s3c2410_dma_buf	*end;		/* end of queue */
L
Linus Torvalds 已提交
207 208

	/* system device */
209
	struct device	dev;
L
Linus Torvalds 已提交
210 211 212 213 214
};

typedef unsigned long dma_device_t;

#endif /* __ASM_ARCH_DMA_H */