Lines Matching +full:usb +full:- +full:dmac
2 * Renesas USB DMA Controller Driver
6 * based on rcar-dmac.c
16 #include <linux/dma-mapping.h>
30 #include "../virt-dma.h"
33 * struct usb_dmac_sg - Descriptor for a hardware transfer
43 * struct usb_dmac_desc - USB DMA Transfer Descriptor
49 * @residue: residue after the DMAC completed a transfer
51 * @done_cookie: cookie after the DMAC completed a transfer
69 * struct usb_dmac_chan - USB DMA Controller Channel
77 * @desc_freed: freed descriptors after the DMAC completed a transfer
93 * struct usb_dmac - USB DMA Controller
98 * @channels: array of DMAC channels
111 /* -----------------------------------------------------------------------------
150 /* -----------------------------------------------------------------------------
154 static void usb_dmac_write(struct usb_dmac *dmac, u32 reg, u32 data) in usb_dmac_write() argument
156 writel(data, dmac->iomem + reg); in usb_dmac_write()
159 static u32 usb_dmac_read(struct usb_dmac *dmac, u32 reg) in usb_dmac_read() argument
161 return readl(dmac->iomem + reg); in usb_dmac_read()
166 return readl(chan->iomem + reg); in usb_dmac_chan_read()
171 writel(data, chan->iomem + reg); in usb_dmac_chan_write()
174 /* -----------------------------------------------------------------------------
191 return 0xffffffff << (32 - (size % USB_DMAC_XFER_SIZE ? : in usb_dmac_calc_tend()
199 struct usb_dmac_desc *desc = chan->desc; in usb_dmac_chan_start_sg()
200 struct usb_dmac_sg *sg = desc->sg + index; in usb_dmac_chan_start_sg()
205 if (desc->direction == DMA_DEV_TO_MEM) in usb_dmac_chan_start_sg()
206 dst_addr = sg->mem_addr; in usb_dmac_chan_start_sg()
208 src_addr = sg->mem_addr; in usb_dmac_chan_start_sg()
210 dev_dbg(chan->vc.chan.device->dev, in usb_dmac_chan_start_sg()
211 "chan%u: queue sg %p: %u@%pad -> %pad\n", in usb_dmac_chan_start_sg()
212 chan->index, sg, sg->size, &src_addr, &dst_addr); in usb_dmac_chan_start_sg()
217 DIV_ROUND_UP(sg->size, USB_DMAC_XFER_SIZE)); in usb_dmac_chan_start_sg()
218 usb_dmac_chan_write(chan, USB_DMATEND, usb_dmac_calc_tend(sg->size)); in usb_dmac_chan_start_sg()
229 vd = vchan_next_desc(&chan->vc); in usb_dmac_chan_start_desc()
231 chan->desc = NULL; in usb_dmac_chan_start_desc()
236 * Remove this request from vc->desc_issued. Otherwise, this driver in usb_dmac_chan_start_desc()
240 list_del(&vd->node); in usb_dmac_chan_start_desc()
242 chan->desc = to_usb_dmac_desc(vd); in usb_dmac_chan_start_desc()
243 chan->desc->sg_index = 0; in usb_dmac_chan_start_desc()
247 static int usb_dmac_init(struct usb_dmac *dmac) in usb_dmac_init() argument
251 /* Clear all channels and enable the DMAC globally. */ in usb_dmac_init()
252 usb_dmac_write(dmac, USB_DMAOR, USB_DMAOR_DME); in usb_dmac_init()
254 dmaor = usb_dmac_read(dmac, USB_DMAOR); in usb_dmac_init()
256 dev_warn(dmac->dev, "DMAOR initialization failed.\n"); in usb_dmac_init()
257 return -EIO; in usb_dmac_init()
263 /* -----------------------------------------------------------------------------
274 return -ENOMEM; in usb_dmac_desc_alloc()
276 desc->sg_allocated_len = sg_len; in usb_dmac_desc_alloc()
277 INIT_LIST_HEAD(&desc->node); in usb_dmac_desc_alloc()
279 spin_lock_irqsave(&chan->vc.lock, flags); in usb_dmac_desc_alloc()
280 list_add_tail(&desc->node, &chan->desc_freed); in usb_dmac_desc_alloc()
281 spin_unlock_irqrestore(&chan->vc.lock, flags); in usb_dmac_desc_alloc()
291 list_splice_init(&chan->desc_freed, &list); in usb_dmac_desc_free()
292 list_splice_init(&chan->desc_got, &list); in usb_dmac_desc_free()
295 list_del(&desc->node); in usb_dmac_desc_free()
298 chan->descs_allocated = 0; in usb_dmac_desc_free()
308 spin_lock_irqsave(&chan->vc.lock, flags); in usb_dmac_desc_get()
309 list_for_each_entry(desc, &chan->desc_freed, node) { in usb_dmac_desc_get()
310 if (sg_len <= desc->sg_allocated_len) { in usb_dmac_desc_get()
311 list_move_tail(&desc->node, &chan->desc_got); in usb_dmac_desc_get()
312 spin_unlock_irqrestore(&chan->vc.lock, flags); in usb_dmac_desc_get()
316 spin_unlock_irqrestore(&chan->vc.lock, flags); in usb_dmac_desc_get()
321 spin_lock_irqsave(&chan->vc.lock, flags); in usb_dmac_desc_get()
322 desc = list_last_entry(&chan->desc_freed, struct usb_dmac_desc, in usb_dmac_desc_get()
324 list_move_tail(&desc->node, &chan->desc_got); in usb_dmac_desc_get()
325 spin_unlock_irqrestore(&chan->vc.lock, flags); in usb_dmac_desc_get()
337 spin_lock_irqsave(&chan->vc.lock, flags); in usb_dmac_desc_put()
338 list_move_tail(&desc->node, &chan->desc_freed); in usb_dmac_desc_put()
339 spin_unlock_irqrestore(&chan->vc.lock, flags); in usb_dmac_desc_put()
342 /* -----------------------------------------------------------------------------
348 struct dma_chan *chan = &uchan->vc.chan; in usb_dmac_soft_reset()
349 struct usb_dmac *dmac = to_usb_dmac(chan->device); in usb_dmac_soft_reset() local
353 for (i = 0; i < dmac->n_channels; ++i) { in usb_dmac_soft_reset()
358 usb_dmac_write(dmac, USB_DMAOR, 0); in usb_dmac_soft_reset()
359 usb_dmac_write(dmac, USB_DMASWR, USB_DMASWR_SWR); in usb_dmac_soft_reset()
361 usb_dmac_write(dmac, USB_DMASWR, 0); in usb_dmac_soft_reset()
362 usb_dmac_write(dmac, USB_DMAOR, 1); in usb_dmac_soft_reset()
375 static void usb_dmac_stop(struct usb_dmac *dmac) in usb_dmac_stop() argument
377 usb_dmac_write(dmac, USB_DMAOR, 0); in usb_dmac_stop()
380 /* -----------------------------------------------------------------------------
389 while (uchan->descs_allocated < USB_DMAC_INITIAL_NR_DESC) { in usb_dmac_alloc_chan_resources()
396 uchan->descs_allocated++; in usb_dmac_alloc_chan_resources()
399 return pm_runtime_get_sync(chan->device->dev); in usb_dmac_alloc_chan_resources()
408 spin_lock_irqsave(&uchan->vc.lock, flags); in usb_dmac_free_chan_resources()
410 spin_unlock_irqrestore(&uchan->vc.lock, flags); in usb_dmac_free_chan_resources()
413 vchan_free_chan_resources(&uchan->vc); in usb_dmac_free_chan_resources()
415 pm_runtime_put(chan->device->dev); in usb_dmac_free_chan_resources()
429 dev_warn(chan->device->dev, in usb_dmac_prep_slave_sg()
438 desc->direction = dir; in usb_dmac_prep_slave_sg()
439 desc->sg_len = sg_len; in usb_dmac_prep_slave_sg()
441 desc->sg[i].mem_addr = sg_dma_address(sg); in usb_dmac_prep_slave_sg()
442 desc->sg[i].size = sg_dma_len(sg); in usb_dmac_prep_slave_sg()
445 return vchan_tx_prep(&uchan->vc, &desc->vd, dma_flags); in usb_dmac_prep_slave_sg()
456 spin_lock_irqsave(&uchan->vc.lock, flags); in usb_dmac_chan_terminate_all()
458 vchan_get_all_descriptors(&uchan->vc, &head); in usb_dmac_chan_terminate_all()
459 if (uchan->desc) in usb_dmac_chan_terminate_all()
460 uchan->desc = NULL; in usb_dmac_chan_terminate_all()
461 list_splice_init(&uchan->desc_got, &list); in usb_dmac_chan_terminate_all()
463 list_move_tail(&desc->node, &uchan->desc_freed); in usb_dmac_chan_terminate_all()
464 spin_unlock_irqrestore(&uchan->vc.lock, flags); in usb_dmac_chan_terminate_all()
465 vchan_dma_desc_free_list(&uchan->vc, &head); in usb_dmac_chan_terminate_all()
474 struct usb_dmac_sg *sg = desc->sg + sg_index; in usb_dmac_get_current_residue()
475 u32 mem_addr = sg->mem_addr & 0xffffffff; in usb_dmac_get_current_residue()
476 unsigned int residue = sg->size; in usb_dmac_get_current_residue()
482 if (desc->direction == DMA_DEV_TO_MEM) in usb_dmac_get_current_residue()
483 residue -= usb_dmac_chan_read(chan, USB_DMADAR) - mem_addr; in usb_dmac_get_current_residue()
485 residue -= usb_dmac_chan_read(chan, USB_DMASAR) - mem_addr; in usb_dmac_get_current_residue()
496 list_for_each_entry_reverse(desc, &chan->desc_freed, node) { in usb_dmac_chan_get_residue_if_complete()
497 if (desc->done_cookie == cookie) { in usb_dmac_chan_get_residue_if_complete()
498 residue = desc->residue; in usb_dmac_chan_get_residue_if_complete()
511 struct usb_dmac_desc *desc = chan->desc; in usb_dmac_chan_get_residue()
515 vd = vchan_find_desc(&chan->vc, cookie); in usb_dmac_chan_get_residue()
522 for (i = desc->sg_index + 1; i < desc->sg_len; i++) in usb_dmac_chan_get_residue()
523 residue += desc->sg[i].size; in usb_dmac_chan_get_residue()
526 residue += usb_dmac_get_current_residue(chan, desc, desc->sg_index); in usb_dmac_chan_get_residue()
545 spin_lock_irqsave(&uchan->vc.lock, flags); in usb_dmac_tx_status()
550 spin_unlock_irqrestore(&uchan->vc.lock, flags); in usb_dmac_tx_status()
562 spin_lock_irqsave(&uchan->vc.lock, flags); in usb_dmac_issue_pending()
563 if (vchan_issue_pending(&uchan->vc) && !uchan->desc) in usb_dmac_issue_pending()
565 spin_unlock_irqrestore(&uchan->vc.lock, flags); in usb_dmac_issue_pending()
571 struct usb_dmac_chan *chan = to_usb_dmac_chan(vd->tx.chan); in usb_dmac_virt_desc_free()
576 /* -----------------------------------------------------------------------------
582 struct usb_dmac_desc *desc = chan->desc; in usb_dmac_isr_transfer_end()
586 if (++desc->sg_index < desc->sg_len) { in usb_dmac_isr_transfer_end()
587 usb_dmac_chan_start_sg(chan, desc->sg_index); in usb_dmac_isr_transfer_end()
589 desc->residue = usb_dmac_get_current_residue(chan, desc, in usb_dmac_isr_transfer_end()
590 desc->sg_index - 1); in usb_dmac_isr_transfer_end()
591 desc->done_cookie = desc->vd.tx.cookie; in usb_dmac_isr_transfer_end()
592 vchan_cookie_complete(&desc->vd); in usb_dmac_isr_transfer_end()
607 spin_lock(&chan->vc.lock); in usb_dmac_isr_channel()
628 spin_unlock(&chan->vc.lock); in usb_dmac_isr_channel()
633 /* -----------------------------------------------------------------------------
642 if (dma_spec->np != chan->device->dev->of_node) in usb_dmac_chan_filter()
645 /* USB-DMAC should be used with fixed usb controller's FIFO */ in usb_dmac_chan_filter()
646 if (uchan->index != dma_spec->args[0]) in usb_dmac_chan_filter()
658 if (dma_spec->args_count != 1) in usb_dmac_of_xlate()
672 /* -----------------------------------------------------------------------------
679 struct usb_dmac *dmac = dev_get_drvdata(dev); in usb_dmac_runtime_suspend() local
682 for (i = 0; i < dmac->n_channels; ++i) { in usb_dmac_runtime_suspend()
683 if (!dmac->channels[i].iomem) in usb_dmac_runtime_suspend()
685 usb_dmac_chan_halt(&dmac->channels[i]); in usb_dmac_runtime_suspend()
693 struct usb_dmac *dmac = dev_get_drvdata(dev); in usb_dmac_runtime_resume() local
695 return usb_dmac_init(dmac); in usb_dmac_runtime_resume()
706 /* -----------------------------------------------------------------------------
710 static int usb_dmac_chan_probe(struct usb_dmac *dmac, in usb_dmac_chan_probe() argument
714 struct platform_device *pdev = to_platform_device(dmac->dev); in usb_dmac_chan_probe()
719 uchan->index = index; in usb_dmac_chan_probe()
720 uchan->iomem = dmac->iomem + USB_DMAC_CHAN_OFFSET(index); in usb_dmac_chan_probe()
724 uchan->irq = platform_get_irq_byname(pdev, pdev_irqname); in usb_dmac_chan_probe()
725 if (uchan->irq < 0) { in usb_dmac_chan_probe()
726 dev_err(dmac->dev, "no IRQ specified for channel %u\n", index); in usb_dmac_chan_probe()
727 return -ENODEV; in usb_dmac_chan_probe()
730 irqname = devm_kasprintf(dmac->dev, GFP_KERNEL, "%s:%u", in usb_dmac_chan_probe()
731 dev_name(dmac->dev), index); in usb_dmac_chan_probe()
733 return -ENOMEM; in usb_dmac_chan_probe()
735 ret = devm_request_irq(dmac->dev, uchan->irq, usb_dmac_isr_channel, in usb_dmac_chan_probe()
738 dev_err(dmac->dev, "failed to request IRQ %u (%d)\n", in usb_dmac_chan_probe()
739 uchan->irq, ret); in usb_dmac_chan_probe()
743 uchan->vc.desc_free = usb_dmac_virt_desc_free; in usb_dmac_chan_probe()
744 vchan_init(&uchan->vc, &dmac->engine); in usb_dmac_chan_probe()
745 INIT_LIST_HEAD(&uchan->desc_freed); in usb_dmac_chan_probe()
746 INIT_LIST_HEAD(&uchan->desc_got); in usb_dmac_chan_probe()
751 static int usb_dmac_parse_of(struct device *dev, struct usb_dmac *dmac) in usb_dmac_parse_of() argument
753 struct device_node *np = dev->of_node; in usb_dmac_parse_of()
756 ret = of_property_read_u32(np, "dma-channels", &dmac->n_channels); in usb_dmac_parse_of()
758 dev_err(dev, "unable to read dma-channels property\n"); in usb_dmac_parse_of()
762 if (dmac->n_channels <= 0 || dmac->n_channels >= 100) { in usb_dmac_parse_of()
764 dmac->n_channels); in usb_dmac_parse_of()
765 return -EINVAL; in usb_dmac_parse_of()
775 struct usb_dmac *dmac; in usb_dmac_probe() local
780 dmac = devm_kzalloc(&pdev->dev, sizeof(*dmac), GFP_KERNEL); in usb_dmac_probe()
781 if (!dmac) in usb_dmac_probe()
782 return -ENOMEM; in usb_dmac_probe()
784 dmac->dev = &pdev->dev; in usb_dmac_probe()
785 platform_set_drvdata(pdev, dmac); in usb_dmac_probe()
787 ret = usb_dmac_parse_of(&pdev->dev, dmac); in usb_dmac_probe()
791 dmac->channels = devm_kcalloc(&pdev->dev, dmac->n_channels, in usb_dmac_probe()
792 sizeof(*dmac->channels), GFP_KERNEL); in usb_dmac_probe()
793 if (!dmac->channels) in usb_dmac_probe()
794 return -ENOMEM; in usb_dmac_probe()
798 dmac->iomem = devm_ioremap_resource(&pdev->dev, mem); in usb_dmac_probe()
799 if (IS_ERR(dmac->iomem)) in usb_dmac_probe()
800 return PTR_ERR(dmac->iomem); in usb_dmac_probe()
803 pm_runtime_enable(&pdev->dev); in usb_dmac_probe()
804 ret = pm_runtime_get_sync(&pdev->dev); in usb_dmac_probe()
806 dev_err(&pdev->dev, "runtime PM get sync failed (%d)\n", ret); in usb_dmac_probe()
810 ret = usb_dmac_init(dmac); in usb_dmac_probe()
813 dev_err(&pdev->dev, "failed to reset device\n"); in usb_dmac_probe()
818 INIT_LIST_HEAD(&dmac->engine.channels); in usb_dmac_probe()
820 for (i = 0; i < dmac->n_channels; ++i) { in usb_dmac_probe()
821 ret = usb_dmac_chan_probe(dmac, &dmac->channels[i], i); in usb_dmac_probe()
826 /* Register the DMAC as a DMA provider for DT. */ in usb_dmac_probe()
827 ret = of_dma_controller_register(pdev->dev.of_node, usb_dmac_of_xlate, in usb_dmac_probe()
835 * Default transfer size of 32 bytes requires 32-byte alignment. in usb_dmac_probe()
837 engine = &dmac->engine; in usb_dmac_probe()
838 dma_cap_set(DMA_SLAVE, engine->cap_mask); in usb_dmac_probe()
840 engine->dev = &pdev->dev; in usb_dmac_probe()
842 engine->src_addr_widths = widths; in usb_dmac_probe()
843 engine->dst_addr_widths = widths; in usb_dmac_probe()
844 engine->directions = BIT(DMA_MEM_TO_DEV) | BIT(DMA_DEV_TO_MEM); in usb_dmac_probe()
845 engine->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; in usb_dmac_probe()
847 engine->device_alloc_chan_resources = usb_dmac_alloc_chan_resources; in usb_dmac_probe()
848 engine->device_free_chan_resources = usb_dmac_free_chan_resources; in usb_dmac_probe()
849 engine->device_prep_slave_sg = usb_dmac_prep_slave_sg; in usb_dmac_probe()
850 engine->device_terminate_all = usb_dmac_chan_terminate_all; in usb_dmac_probe()
851 engine->device_tx_status = usb_dmac_tx_status; in usb_dmac_probe()
852 engine->device_issue_pending = usb_dmac_issue_pending; in usb_dmac_probe()
858 pm_runtime_put(&pdev->dev); in usb_dmac_probe()
862 of_dma_controller_free(pdev->dev.of_node); in usb_dmac_probe()
863 pm_runtime_put(&pdev->dev); in usb_dmac_probe()
865 pm_runtime_disable(&pdev->dev); in usb_dmac_probe()
869 static void usb_dmac_chan_remove(struct usb_dmac *dmac, in usb_dmac_chan_remove() argument
873 devm_free_irq(dmac->dev, uchan->irq, uchan); in usb_dmac_chan_remove()
878 struct usb_dmac *dmac = platform_get_drvdata(pdev); in usb_dmac_remove() local
881 for (i = 0; i < dmac->n_channels; ++i) in usb_dmac_remove()
882 usb_dmac_chan_remove(dmac, &dmac->channels[i]); in usb_dmac_remove()
883 of_dma_controller_free(pdev->dev.of_node); in usb_dmac_remove()
884 dma_async_device_unregister(&dmac->engine); in usb_dmac_remove()
886 pm_runtime_disable(&pdev->dev); in usb_dmac_remove()
893 struct usb_dmac *dmac = platform_get_drvdata(pdev); in usb_dmac_shutdown() local
895 usb_dmac_stop(dmac); in usb_dmac_shutdown()
899 { .compatible = "renesas,usb-dmac", },
907 .name = "usb-dmac",
917 MODULE_DESCRIPTION("Renesas USB DMA Controller Driver");