Lines Matching refs:dma
20 #include <linux/dma-direction.h>
117 struct knav_dma_device *dma;
220 /* wait for the dma to shut itself down */
248 /* teardown the dma channel */
264 static void dma_hw_enable_all(struct knav_dma_device *dma)
268 for (i = 0; i < dma->max_tx_chan; i++) {
269 writel_relaxed(0, &dma->reg_tx_chan[i].mode);
270 writel_relaxed(DMA_ENABLE, &dma->reg_tx_chan[i].control);
275 static void knav_dma_hw_init(struct knav_dma_device *dma)
280 spin_lock(&dma->lock);
281 v = dma->loopback ? DMA_LOOPBACK : 0;
282 writel_relaxed(v, &dma->reg_global->emulation_control);
284 v = readl_relaxed(&dma->reg_global->perf_control);
285 v |= ((dma->rx_timeout & DMA_RX_TIMEOUT_MASK) << DMA_RX_TIMEOUT_SHIFT);
286 writel_relaxed(v, &dma->reg_global->perf_control);
288 v = ((dma->tx_priority << DMA_TX_PRIO_SHIFT) |
289 (dma->rx_priority << DMA_RX_PRIO_SHIFT));
291 writel_relaxed(v, &dma->reg_global->priority_control);
294 for (i = 0; i < dma->max_rx_chan; i++)
295 writel_relaxed(DMA_ENABLE, &dma->reg_rx_chan[i].control);
297 for (i = 0; i < dma->logical_queue_managers; i++)
298 writel_relaxed(dma->qm_base_address[i],
299 &dma->reg_global->qm_base_address[i]);
300 spin_unlock(&dma->lock);
303 static void knav_dma_hw_destroy(struct knav_dma_device *dma)
308 spin_lock(&dma->lock);
311 for (i = 0; i < dma->max_rx_chan; i++)
312 writel_relaxed(v, &dma->reg_rx_chan[i].control);
314 for (i = 0; i < dma->max_tx_chan; i++)
315 writel_relaxed(v, &dma->reg_tx_chan[i].control);
316 spin_unlock(&dma->lock);
348 struct knav_dma_device *dma)
352 list_for_each_entry(chan, &dma->chan_list, list) {
360 struct knav_dma_device *dma;
362 list_for_each_entry(dma, &kdev->list, list) {
363 if (atomic_read(&dma->ref_count)) {
365 dma->name, dma->max_tx_chan, dma->max_rx_flow);
366 dma_debug_show_devices(s, dma);
387 index = of_property_match_string(np, "ti,navigator-dma-names", name);
389 dev_err(kdev->dev, "No 'ti,navigator-dma-names' property\n");
411 * @config: dma configuration parameters
419 struct knav_dma_device *dma;
425 pr_err("keystone-navigator-dma driver not registered\n");
446 /* Look for correct dma instance */
447 list_for_each_entry(dma, &kdev->list, list) {
448 if (!strcmp(dma->name, instance)) {
458 /* Look for correct dma channel from dma instance */
460 list_for_each_entry(chan, &dma->chan_list, list) {
487 if (atomic_inc_return(&chan->dma->ref_count) <= 1)
488 knav_dma_hw_init(chan->dma);
501 * knav_dma_close_channel() - Destroy a dma channel
503 * channel: dma channel handle
511 pr_err("keystone-navigator-dma driver not registered\n");
518 if (atomic_dec_return(&chan->dma->ref_count) <= 0)
519 knav_dma_hw_destroy(chan->dma);
522 chan->channel, chan->flow, chan->dma->name);
526 static void __iomem *pktdma_get_regs(struct knav_dma_device *dma,
554 struct knav_dma_device *dma = chan->dma;
557 chan->reg_rx_flow = dma->reg_rx_flow + flow;
566 struct knav_dma_device *dma = chan->dma;
569 chan->reg_chan = dma->reg_tx_chan + channel;
570 chan->reg_tx_sched = dma->reg_tx_sched + channel;
577 static int pktdma_init_chan(struct knav_dma_device *dma,
590 chan->dma = dma;
605 list_add_tail(&chan->list, &dma->chan_list);
614 struct knav_dma_device *dma;
620 dma = devm_kzalloc(kdev->dev, sizeof(*dma), GFP_KERNEL);
621 if (!dma) {
625 INIT_LIST_HEAD(&dma->list);
626 INIT_LIST_HEAD(&dma->chan_list);
633 dma->logical_queue_managers = len / sizeof(u32);
634 if (dma->logical_queue_managers > DMA_MAX_QMS) {
636 dma->logical_queue_managers);
637 dma->logical_queue_managers = DMA_MAX_QMS;
641 dma->qm_base_address,
642 dma->logical_queue_managers);
648 dma->reg_global = pktdma_get_regs(dma, node, 0, &size);
649 if (!dma->reg_global)
656 dma->reg_tx_chan = pktdma_get_regs(dma, node, 1, &size);
657 if (!dma->reg_tx_chan)
661 dma->reg_rx_chan = pktdma_get_regs(dma, node, 2, &size);
662 if (!dma->reg_rx_chan)
666 dma->reg_tx_sched = pktdma_get_regs(dma, node, 3, &size);
667 if (!dma->reg_tx_sched)
671 dma->reg_rx_flow = pktdma_get_regs(dma, node, 4, &size);
672 if (!dma->reg_rx_flow)
676 dma->rx_priority = DMA_PRIO_DEFAULT;
677 dma->tx_priority = DMA_PRIO_DEFAULT;
679 dma->enable_all = (of_get_property(node, "ti,enable-all", NULL) != NULL);
680 dma->loopback = (of_get_property(node, "ti,loop-back", NULL) != NULL);
689 dma->rx_timeout = timeout;
690 dma->max_rx_chan = max_rx_chan;
691 dma->max_rx_flow = max_rx_flow;
692 dma->max_tx_chan = min(max_tx_chan, max_tx_sched);
693 atomic_set(&dma->ref_count, 0);
694 strcpy(dma->name, node->name);
695 spin_lock_init(&dma->lock);
697 for (i = 0; i < dma->max_tx_chan; i++) {
698 if (pktdma_init_chan(dma, DMA_MEM_TO_DEV, i) >= 0)
702 for (i = 0; i < dma->max_rx_flow; i++) {
703 if (pktdma_init_chan(dma, DMA_DEV_TO_MEM, i) >= 0)
707 list_add_tail(&dma->list, &kdev->list);
713 if (dma->enable_all) {
714 atomic_inc(&dma->ref_count);
715 knav_dma_hw_init(dma);
716 dma_hw_enable_all(dma);
720 dma->name, num_chan, dma->max_rx_flow,
721 dma->max_tx_chan, dma->max_rx_chan,
722 dma->loopback ? ", loopback" : "");
767 dev_err(dev, "no valid dma instance\n");
788 struct knav_dma_device *dma;
790 list_for_each_entry(dma, &kdev->list, list) {
791 if (atomic_dec_return(&dma->ref_count) == 0)
792 knav_dma_hw_destroy(dma);
802 { .compatible = "ti,keystone-navigator-dma", },
812 .name = "keystone-navigator-dma",