Lines Matching refs:mdev
205 * @mdev: Pointer to the Altera mSGDMA device structure
209 static struct msgdma_sw_desc *msgdma_get_descriptor(struct msgdma_device *mdev)
214 spin_lock_irqsave(&mdev->lock, flags);
215 desc = list_first_entry(&mdev->free_list, struct msgdma_sw_desc, node);
217 spin_unlock_irqrestore(&mdev->lock, flags);
226 * @mdev: Pointer to the Altera mSGDMA device structure
229 static void msgdma_free_descriptor(struct msgdma_device *mdev,
234 mdev->desc_free_cnt++;
235 list_add_tail(&desc->node, &mdev->free_list);
237 mdev->desc_free_cnt++;
238 list_move_tail(&child->node, &mdev->free_list);
244 * @mdev: Pointer to the Altera mSGDMA device structure
247 static void msgdma_free_desc_list(struct msgdma_device *mdev,
253 msgdma_free_descriptor(mdev, desc);
305 struct msgdma_device *mdev = to_mdev(tx->chan);
311 spin_lock_irqsave(&mdev->lock, flags);
314 list_add_tail(&new->node, &mdev->pending_list);
315 spin_unlock_irqrestore(&mdev->lock, flags);
334 struct msgdma_device *mdev = to_mdev(dchan);
343 spin_lock_irqsave(&mdev->lock, irqflags);
344 if (desc_cnt > mdev->desc_free_cnt) {
345 spin_unlock_irqrestore(&mdev->lock, irqflags);
346 dev_dbg(mdev->dev, "mdev %p descs are not available\n", mdev);
349 mdev->desc_free_cnt -= desc_cnt;
350 spin_unlock_irqrestore(&mdev->lock, irqflags);
354 new = msgdma_get_descriptor(mdev);
392 struct msgdma_device *mdev = to_mdev(dchan);
393 struct dma_slave_config *cfg = &mdev->slave_cfg;
406 spin_lock_irqsave(&mdev->lock, irqflags);
407 if (desc_cnt > mdev->desc_free_cnt) {
408 spin_unlock_irqrestore(&mdev->lock, irqflags);
409 dev_dbg(mdev->dev, "mdev %p descs are not available\n", mdev);
412 mdev->desc_free_cnt -= desc_cnt;
413 spin_unlock_irqrestore(&mdev->lock, irqflags);
420 new = msgdma_get_descriptor(mdev);
463 struct msgdma_device *mdev = to_mdev(dchan);
465 memcpy(&mdev->slave_cfg, config, sizeof(*config));
470 static void msgdma_reset(struct msgdma_device *mdev)
476 iowrite32(MSGDMA_CSR_STAT_MASK, mdev->csr + MSGDMA_CSR_STATUS);
477 iowrite32(MSGDMA_CSR_CTL_RESET, mdev->csr + MSGDMA_CSR_CONTROL);
479 ret = readl_poll_timeout(mdev->csr + MSGDMA_CSR_STATUS, val,
483 dev_err(mdev->dev, "DMA channel did not reset\n");
486 iowrite32(MSGDMA_CSR_STAT_MASK, mdev->csr + MSGDMA_CSR_STATUS);
490 MSGDMA_CSR_CTL_GLOBAL_INTR, mdev->csr + MSGDMA_CSR_CONTROL);
492 mdev->idle = true;
495 static void msgdma_copy_one(struct msgdma_device *mdev,
498 void __iomem *hw_desc = mdev->desc;
504 while (ioread32(mdev->csr + MSGDMA_CSR_STATUS) &
521 mdev->idle = false;
530 * @mdev: Pointer to the Altera mSGDMA device structure
533 static void msgdma_copy_desc_to_fifo(struct msgdma_device *mdev,
538 msgdma_copy_one(mdev, desc);
541 msgdma_copy_one(mdev, sdesc);
546 * @mdev: Pointer to the Altera mSGDMA device structure
548 static void msgdma_start_transfer(struct msgdma_device *mdev)
552 if (!mdev->idle)
555 desc = list_first_entry_or_null(&mdev->pending_list,
560 list_splice_tail_init(&mdev->pending_list, &mdev->active_list);
561 msgdma_copy_desc_to_fifo(mdev, desc);
570 struct msgdma_device *mdev = to_mdev(chan);
573 spin_lock_irqsave(&mdev->lock, flags);
574 msgdma_start_transfer(mdev);
575 spin_unlock_irqrestore(&mdev->lock, flags);
580 * @mdev: Pointer to the Altera mSGDMA device structure
582 static void msgdma_chan_desc_cleanup(struct msgdma_device *mdev)
586 list_for_each_entry_safe(desc, next, &mdev->done_list, node) {
595 spin_unlock(&mdev->lock);
597 spin_lock(&mdev->lock);
601 msgdma_free_descriptor(mdev, desc);
607 * @mdev: Pointer to the Altera mSGDMA device structure
609 static void msgdma_complete_descriptor(struct msgdma_device *mdev)
613 desc = list_first_entry_or_null(&mdev->active_list,
619 list_add_tail(&desc->node, &mdev->done_list);
624 * @mdev: Pointer to the Altera mSGDMA device structure
626 static void msgdma_free_descriptors(struct msgdma_device *mdev)
628 msgdma_free_desc_list(mdev, &mdev->active_list);
629 msgdma_free_desc_list(mdev, &mdev->pending_list);
630 msgdma_free_desc_list(mdev, &mdev->done_list);
639 struct msgdma_device *mdev = to_mdev(dchan);
642 spin_lock_irqsave(&mdev->lock, flags);
643 msgdma_free_descriptors(mdev);
644 spin_unlock_irqrestore(&mdev->lock, flags);
645 kfree(mdev->sw_desq);
656 struct msgdma_device *mdev = to_mdev(dchan);
660 mdev->sw_desq = kcalloc(MSGDMA_DESC_NUM, sizeof(*desc), GFP_NOWAIT);
661 if (!mdev->sw_desq)
664 mdev->idle = true;
665 mdev->desc_free_cnt = MSGDMA_DESC_NUM;
667 INIT_LIST_HEAD(&mdev->free_list);
670 desc = mdev->sw_desq + i;
671 dma_async_tx_descriptor_init(&desc->async_tx, &mdev->dmachan);
673 list_add_tail(&desc->node, &mdev->free_list);
685 struct msgdma_device *mdev = from_tasklet(mdev, t, irq_tasklet);
691 spin_lock_irqsave(&mdev->lock, flags);
694 count = ioread32(mdev->csr + MSGDMA_CSR_RESP_FILL_LEVEL);
695 dev_dbg(mdev->dev, "%s (%d): response count=%d\n",
705 size = ioread32(mdev->resp + MSGDMA_RESP_BYTES_TRANSFERRED);
706 status = ioread32(mdev->resp + MSGDMA_RESP_STATUS);
708 msgdma_complete_descriptor(mdev);
709 msgdma_chan_desc_cleanup(mdev);
712 spin_unlock_irqrestore(&mdev->lock, flags);
724 struct msgdma_device *mdev = data;
727 status = ioread32(mdev->csr + MSGDMA_CSR_STATUS);
730 spin_lock(&mdev->lock);
731 mdev->idle = true;
732 msgdma_start_transfer(mdev);
733 spin_unlock(&mdev->lock);
736 tasklet_schedule(&mdev->irq_tasklet);
739 iowrite32(MSGDMA_CSR_STAT_IRQ, mdev->csr + MSGDMA_CSR_STATUS);
746 * @mdev: Pointer to the Altera mSGDMA device structure
748 static void msgdma_dev_remove(struct msgdma_device *mdev)
750 if (!mdev)
753 devm_free_irq(mdev->dev, mdev->irq, mdev);
754 tasklet_kill(&mdev->irq_tasklet);
755 list_del(&mdev->dmachan.device_node);
795 struct msgdma_device *mdev;
800 mdev = devm_kzalloc(&pdev->dev, sizeof(*mdev), GFP_NOWAIT);
801 if (!mdev)
804 mdev->dev = &pdev->dev;
807 ret = request_and_map(pdev, "csr", &dma_res, &mdev->csr);
812 ret = request_and_map(pdev, "desc", &dma_res, &mdev->desc);
817 ret = request_and_map(pdev, "resp", &dma_res, &mdev->resp);
821 platform_set_drvdata(pdev, mdev);
824 mdev->irq = platform_get_irq(pdev, 0);
825 if (mdev->irq < 0)
828 ret = devm_request_irq(&pdev->dev, mdev->irq, msgdma_irq_handler,
829 0, dev_name(&pdev->dev), mdev);
833 tasklet_setup(&mdev->irq_tasklet, msgdma_tasklet);
835 dma_cookie_init(&mdev->dmachan);
837 spin_lock_init(&mdev->lock);
839 INIT_LIST_HEAD(&mdev->active_list);
840 INIT_LIST_HEAD(&mdev->pending_list);
841 INIT_LIST_HEAD(&mdev->done_list);
842 INIT_LIST_HEAD(&mdev->free_list);
844 dma_dev = &mdev->dmadev;
873 mdev->dmachan.device = dma_dev;
874 list_add_tail(&mdev->dmachan.device_node, &dma_dev->channels);
885 msgdma_reset(mdev);
896 msgdma_dev_remove(mdev);
909 struct msgdma_device *mdev = platform_get_drvdata(pdev);
911 dma_async_device_unregister(&mdev->dmadev);
912 msgdma_dev_remove(mdev);