1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
#ifndef __ASM_ARCH_DMA_H
#define __ASM_ARCH_DMA_H
#define MAX_DMA_ADDRESS 0x03000000
#ifdef KERNEL_ARCH_DMA
static inline void arch_disable_dma (int dmanr)
{
printk (dma_str, "arch_disable_dma", dmanr);
}
static inline void arch_enable_dma (int dmanr)
{
printk (dma_str, "arch_enable_dma", dmanr);
}
static inline void arch_set_dma_addr (int dmanr, unsigned int addr)
{
printk (dma_str, "arch_set_dma_addr", dmanr);
}
static inline void arch_set_dma_count (int dmanr, unsigned int count)
{
printk (dma_str, "arch_set_dma_count", dmanr);
}
static inline void arch_set_dma_mode (int dmanr, char mode)
{
printk (dma_str, "arch_set_dma_mode", dmanr);
}
static inline int arch_dma_count (int dmanr)
{
printk (dma_str, "arch_dma_count", dmanr);
return 0;
}
#endif
/* enable/disable a specific DMA channel */
extern void enable_dma(unsigned int dmanr);
static __inline__ void disable_dma(unsigned int dmanr)
{
switch(dmanr) {
case 2: disable_irq(64); break;
default: printk (dma_str, "disable_dma", dmanr); break;
}
}
/* Clear the 'DMA Pointer Flip Flop'.
* Write 0 for LSB/MSB, 1 for MSB/LSB access.
* Use this once to initialize the FF to a known state.
* After that, keep track of it. :-)
* --- In order to do that, the DMA routines below should ---
* --- only be used while interrupts are disabled! ---
*/
static __inline__ void clear_dma_ff(unsigned int dmanr)
{
switch(dmanr) {
case 2: break;
default: printk (dma_str, "clear_dma_ff", dmanr); break;
}
}
/* set mode (above) for a specific DMA channel */
extern void set_dma_mode(unsigned int dmanr, char mode);
/* Set only the page register bits of the transfer address.
* This is used for successive transfers when we know the contents of
* the lower 16 bits of the DMA current address register, but a 64k boundary
* may have been crossed.
*/
static __inline__ void set_dma_page(unsigned int dmanr, char pagenr)
{
printk (dma_str, "set_dma_page", dmanr);
}
/* Set transfer address & page bits for specific DMA channel.
* Assumes dma flipflop is clear.
*/
extern void set_dma_addr(unsigned int dmanr, unsigned int addr);
/* Set transfer size for a specific DMA channel.
*/
extern void set_dma_count(unsigned int dmanr, unsigned int count);
/* Get DMA residue count. After a DMA transfer, this
* should return zero. Reading this while a DMA transfer is
* still in progress will return unpredictable results.
* If called before the channel has been used, it may return 1.
* Otherwise, it returns the number of _bytes_ left to transfer.
*
* Assumes DMA flip-flop is clear.
*/
extern int get_dma_residue(unsigned int dmanr);
#endif /* _ASM_ARCH_DMA_H */
|