Lines Matching refs:cqdma

164 static struct device *cqdma2dev(struct mtk_cqdma_device *cqdma)  in cqdma2dev()  argument
166 return cqdma->ddev.dev; in cqdma2dev()
388 struct mtk_cqdma_device *cqdma = devid; in mtk_cqdma_irq() local
394 for (i = 0; i < cqdma->dma_channels; ++i, schedule_tasklet = false) { in mtk_cqdma_irq()
395 spin_lock(&cqdma->pc[i]->lock); in mtk_cqdma_irq()
396 if (mtk_dma_read(cqdma->pc[i], in mtk_cqdma_irq()
399 mtk_dma_clr(cqdma->pc[i], MTK_CQDMA_INT_FLAG, in mtk_cqdma_irq()
405 spin_unlock(&cqdma->pc[i]->lock); in mtk_cqdma_irq()
409 disable_irq_nosync(cqdma->pc[i]->irq); in mtk_cqdma_irq()
412 tasklet_schedule(&cqdma->pc[i]->tasklet); in mtk_cqdma_irq()
615 struct mtk_cqdma_device *cqdma = to_cqdma_dev(c); in mtk_cqdma_alloc_chan_resources() local
622 for (i = 0; i < cqdma->dma_channels; ++i) { in mtk_cqdma_alloc_chan_resources()
623 refcnt = refcount_read(&cqdma->pc[i]->refcnt); in mtk_cqdma_alloc_chan_resources()
625 pc = cqdma->pc[i]; in mtk_cqdma_alloc_chan_resources()
689 static int mtk_cqdma_hw_init(struct mtk_cqdma_device *cqdma) in mtk_cqdma_hw_init() argument
695 pm_runtime_enable(cqdma2dev(cqdma)); in mtk_cqdma_hw_init()
696 pm_runtime_get_sync(cqdma2dev(cqdma)); in mtk_cqdma_hw_init()
698 err = clk_prepare_enable(cqdma->clk); in mtk_cqdma_hw_init()
701 pm_runtime_put_sync(cqdma2dev(cqdma)); in mtk_cqdma_hw_init()
702 pm_runtime_disable(cqdma2dev(cqdma)); in mtk_cqdma_hw_init()
707 for (i = 0; i < cqdma->dma_channels; ++i) { in mtk_cqdma_hw_init()
708 spin_lock_irqsave(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_init()
709 if (mtk_cqdma_hard_reset(cqdma->pc[i]) < 0) { in mtk_cqdma_hw_init()
710 dev_err(cqdma2dev(cqdma), "cqdma hard reset timeout\n"); in mtk_cqdma_hw_init()
711 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_init()
713 clk_disable_unprepare(cqdma->clk); in mtk_cqdma_hw_init()
714 pm_runtime_put_sync(cqdma2dev(cqdma)); in mtk_cqdma_hw_init()
715 pm_runtime_disable(cqdma2dev(cqdma)); in mtk_cqdma_hw_init()
718 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_init()
724 static void mtk_cqdma_hw_deinit(struct mtk_cqdma_device *cqdma) in mtk_cqdma_hw_deinit() argument
730 for (i = 0; i < cqdma->dma_channels; ++i) { in mtk_cqdma_hw_deinit()
731 spin_lock_irqsave(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_deinit()
732 if (mtk_cqdma_hard_reset(cqdma->pc[i]) < 0) in mtk_cqdma_hw_deinit()
733 dev_err(cqdma2dev(cqdma), "cqdma hard reset timeout\n"); in mtk_cqdma_hw_deinit()
734 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_hw_deinit()
737 clk_disable_unprepare(cqdma->clk); in mtk_cqdma_hw_deinit()
739 pm_runtime_put_sync(cqdma2dev(cqdma)); in mtk_cqdma_hw_deinit()
740 pm_runtime_disable(cqdma2dev(cqdma)); in mtk_cqdma_hw_deinit()
751 struct mtk_cqdma_device *cqdma; in mtk_cqdma_probe() local
757 cqdma = devm_kzalloc(&pdev->dev, sizeof(*cqdma), GFP_KERNEL); in mtk_cqdma_probe()
758 if (!cqdma) in mtk_cqdma_probe()
761 dd = &cqdma->ddev; in mtk_cqdma_probe()
763 cqdma->clk = devm_clk_get(&pdev->dev, "cqdma"); in mtk_cqdma_probe()
764 if (IS_ERR(cqdma->clk)) { in mtk_cqdma_probe()
767 return PTR_ERR(cqdma->clk); in mtk_cqdma_probe()
788 &cqdma->dma_requests)) { in mtk_cqdma_probe()
793 cqdma->dma_requests = MTK_CQDMA_NR_VCHANS; in mtk_cqdma_probe()
798 &cqdma->dma_channels)) { in mtk_cqdma_probe()
803 cqdma->dma_channels = MTK_CQDMA_NR_PCHANS; in mtk_cqdma_probe()
806 cqdma->pc = devm_kcalloc(&pdev->dev, cqdma->dma_channels, in mtk_cqdma_probe()
807 sizeof(*cqdma->pc), GFP_KERNEL); in mtk_cqdma_probe()
808 if (!cqdma->pc) in mtk_cqdma_probe()
812 for (i = 0; i < cqdma->dma_channels; ++i) { in mtk_cqdma_probe()
813 cqdma->pc[i] = devm_kcalloc(&pdev->dev, 1, in mtk_cqdma_probe()
814 sizeof(**cqdma->pc), GFP_KERNEL); in mtk_cqdma_probe()
815 if (!cqdma->pc[i]) in mtk_cqdma_probe()
818 INIT_LIST_HEAD(&cqdma->pc[i]->queue); in mtk_cqdma_probe()
819 spin_lock_init(&cqdma->pc[i]->lock); in mtk_cqdma_probe()
820 refcount_set(&cqdma->pc[i]->refcnt, 0); in mtk_cqdma_probe()
821 cqdma->pc[i]->base = devm_platform_ioremap_resource(pdev, i); in mtk_cqdma_probe()
822 if (IS_ERR(cqdma->pc[i]->base)) in mtk_cqdma_probe()
823 return PTR_ERR(cqdma->pc[i]->base); in mtk_cqdma_probe()
829 cqdma->pc[i]->irq = err; in mtk_cqdma_probe()
831 err = devm_request_irq(&pdev->dev, cqdma->pc[i]->irq, in mtk_cqdma_probe()
833 cqdma); in mtk_cqdma_probe()
842 cqdma->vc = devm_kcalloc(&pdev->dev, cqdma->dma_requests, in mtk_cqdma_probe()
843 sizeof(*cqdma->vc), GFP_KERNEL); in mtk_cqdma_probe()
844 if (!cqdma->vc) in mtk_cqdma_probe()
847 for (i = 0; i < cqdma->dma_requests; i++) { in mtk_cqdma_probe()
848 vc = &cqdma->vc[i]; in mtk_cqdma_probe()
859 of_dma_xlate_by_chan_id, cqdma); in mtk_cqdma_probe()
866 err = mtk_cqdma_hw_init(cqdma); in mtk_cqdma_probe()
873 platform_set_drvdata(pdev, cqdma); in mtk_cqdma_probe()
876 for (i = 0; i < cqdma->dma_channels; ++i) in mtk_cqdma_probe()
877 tasklet_setup(&cqdma->pc[i]->tasklet, mtk_cqdma_tasklet_cb); in mtk_cqdma_probe()
891 struct mtk_cqdma_device *cqdma = platform_get_drvdata(pdev); in mtk_cqdma_remove() local
897 for (i = 0; i < cqdma->dma_requests; i++) { in mtk_cqdma_remove()
898 vc = &cqdma->vc[i]; in mtk_cqdma_remove()
905 for (i = 0; i < cqdma->dma_channels; i++) { in mtk_cqdma_remove()
906 spin_lock_irqsave(&cqdma->pc[i]->lock, flags); in mtk_cqdma_remove()
907 mtk_dma_clr(cqdma->pc[i], MTK_CQDMA_INT_EN, in mtk_cqdma_remove()
909 spin_unlock_irqrestore(&cqdma->pc[i]->lock, flags); in mtk_cqdma_remove()
912 synchronize_irq(cqdma->pc[i]->irq); in mtk_cqdma_remove()
914 tasklet_kill(&cqdma->pc[i]->tasklet); in mtk_cqdma_remove()
918 mtk_cqdma_hw_deinit(cqdma); in mtk_cqdma_remove()
920 dma_async_device_unregister(&cqdma->ddev); in mtk_cqdma_remove()