| .. | .. |
|---|
| 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 | { |
|---|