Lines Matching refs:dmadev
77 static inline struct hidma_dev *to_hidma_dev(struct dma_device *dmadev)
79 return container_of(dmadev, struct hidma_dev, ddev);
99 static void hidma_free(struct hidma_dev *dmadev)
101 INIT_LIST_HEAD(&dmadev->ddev.channels);
176 struct hidma_dev *dmadev = to_hidma_dev(ddev);
195 pm_runtime_mark_last_busy(dmadev->ddev.dev);
196 pm_runtime_put_autosuspend(dmadev->ddev.dev);
200 static int hidma_chan_init(struct hidma_dev *dmadev, u32 dma_sig)
205 mchan = devm_kzalloc(dmadev->ddev.dev, sizeof(*mchan), GFP_KERNEL);
209 ddev = &dmadev->ddev;
211 mchan->dmadev = dmadev;
223 dmadev->ddev.chancnt++;
229 struct hidma_dev *dmadev = from_tasklet(dmadev, t, task);
231 pm_runtime_get_sync(dmadev->ddev.dev);
232 hidma_ll_start(dmadev->lldev);
238 struct hidma_dev *dmadev = mchan->dmadev;
245 hidma_ll_queue_request(dmadev->lldev, qdesc->tre_ch);
258 status = pm_runtime_get(dmadev->ddev.dev);
260 tasklet_schedule(&dmadev->task);
262 hidma_ll_start(dmadev->lldev);
320 struct hidma_dev *dmadev = mchan->dmadev;
325 pm_runtime_get_sync(dmadev->ddev.dev);
326 if (!hidma_ll_isenabled(dmadev->lldev)) {
327 pm_runtime_mark_last_busy(dmadev->ddev.dev);
328 pm_runtime_put_autosuspend(dmadev->ddev.dev);
331 pm_runtime_mark_last_busy(dmadev->ddev.dev);
332 pm_runtime_put_autosuspend(dmadev->ddev.dev);
351 struct hidma_dev *dmadev = mchan->dmadev;
362 for (i = 0; i < dmadev->nr_descriptors; i++) {
371 rc = hidma_ll_request(dmadev->lldev, mchan->dma_sig,
386 hidma_ll_free(dmadev->lldev, mdesc->tre_ch);
405 struct hidma_dev *mdma = mchan->dmadev;
438 struct hidma_dev *mdma = mchan->dmadev;
468 struct hidma_dev *dmadev = to_hidma_dev(mchan->chan.device);
474 pm_runtime_get_sync(dmadev->ddev.dev);
487 rc = hidma_ll_disable(dmadev->lldev);
489 dev_err(dmadev->ddev.dev, "channel did not pause\n");
505 rc = hidma_ll_enable(dmadev->lldev);
507 pm_runtime_mark_last_busy(dmadev->ddev.dev);
508 pm_runtime_put_autosuspend(dmadev->ddev.dev);
515 struct hidma_dev *dmadev = to_hidma_dev(mchan->chan.device);
523 pm_runtime_get_sync(dmadev->ddev.dev);
524 rc = hidma_ll_setup(dmadev->lldev);
525 pm_runtime_mark_last_busy(dmadev->ddev.dev);
526 pm_runtime_put_autosuspend(dmadev->ddev.dev);
533 struct hidma_dev *mdma = mchan->dmadev;
560 struct hidma_dev *dmadev;
563 dmadev = to_hidma_dev(mchan->chan.device);
565 pm_runtime_get_sync(dmadev->ddev.dev);
566 if (hidma_ll_disable(dmadev->lldev))
567 dev_warn(dmadev->ddev.dev, "channel did not stop\n");
569 pm_runtime_mark_last_busy(dmadev->ddev.dev);
570 pm_runtime_put_autosuspend(dmadev->ddev.dev);
578 struct hidma_dev *dmadev;
582 dmadev = to_hidma_dev(mchan->chan.device);
584 pm_runtime_get_sync(dmadev->ddev.dev);
585 rc = hidma_ll_enable(dmadev->lldev);
589 dev_err(dmadev->ddev.dev,
591 pm_runtime_mark_last_busy(dmadev->ddev.dev);
592 pm_runtime_put_autosuspend(dmadev->ddev.dev);
612 struct hidma_dev *dmadev = to_hidma_dev_from_lldev(lldevp);
615 1 << (chirq - dmadev->msi_virqbase));
673 struct hidma_dev *dmadev = dev_get_drvdata(dev);
676 writel(msg->address_lo, dmadev->dev_evca + 0x118);
677 writel(msg->address_hi, dmadev->dev_evca + 0x11C);
678 writel(msg->data, dmadev->dev_evca + 0x120);
683 static void hidma_free_msis(struct hidma_dev *dmadev)
686 struct device *dev = dmadev->ddev.dev;
691 devm_free_irq(dev, desc->irq, &dmadev->lldev);
697 static int hidma_request_msi(struct hidma_dev *dmadev,
712 dmadev->msi_virqbase = desc->irq;
717 &dmadev->lldev);
730 &dmadev->lldev);
734 hidma_ll_setup_irq(dmadev->lldev, true);
756 struct hidma_dev *dmadev;
794 dmadev = devm_kzalloc(&pdev->dev, sizeof(*dmadev), GFP_KERNEL);
795 if (!dmadev) {
800 INIT_LIST_HEAD(&dmadev->ddev.channels);
801 spin_lock_init(&dmadev->lock);
802 dmadev->ddev.dev = &pdev->dev;
803 pm_runtime_get_sync(dmadev->ddev.dev);
805 dma_cap_set(DMA_MEMCPY, dmadev->ddev.cap_mask);
806 dma_cap_set(DMA_MEMSET, dmadev->ddev.cap_mask);
812 dmadev->dev_evca = evca;
813 dmadev->evca_resource = evca_resource;
814 dmadev->dev_trca = trca;
815 dmadev->trca_resource = trca_resource;
816 dmadev->ddev.device_prep_dma_memcpy = hidma_prep_dma_memcpy;
817 dmadev->ddev.device_prep_dma_memset = hidma_prep_dma_memset;
818 dmadev->ddev.device_alloc_chan_resources = hidma_alloc_chan_resources;
819 dmadev->ddev.device_free_chan_resources = hidma_free_chan_resources;
820 dmadev->ddev.device_tx_status = hidma_tx_status;
821 dmadev->ddev.device_issue_pending = hidma_issue_pending;
822 dmadev->ddev.device_pause = hidma_pause;
823 dmadev->ddev.device_resume = hidma_resume;
824 dmadev->ddev.device_terminate_all = hidma_terminate_all;
825 dmadev->ddev.copy_align = 8;
833 &dmadev->nr_descriptors);
838 dmadev->nr_descriptors = nr_desc_prm;
841 if (!dmadev->nr_descriptors)
842 dmadev->nr_descriptors = HIDMA_NR_DEFAULT_DESC;
845 dmadev->chidx = readl(dmadev->dev_trca + 0x40);
847 dmadev->chidx = readl(dmadev->dev_trca + 0x28);
858 dmadev->lldev = hidma_ll_init(dmadev->ddev.dev,
859 dmadev->nr_descriptors, dmadev->dev_trca,
860 dmadev->dev_evca, dmadev->chidx);
861 if (!dmadev->lldev) {
866 platform_set_drvdata(pdev, dmadev);
868 rc = hidma_request_msi(dmadev, pdev);
871 hidma_ll_setup_irq(dmadev->lldev, false);
873 0, "qcom-hidma", dmadev->lldev);
878 INIT_LIST_HEAD(&dmadev->ddev.channels);
879 rc = hidma_chan_init(dmadev, 0);
883 rc = dma_async_device_register(&dmadev->ddev);
887 dmadev->irq = chirq;
888 tasklet_setup(&dmadev->task, hidma_issue_task);
889 hidma_debug_init(dmadev);
890 hidma_sysfs_init(dmadev);
892 pm_runtime_mark_last_busy(dmadev->ddev.dev);
893 pm_runtime_put_autosuspend(dmadev->ddev.dev);
898 hidma_free_msis(dmadev);
900 hidma_ll_uninit(dmadev->lldev);
902 if (dmadev)
903 hidma_free(dmadev);
912 struct hidma_dev *dmadev = platform_get_drvdata(pdev);
914 dev_info(dmadev->ddev.dev, "HI-DMA engine shutdown\n");
916 pm_runtime_get_sync(dmadev->ddev.dev);
917 if (hidma_ll_disable(dmadev->lldev))
918 dev_warn(dmadev->ddev.dev, "channel did not stop\n");
919 pm_runtime_mark_last_busy(dmadev->ddev.dev);
920 pm_runtime_put_autosuspend(dmadev->ddev.dev);
926 struct hidma_dev *dmadev = platform_get_drvdata(pdev);
928 pm_runtime_get_sync(dmadev->ddev.dev);
929 dma_async_device_unregister(&dmadev->ddev);
930 if (!dmadev->lldev->msi_support)
931 devm_free_irq(dmadev->ddev.dev, dmadev->irq, dmadev->lldev);
933 hidma_free_msis(dmadev);
935 tasklet_kill(&dmadev->task);
936 hidma_sysfs_uninit(dmadev);
937 hidma_debug_uninit(dmadev);
938 hidma_ll_uninit(dmadev->lldev);
939 hidma_free(dmadev);