Lines Matching refs:mdev
206 * @mdev: Pointer to the Altera mSGDMA device structure
210 static struct msgdma_sw_desc *msgdma_get_descriptor(struct msgdma_device *mdev)
215 spin_lock_irqsave(&mdev->lock, flags);
216 desc = list_first_entry(&mdev->free_list, struct msgdma_sw_desc, node);
218 spin_unlock_irqrestore(&mdev->lock, flags);
227 * @mdev: Pointer to the Altera mSGDMA device structure
230 static void msgdma_free_descriptor(struct msgdma_device *mdev,
235 mdev->desc_free_cnt++;
236 list_add_tail(&desc->node, &mdev->free_list);
238 mdev->desc_free_cnt++;
239 list_move_tail(&child->node, &mdev->free_list);
245 * @mdev: Pointer to the Altera mSGDMA device structure
248 static void msgdma_free_desc_list(struct msgdma_device *mdev,
254 msgdma_free_descriptor(mdev, desc);
306 struct msgdma_device *mdev = to_mdev(tx->chan);
312 spin_lock_irqsave(&mdev->lock, flags);
315 list_add_tail(&new->node, &mdev->pending_list);
316 spin_unlock_irqrestore(&mdev->lock, flags);
335 struct msgdma_device *mdev = to_mdev(dchan);
344 spin_lock_irqsave(&mdev->lock, irqflags);
345 if (desc_cnt > mdev->desc_free_cnt) {
346 spin_unlock_irqrestore(&mdev->lock, irqflags);
347 dev_dbg(mdev->dev, "mdev %p descs are not available\n", mdev);
350 mdev->desc_free_cnt -= desc_cnt;
351 spin_unlock_irqrestore(&mdev->lock, irqflags);
355 new = msgdma_get_descriptor(mdev);
393 struct msgdma_device *mdev = to_mdev(dchan);
394 struct dma_slave_config *cfg = &mdev->slave_cfg;
407 spin_lock_irqsave(&mdev->lock, irqflags);
408 if (desc_cnt > mdev->desc_free_cnt) {
409 spin_unlock_irqrestore(&mdev->lock, irqflags);
410 dev_dbg(mdev->dev, "mdev %p descs are not available\n", mdev);
413 mdev->desc_free_cnt -= desc_cnt;
414 spin_unlock_irqrestore(&mdev->lock, irqflags);
421 new = msgdma_get_descriptor(mdev);
464 struct msgdma_device *mdev = to_mdev(dchan);
466 memcpy(&mdev->slave_cfg, config, sizeof(*config));
471 static void msgdma_reset(struct msgdma_device *mdev)
477 iowrite32(MSGDMA_CSR_STAT_MASK, mdev->csr + MSGDMA_CSR_STATUS);
478 iowrite32(MSGDMA_CSR_CTL_RESET, mdev->csr + MSGDMA_CSR_CONTROL);
480 ret = readl_poll_timeout(mdev->csr + MSGDMA_CSR_STATUS, val,
484 dev_err(mdev->dev, "DMA channel did not reset\n");
487 iowrite32(MSGDMA_CSR_STAT_MASK, mdev->csr + MSGDMA_CSR_STATUS);
491 MSGDMA_CSR_CTL_GLOBAL_INTR, mdev->csr + MSGDMA_CSR_CONTROL);
493 mdev->idle = true;
496 static void msgdma_copy_one(struct msgdma_device *mdev,
499 void __iomem *hw_desc = mdev->desc;
505 while (ioread32(mdev->csr + MSGDMA_CSR_STATUS) &
522 mdev->idle = false;
531 * @mdev: Pointer to the Altera mSGDMA device structure
534 static void msgdma_copy_desc_to_fifo(struct msgdma_device *mdev,
539 msgdma_copy_one(mdev, desc);
542 msgdma_copy_one(mdev, sdesc);
547 * @mdev: Pointer to the Altera mSGDMA device structure
549 static void msgdma_start_transfer(struct msgdma_device *mdev)
553 if (!mdev->idle)
556 desc = list_first_entry_or_null(&mdev->pending_list,
561 list_splice_tail_init(&mdev->pending_list, &mdev->active_list);
562 msgdma_copy_desc_to_fifo(mdev, desc);
571 struct msgdma_device *mdev = to_mdev(chan);
574 spin_lock_irqsave(&mdev->lock, flags);
575 msgdma_start_transfer(mdev);
576 spin_unlock_irqrestore(&mdev->lock, flags);
581 * @mdev: Pointer to the Altera mSGDMA device structure
583 static void msgdma_chan_desc_cleanup(struct msgdma_device *mdev)
587 list_for_each_entry_safe(desc, next, &mdev->done_list, node) {
594 spin_unlock(&mdev->lock);
596 spin_lock(&mdev->lock);
600 msgdma_free_descriptor(mdev, desc);
606 * @mdev: Pointer to the Altera mSGDMA device structure
608 static void msgdma_complete_descriptor(struct msgdma_device *mdev)
612 desc = list_first_entry_or_null(&mdev->active_list,
618 list_add_tail(&desc->node, &mdev->done_list);
623 * @mdev: Pointer to the Altera mSGDMA device structure
625 static void msgdma_free_descriptors(struct msgdma_device *mdev)
627 msgdma_free_desc_list(mdev, &mdev->active_list);
628 msgdma_free_desc_list(mdev, &mdev->pending_list);
629 msgdma_free_desc_list(mdev, &mdev->done_list);
638 struct msgdma_device *mdev = to_mdev(dchan);
641 spin_lock_irqsave(&mdev->lock, flags);
642 msgdma_free_descriptors(mdev);
643 spin_unlock_irqrestore(&mdev->lock, flags);
644 kfree(mdev->sw_desq);
655 struct msgdma_device *mdev = to_mdev(dchan);
659 mdev->sw_desq = kcalloc(MSGDMA_DESC_NUM, sizeof(*desc), GFP_NOWAIT);
660 if (!mdev->sw_desq)
663 mdev->idle = true;
664 mdev->desc_free_cnt = MSGDMA_DESC_NUM;
666 INIT_LIST_HEAD(&mdev->free_list);
669 desc = mdev->sw_desq + i;
670 dma_async_tx_descriptor_init(&desc->async_tx, &mdev->dmachan);
672 list_add_tail(&desc->node, &mdev->free_list);
684 struct msgdma_device *mdev = from_tasklet(mdev, t, irq_tasklet);
690 spin_lock_irqsave(&mdev->lock, flags);
692 if (mdev->resp) {
694 count = ioread32(mdev->csr + MSGDMA_CSR_RESP_FILL_LEVEL);
695 dev_dbg(mdev->dev, "%s (%d): response count=%d\n",
708 if (mdev->resp) {
709 size = ioread32(mdev->resp +
711 status = ioread32(mdev->resp +
715 msgdma_complete_descriptor(mdev);
716 msgdma_chan_desc_cleanup(mdev);
719 spin_unlock_irqrestore(&mdev->lock, flags);
731 struct msgdma_device *mdev = data;
734 status = ioread32(mdev->csr + MSGDMA_CSR_STATUS);
737 spin_lock(&mdev->lock);
738 mdev->idle = true;
739 msgdma_start_transfer(mdev);
740 spin_unlock(&mdev->lock);
743 tasklet_schedule(&mdev->irq_tasklet);
746 iowrite32(MSGDMA_CSR_STAT_IRQ, mdev->csr + MSGDMA_CSR_STATUS);
753 * @mdev: Pointer to the Altera mSGDMA device structure
755 static void msgdma_dev_remove(struct msgdma_device *mdev)
757 if (!mdev)
760 devm_free_irq(mdev->dev, mdev->irq, mdev);
761 tasklet_kill(&mdev->irq_tasklet);
762 list_del(&mdev->dmachan.device_node);
809 struct msgdma_device *mdev;
814 mdev = devm_kzalloc(&pdev->dev, sizeof(*mdev), GFP_NOWAIT);
815 if (!mdev)
818 mdev->dev = &pdev->dev;
821 ret = request_and_map(pdev, "csr", &dma_res, &mdev->csr, false);
826 ret = request_and_map(pdev, "desc", &dma_res, &mdev->desc, false);
831 ret = request_and_map(pdev, "resp", &dma_res, &mdev->resp, true);
835 platform_set_drvdata(pdev, mdev);
838 mdev->irq = platform_get_irq(pdev, 0);
839 if (mdev->irq < 0)
842 ret = devm_request_irq(&pdev->dev, mdev->irq, msgdma_irq_handler,
843 0, dev_name(&pdev->dev), mdev);
847 tasklet_setup(&mdev->irq_tasklet, msgdma_tasklet);
849 dma_cookie_init(&mdev->dmachan);
851 spin_lock_init(&mdev->lock);
853 INIT_LIST_HEAD(&mdev->active_list);
854 INIT_LIST_HEAD(&mdev->pending_list);
855 INIT_LIST_HEAD(&mdev->done_list);
856 INIT_LIST_HEAD(&mdev->free_list);
858 dma_dev = &mdev->dmadev;
887 mdev->dmachan.device = dma_dev;
888 list_add_tail(&mdev->dmachan.device_node, &dma_dev->channels);
897 msgdma_reset(mdev);
915 msgdma_dev_remove(mdev);
928 struct msgdma_device *mdev = platform_get_drvdata(pdev);
932 dma_async_device_unregister(&mdev->dmadev);
933 msgdma_dev_remove(mdev);