Lines Matching full:dma
3 * linux/arch/arm/kernel/dma.c
7 * Front-end to the DMA handling. This handles the allocation/freeing
8 * of DMA channels, and provides a unified interface to the machines
9 * DMA facilities.
19 #include <asm/dma.h>
21 #include <asm/mach/dma.h>
36 int __init isa_dma_add(unsigned int chan, dma_t *dma) in isa_dma_add() argument
38 if (!dma->d_ops) in isa_dma_add()
41 sg_init_table(&dma->buf, 1); in isa_dma_add()
45 dma_chan[chan] = dma; in isa_dma_add()
50 * Request DMA channel
56 dma_t *dma = dma_channel(chan); in request_dma() local
59 if (!dma) in request_dma()
62 if (xchg(&dma->lock, 1) != 0) in request_dma()
65 dma->device_id = device_id; in request_dma()
66 dma->active = 0; in request_dma()
67 dma->invalid = 1; in request_dma()
70 if (dma->d_ops->request) in request_dma()
71 ret = dma->d_ops->request(chan, dma); in request_dma()
74 xchg(&dma->lock, 0); in request_dma()
79 pr_err("dma: trying to allocate DMA%d\n", chan); in request_dma()
88 * Free DMA channel
94 dma_t *dma = dma_channel(chan); in free_dma() local
96 if (!dma) in free_dma()
99 if (dma->active) { in free_dma()
100 pr_err("dma%d: freeing active DMA\n", chan); in free_dma()
101 dma->d_ops->disable(chan, dma); in free_dma()
102 dma->active = 0; in free_dma()
105 if (xchg(&dma->lock, 0) != 0) { in free_dma()
106 if (dma->d_ops->free) in free_dma()
107 dma->d_ops->free(chan, dma); in free_dma()
111 pr_err("dma%d: trying to free free DMA\n", chan); in free_dma()
115 pr_err("dma: trying to free DMA%d\n", chan); in free_dma()
119 /* Set DMA Scatter-Gather list
123 dma_t *dma = dma_channel(chan); in set_dma_sg() local
125 if (dma->active) in set_dma_sg()
126 pr_err("dma%d: altering DMA SG while DMA active\n", chan); in set_dma_sg()
128 dma->sg = sg; in set_dma_sg()
129 dma->sgcount = nr_sg; in set_dma_sg()
130 dma->invalid = 1; in set_dma_sg()
134 /* Set DMA address
140 dma_t *dma = dma_channel(chan); in __set_dma_addr() local
142 if (dma->active) in __set_dma_addr()
143 pr_err("dma%d: altering DMA address while DMA active\n", chan); in __set_dma_addr()
145 dma->sg = NULL; in __set_dma_addr()
146 dma->addr = addr; in __set_dma_addr()
147 dma->invalid = 1; in __set_dma_addr()
151 /* Set DMA byte count
157 dma_t *dma = dma_channel(chan); in set_dma_count() local
159 if (dma->active) in set_dma_count()
160 pr_err("dma%d: altering DMA count while DMA active\n", chan); in set_dma_count()
162 dma->sg = NULL; in set_dma_count()
163 dma->count = count; in set_dma_count()
164 dma->invalid = 1; in set_dma_count()
168 /* Set DMA direction mode
172 dma_t *dma = dma_channel(chan); in set_dma_mode() local
174 if (dma->active) in set_dma_mode()
175 pr_err("dma%d: altering DMA mode while DMA active\n", chan); in set_dma_mode()
177 dma->dma_mode = mode; in set_dma_mode()
178 dma->invalid = 1; in set_dma_mode()
182 /* Enable DMA channel
186 dma_t *dma = dma_channel(chan); in enable_dma() local
188 if (!dma->lock) in enable_dma()
191 if (dma->active == 0) { in enable_dma()
192 dma->active = 1; in enable_dma()
193 dma->d_ops->enable(chan, dma); in enable_dma()
198 pr_err("dma%d: trying to enable free DMA\n", chan); in enable_dma()
203 /* Disable DMA channel
207 dma_t *dma = dma_channel(chan); in disable_dma() local
209 if (!dma->lock) in disable_dma()
212 if (dma->active == 1) { in disable_dma()
213 dma->active = 0; in disable_dma()
214 dma->d_ops->disable(chan, dma); in disable_dma()
219 pr_err("dma%d: trying to disable free DMA\n", chan); in disable_dma()
225 * Is the specified DMA channel active?
229 dma_t *dma = dma_channel(chan); in dma_channel_active() local
230 return dma->active; in dma_channel_active()
236 pr_err("dma%d: trying to set_dma_page\n", chan); in set_dma_page()
242 dma_t *dma = dma_channel(chan); in set_dma_speed() local
245 if (dma->d_ops->setspeed) in set_dma_speed()
246 ret = dma->d_ops->setspeed(chan, dma, cycle_ns); in set_dma_speed()
247 dma->speed = ret; in set_dma_speed()
253 dma_t *dma = dma_channel(chan); in get_dma_residue() local
256 if (dma->d_ops->residue) in get_dma_residue()
257 ret = dma->d_ops->residue(chan, dma); in get_dma_residue()
269 dma_t *dma = dma_channel(i); in proc_dma_show() local
270 if (dma && dma->lock) in proc_dma_show()
271 seq_printf(m, "%2d: %s\n", i, dma->device_id); in proc_dma_show()
278 proc_create_single("dma", 0, NULL, proc_dma_show); in proc_dma_init()