Lines Matching +full:dma +full:- +full:channels
1 // SPDX-License-Identifier: GPL-2.0
3 * arch/sh/drivers/dma/dma-api.c
5 * SuperH-specific DMA management API
19 #include <asm/dma.h>
33 if ((chan < info->first_vchannel_nr) || in get_dma_info()
34 (chan >= info->first_vchannel_nr + info->nr_channels)) in get_dma_info()
53 nr += info->nr_channels; in get_nr_channels()
65 return ERR_PTR(-EINVAL); in get_dma_channel()
67 for (i = 0; i < info->nr_channels; i++) { in get_dma_channel()
68 channel = &info->channels[i]; in get_dma_channel()
69 if (channel->vchan == chan) in get_dma_channel()
82 if (info->ops->get_residue) in get_dma_residue()
83 return info->ops->get_residue(channel); in get_dma_residue()
96 if (atomic_xchg(&channel->busy, 1)) in request_dma()
97 return -EBUSY; in request_dma()
99 strscpy(channel->dev_id, dev_id, sizeof(channel->dev_id)); in request_dma()
101 if (info->ops->request) { in request_dma()
102 result = info->ops->request(channel); in request_dma()
104 atomic_set(&channel->busy, 0); in request_dma()
118 if (info->ops->free) in free_dma()
119 info->ops->free(channel); in free_dma()
121 atomic_set(&channel->busy, 0); in free_dma()
130 if (channel->flags & DMA_TEI_CAPABLE) { in dma_wait_for_completion()
131 wait_event(channel->wait_queue, in dma_wait_for_completion()
132 (info->ops->get_residue(channel) == 0)); in dma_wait_for_completion()
136 while (info->ops->get_residue(channel)) in dma_wait_for_completion()
146 if (info->ops->configure) in dma_configure_channel()
147 info->ops->configure(channel, flags); in dma_configure_channel()
157 channel->sar = from; in dma_xfer()
158 channel->dar = to; in dma_xfer()
159 channel->count = size; in dma_xfer()
160 channel->mode = mode; in dma_xfer()
162 return info->ops->xfer(channel); in dma_xfer()
182 for (i = 0; i < info->nr_channels; i++) { in dma_proc_show()
183 struct dma_channel *channel = info->channels + i; in dma_proc_show()
185 if (!(channel->flags & DMA_CONFIGURED)) in dma_proc_show()
189 info->name, channel->dev_id); in dma_proc_show()
200 INIT_LIST_HEAD(&info->list); in register_dmac()
202 printk(KERN_INFO "DMA: Registering %s handler (%d channel%s).\n", in register_dmac()
203 info->name, info->nr_channels, info->nr_channels > 1 ? "s" : ""); in register_dmac()
205 BUG_ON((info->flags & DMAC_CHANNELS_CONFIGURED) && !info->channels); in register_dmac()
207 info->pdev = platform_device_register_simple(info->name, -1, in register_dmac()
209 if (IS_ERR(info->pdev)) in register_dmac()
210 return PTR_ERR(info->pdev); in register_dmac()
213 * Don't touch pre-configured channels in register_dmac()
215 if (!(info->flags & DMAC_CHANNELS_CONFIGURED)) { in register_dmac()
218 size = sizeof(struct dma_channel) * info->nr_channels; in register_dmac()
220 info->channels = kzalloc(size, GFP_KERNEL); in register_dmac()
221 if (!info->channels) in register_dmac()
222 return -ENOMEM; in register_dmac()
226 info->first_vchannel_nr = total_channels; in register_dmac()
227 for (i = 0; i < info->nr_channels; i++) { in register_dmac()
228 struct dma_channel *chan = &info->channels[i]; in register_dmac()
230 atomic_set(&chan->busy, 0); in register_dmac()
232 chan->chan = info->first_channel_nr + i; in register_dmac()
233 chan->vchan = info->first_channel_nr + i + total_channels; in register_dmac()
235 memcpy(chan->dev_id, "Unused", 7); in register_dmac()
237 if (info->flags & DMAC_CHANNELS_TEI_CAPABLE) in register_dmac()
238 chan->flags |= DMA_TEI_CAPABLE; in register_dmac()
240 init_waitqueue_head(&chan->wait_queue); in register_dmac()
244 list_add(&info->list, ®istered_dmac_list); in register_dmac()
254 for (i = 0; i < info->nr_channels; i++) in unregister_dmac()
255 dma_remove_sysfs_files(info->channels + i, info); in unregister_dmac()
257 if (!(info->flags & DMAC_CHANNELS_CONFIGURED)) in unregister_dmac()
258 kfree(info->channels); in unregister_dmac()
260 list_del(&info->list); in unregister_dmac()
261 platform_device_unregister(info->pdev); in unregister_dmac()
267 printk(KERN_NOTICE "DMA: Registering DMA API.\n"); in dma_api_init()
268 return proc_create_single("dma", 0, NULL, dma_proc_show) ? 0 : -ENOMEM; in dma_api_init()
272 MODULE_AUTHOR("Paul Mundt <lethal@linux-sh.org>");
273 MODULE_DESCRIPTION("DMA API for SuperH");