11 #ifndef AT_HDMAC_REGS_H
12 #define AT_HDMAC_REGS_H
16 #define AT_DMA_MAX_NR_CHANNELS 8
19 #define AT_DMA_GCFG 0x00
20 #define AT_DMA_IF_BIGEND(i) (0x1 << (i))
21 #define AT_DMA_ARB_CFG (0x1 << 4)
22 #define AT_DMA_ARB_CFG_FIXED (0x0 << 4)
23 #define AT_DMA_ARB_CFG_ROUND_ROBIN (0x1 << 4)
25 #define AT_DMA_EN 0x04
26 #define AT_DMA_ENABLE (0x1 << 0)
28 #define AT_DMA_SREQ 0x08
29 #define AT_DMA_SSREQ(x) (0x1 << ((x) << 1))
30 #define AT_DMA_DSREQ(x) (0x1 << (1 + ((x) << 1)))
32 #define AT_DMA_CREQ 0x0C
33 #define AT_DMA_SCREQ(x) (0x1 << ((x) << 1))
34 #define AT_DMA_DCREQ(x) (0x1 << (1 + ((x) << 1)))
36 #define AT_DMA_LAST 0x10
37 #define AT_DMA_SLAST(x) (0x1 << ((x) << 1))
38 #define AT_DMA_DLAST(x) (0x1 << (1 + ((x) << 1)))
40 #define AT_DMA_SYNC 0x14
41 #define AT_DMA_SYR(h) (0x1 << (h))
44 #define AT_DMA_EBCIER 0x18
45 #define AT_DMA_EBCIDR 0x1C
46 #define AT_DMA_EBCIMR 0x20
47 #define AT_DMA_EBCISR 0x24
48 #define AT_DMA_CBTC_OFFSET 8
49 #define AT_DMA_ERR_OFFSET 16
50 #define AT_DMA_BTC(x) (0x1 << (x))
51 #define AT_DMA_CBTC(x) (0x1 << (AT_DMA_CBTC_OFFSET + (x)))
52 #define AT_DMA_ERR(x) (0x1 << (AT_DMA_ERR_OFFSET + (x)))
54 #define AT_DMA_CHER 0x28
55 #define AT_DMA_ENA(x) (0x1 << (x))
56 #define AT_DMA_SUSP(x) (0x1 << ( 8 + (x)))
57 #define AT_DMA_KEEP(x) (0x1 << (24 + (x)))
59 #define AT_DMA_CHDR 0x2C
60 #define AT_DMA_DIS(x) (0x1 << (x))
61 #define AT_DMA_RES(x) (0x1 << ( 8 + (x)))
63 #define AT_DMA_CHSR 0x30
64 #define AT_DMA_EMPT(x) (0x1 << (16 + (x)))
65 #define AT_DMA_STAL(x) (0x1 << (24 + (x)))
68 #define AT_DMA_CH_REGS_BASE 0x3C
69 #define ch_regs(x) (AT_DMA_CH_REGS_BASE + (x) * 0x28)
72 #define ATC_SADDR_OFFSET 0x00
73 #define ATC_DADDR_OFFSET 0x04
74 #define ATC_DSCR_OFFSET 0x08
75 #define ATC_CTRLA_OFFSET 0x0C
76 #define ATC_CTRLB_OFFSET 0x10
77 #define ATC_CFG_OFFSET 0x14
78 #define ATC_SPIP_OFFSET 0x18
79 #define ATC_DPIP_OFFSET 0x1C
85 #define ATC_DSCR_IF(i) (0x3 & (i))
88 #define ATC_BTSIZE_MAX 0xFFFFUL
89 #define ATC_BTSIZE(x) (ATC_BTSIZE_MAX & (x))
90 #define ATC_SCSIZE_MASK (0x7 << 16)
91 #define ATC_SCSIZE(x) (ATC_SCSIZE_MASK & ((x) << 16))
92 #define ATC_SCSIZE_1 (0x0 << 16)
93 #define ATC_SCSIZE_4 (0x1 << 16)
94 #define ATC_SCSIZE_8 (0x2 << 16)
95 #define ATC_SCSIZE_16 (0x3 << 16)
96 #define ATC_SCSIZE_32 (0x4 << 16)
97 #define ATC_SCSIZE_64 (0x5 << 16)
98 #define ATC_SCSIZE_128 (0x6 << 16)
99 #define ATC_SCSIZE_256 (0x7 << 16)
100 #define ATC_DCSIZE_MASK (0x7 << 20)
101 #define ATC_DCSIZE(x) (ATC_DCSIZE_MASK & ((x) << 20))
102 #define ATC_DCSIZE_1 (0x0 << 20)
103 #define ATC_DCSIZE_4 (0x1 << 20)
104 #define ATC_DCSIZE_8 (0x2 << 20)
105 #define ATC_DCSIZE_16 (0x3 << 20)
106 #define ATC_DCSIZE_32 (0x4 << 20)
107 #define ATC_DCSIZE_64 (0x5 << 20)
108 #define ATC_DCSIZE_128 (0x6 << 20)
109 #define ATC_DCSIZE_256 (0x7 << 20)
110 #define ATC_SRC_WIDTH_MASK (0x3 << 24)
111 #define ATC_SRC_WIDTH(x) ((x) << 24)
112 #define ATC_SRC_WIDTH_BYTE (0x0 << 24)
113 #define ATC_SRC_WIDTH_HALFWORD (0x1 << 24)
114 #define ATC_SRC_WIDTH_WORD (0x2 << 24)
115 #define ATC_DST_WIDTH_MASK (0x3 << 28)
116 #define ATC_DST_WIDTH(x) ((x) << 28)
117 #define ATC_DST_WIDTH_BYTE (0x0 << 28)
118 #define ATC_DST_WIDTH_HALFWORD (0x1 << 28)
119 #define ATC_DST_WIDTH_WORD (0x2 << 28)
120 #define ATC_DONE (0x1 << 31)
123 #define ATC_SIF(i) (0x3 & (i))
124 #define ATC_DIF(i) ((0x3 & (i)) << 4)
126 #define AT_DMA_MEM_IF 0
127 #define AT_DMA_PER_IF 1
129 #define ATC_SRC_PIP (0x1 << 8)
130 #define ATC_DST_PIP (0x1 << 12)
131 #define ATC_SRC_DSCR_DIS (0x1 << 16)
132 #define ATC_DST_DSCR_DIS (0x1 << 20)
133 #define ATC_FC_MASK (0x7 << 21)
134 #define ATC_FC_MEM2MEM (0x0 << 21)
135 #define ATC_FC_MEM2PER (0x1 << 21)
136 #define ATC_FC_PER2MEM (0x2 << 21)
137 #define ATC_FC_PER2PER (0x3 << 21)
138 #define ATC_FC_PER2MEM_PER (0x4 << 21)
139 #define ATC_FC_MEM2PER_PER (0x5 << 21)
140 #define ATC_FC_PER2PER_SRCPER (0x6 << 21)
141 #define ATC_FC_PER2PER_DSTPER (0x7 << 21)
142 #define ATC_SRC_ADDR_MODE_MASK (0x3 << 24)
143 #define ATC_SRC_ADDR_MODE_INCR (0x0 << 24)
144 #define ATC_SRC_ADDR_MODE_DECR (0x1 << 24)
145 #define ATC_SRC_ADDR_MODE_FIXED (0x2 << 24)
146 #define ATC_DST_ADDR_MODE_MASK (0x3 << 28)
147 #define ATC_DST_ADDR_MODE_INCR (0x0 << 28)
148 #define ATC_DST_ADDR_MODE_DECR (0x1 << 28)
149 #define ATC_DST_ADDR_MODE_FIXED (0x2 << 28)
150 #define ATC_IEN (0x1 << 30)
151 #define ATC_AUTO (0x1 << 31)
157 #define ATC_SPIP_HOLE(x) (0xFFFFU & (x))
158 #define ATC_SPIP_BOUNDARY(x) ((0x3FF & (x)) << 16)
161 #define ATC_DPIP_HOLE(x) (0xFFFFU & (x))
162 #define ATC_DPIP_BOUNDARY(x) ((0x3FF & (x)) << 16)
256 #define channel_readl(atchan, name) \
257 __raw_readl((atchan)->ch_regs + ATC_##name##_OFFSET)
259 #define channel_writel(atchan, name, val) \
260 __raw_writel((val), (atchan)->ch_regs + ATC_##name##_OFFSET)
273 static inline void convert_burst(
u32 *maxburst)
276 *maxburst = fls(*maxburst) - 2;
287 switch (addr_width) {
324 #define dma_readl(atdma, name) \
325 __raw_readl((atdma)->regs + AT_DMA_##name)
326 #define dma_writel(atdma, name, val) \
327 __raw_writel((val), (atdma)->regs + AT_DMA_##name)
339 return &chan->
dev->device;
343 return chan->
dev->device.parent;
346 #if defined(VERBOSE_DEBUG)
347 static void vdbg_dump_regs(
struct at_dma_chan *atchan)
352 " channel %d : imr = 0x%x, chsr = 0x%x\n",
358 " channel: s0x%x d0x%x ctrl0x%x:0x%x cfg0x%x l0x%x\n",
367 static void vdbg_dump_regs(
struct at_dma_chan *atchan) {}
373 " desc: s0x%x d0x%x ctrl0x%x:0x%x l0x%x\n",
379 static void atc_setup_irq(
struct at_dma *atdma,
int chan_id,
int on)
392 static void atc_enable_chan_irq(
struct at_dma *atdma,
int chan_id)
394 atc_setup_irq(atdma, chan_id, 1);
397 static void atc_disable_chan_irq(
struct at_dma *atdma,
int chan_id)
399 atc_setup_irq(atdma, chan_id, 0);
407 static inline int atc_chan_is_enabled(
struct at_dma_chan *atchan)
418 static inline int atc_chan_is_paused(
struct at_dma_chan *atchan)
427 static inline int atc_chan_is_cyclic(
struct at_dma_chan *atchan)
438 u32 ctrlb = desc->
lli.ctrlb;
443 desc->
lli.ctrlb = ctrlb;