.. | .. |
---|
19 | 19 | #include <cpu/dma.h> |
---|
20 | 20 | |
---|
21 | 21 | /* |
---|
| 22 | + * Some of the SoCs feature two DMAC modules. In such a case, the channels are |
---|
| 23 | + * distributed equally among them. |
---|
| 24 | + */ |
---|
| 25 | +#ifdef SH_DMAC_BASE1 |
---|
| 26 | +#define SH_DMAC_NR_MD_CH (CONFIG_NR_ONCHIP_DMA_CHANNELS / 2) |
---|
| 27 | +#else |
---|
| 28 | +#define SH_DMAC_NR_MD_CH CONFIG_NR_ONCHIP_DMA_CHANNELS |
---|
| 29 | +#endif |
---|
| 30 | + |
---|
| 31 | +#define SH_DMAC_CH_SZ 0x10 |
---|
| 32 | + |
---|
| 33 | +/* |
---|
22 | 34 | * Define the default configuration for dual address memory-memory transfer. |
---|
23 | 35 | * The 0x400 value represents auto-request, external->external. |
---|
24 | 36 | */ |
---|
.. | .. |
---|
29 | 41 | unsigned long base = SH_DMAC_BASE0; |
---|
30 | 42 | |
---|
31 | 43 | #ifdef SH_DMAC_BASE1 |
---|
32 | | - if (chan >= 6) |
---|
| 44 | + if (chan >= SH_DMAC_NR_MD_CH) |
---|
33 | 45 | base = SH_DMAC_BASE1; |
---|
34 | 46 | #endif |
---|
35 | 47 | |
---|
.. | .. |
---|
40 | 52 | { |
---|
41 | 53 | unsigned long base = dma_find_base(chan); |
---|
42 | 54 | |
---|
43 | | - /* Normalize offset calculation */ |
---|
44 | | - if (chan >= 9) |
---|
45 | | - chan -= 6; |
---|
46 | | - if (chan >= 4) |
---|
47 | | - base += 0x10; |
---|
| 55 | + chan = (chan % SH_DMAC_NR_MD_CH) * SH_DMAC_CH_SZ; |
---|
48 | 56 | |
---|
49 | | - return base + (chan * 0x10); |
---|
| 57 | + /* DMAOR is placed inside the channel register space. Step over it. */ |
---|
| 58 | + if (chan >= DMAOR) |
---|
| 59 | + base += SH_DMAC_CH_SZ; |
---|
| 60 | + |
---|
| 61 | + return base + chan; |
---|
50 | 62 | } |
---|
51 | 63 | |
---|
52 | 64 | #ifdef CONFIG_SH_DMA_IRQ_MULTI |
---|
.. | .. |
---|
250 | 262 | #define NR_DMAOR 1 |
---|
251 | 263 | #endif |
---|
252 | 264 | |
---|
253 | | -/* |
---|
254 | | - * DMAOR bases are broken out amongst channel groups. DMAOR0 manages |
---|
255 | | - * channels 0 - 5, DMAOR1 6 - 11 (optional). |
---|
256 | | - */ |
---|
257 | | -#define dmaor_read_reg(n) __raw_readw(dma_find_base((n)*6)) |
---|
258 | | -#define dmaor_write_reg(n, data) __raw_writew(data, dma_find_base(n)*6) |
---|
| 265 | +#define dmaor_read_reg(n) __raw_readw(dma_find_base((n) * \ |
---|
| 266 | + SH_DMAC_NR_MD_CH) + DMAOR) |
---|
| 267 | +#define dmaor_write_reg(n, data) __raw_writew(data, \ |
---|
| 268 | + dma_find_base((n) * \ |
---|
| 269 | + SH_DMAC_NR_MD_CH) + DMAOR) |
---|
259 | 270 | |
---|
260 | 271 | static inline int dmaor_reset(int no) |
---|
261 | 272 | { |
---|