fsl_qdma 296 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma = fsl_chan->qdma; fsl_qdma 337 drivers/dma/fsl-qdma.c fsl_qdma->desc_allocated--; fsl_qdma 471 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma) fsl_qdma 478 drivers/dma/fsl-qdma.c queue_num = fsl_qdma->n_queues; fsl_qdma 479 drivers/dma/fsl-qdma.c block_number = fsl_qdma->block_number; fsl_qdma 512 drivers/dma/fsl-qdma.c queue_temp->block_base = fsl_qdma->block_base + fsl_qdma 513 drivers/dma/fsl-qdma.c FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, j); fsl_qdma 571 drivers/dma/fsl-qdma.c static int fsl_qdma_halt(struct fsl_qdma_engine *fsl_qdma) fsl_qdma 575 drivers/dma/fsl-qdma.c void __iomem *block, *ctrl = fsl_qdma->ctrl_base; fsl_qdma 578 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, ctrl + FSL_QDMA_DMR); fsl_qdma 580 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, ctrl + FSL_QDMA_DMR); fsl_qdma 581 drivers/dma/fsl-qdma.c for (j = 0; j < fsl_qdma->block_number; j++) { fsl_qdma 582 drivers/dma/fsl-qdma.c block = fsl_qdma->block_base + fsl_qdma 583 drivers/dma/fsl-qdma.c FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, j); fsl_qdma 585 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, 0, block + FSL_QDMA_BCQMR(i)); fsl_qdma 588 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, ctrl + FSL_QDMA_DSR); fsl_qdma 596 drivers/dma/fsl-qdma.c for (j = 0; j < fsl_qdma->block_number; j++) { fsl_qdma 597 drivers/dma/fsl-qdma.c block = fsl_qdma->block_base + fsl_qdma 598 drivers/dma/fsl-qdma.c FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, j); fsl_qdma 601 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, 0, block + FSL_QDMA_BSQMR); fsl_qdma 607 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_BCQIDR_CLEAR, fsl_qdma 615 drivers/dma/fsl-qdma.c fsl_qdma_queue_transfer_complete(struct fsl_qdma_engine *fsl_qdma, fsl_qdma 624 drivers/dma/fsl-qdma.c struct fsl_qdma_queue *fsl_queue = fsl_qdma->queue; fsl_qdma 625 drivers/dma/fsl-qdma.c struct fsl_qdma_queue *fsl_status = fsl_qdma->status[id]; fsl_qdma 631 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, block + FSL_QDMA_BSQSR); fsl_qdma 643 drivers/dma/fsl-qdma.c id * fsl_qdma->n_queues; fsl_qdma 667 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, block + FSL_QDMA_BSQMR); fsl_qdma 674 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, block + FSL_QDMA_BSQMR); fsl_qdma 680 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, block + FSL_QDMA_BSQMR); fsl_qdma 686 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, block + FSL_QDMA_BSQMR); fsl_qdma 701 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma = dev_id; fsl_qdma 702 drivers/dma/fsl-qdma.c void __iomem *status = fsl_qdma->status_base; fsl_qdma 704 drivers/dma/fsl-qdma.c intr = qdma_readl(fsl_qdma, status + FSL_QDMA_DEDR); fsl_qdma 707 drivers/dma/fsl-qdma.c dev_err(fsl_qdma->dma_dev.dev, "DMA transaction error!\n"); fsl_qdma 709 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_DEDR_CLEAR, status + FSL_QDMA_DEDR); fsl_qdma 717 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma = dev_id; fsl_qdma 718 drivers/dma/fsl-qdma.c void __iomem *block, *ctrl = fsl_qdma->ctrl_base; fsl_qdma 720 drivers/dma/fsl-qdma.c id = irq - fsl_qdma->irq_base; fsl_qdma 721 drivers/dma/fsl-qdma.c if (id < 0 && id > fsl_qdma->block_number) { fsl_qdma 722 drivers/dma/fsl-qdma.c dev_err(fsl_qdma->dma_dev.dev, fsl_qdma 724 drivers/dma/fsl-qdma.c irq, fsl_qdma->irq_base); fsl_qdma 727 drivers/dma/fsl-qdma.c block = fsl_qdma->block_base + fsl_qdma 728 drivers/dma/fsl-qdma.c FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, id); fsl_qdma 730 drivers/dma/fsl-qdma.c intr = qdma_readl(fsl_qdma, block + FSL_QDMA_BCQIDR(0)); fsl_qdma 733 drivers/dma/fsl-qdma.c intr = fsl_qdma_queue_transfer_complete(fsl_qdma, block, id); fsl_qdma 736 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, ctrl + FSL_QDMA_DMR); fsl_qdma 738 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, ctrl + FSL_QDMA_DMR); fsl_qdma 739 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, 0, block + FSL_QDMA_BCQIER(0)); fsl_qdma 740 drivers/dma/fsl-qdma.c dev_err(fsl_qdma->dma_dev.dev, "QDMA: status err!\n"); fsl_qdma 744 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_BCQIDR_CLEAR, fsl_qdma 752 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma) fsl_qdma 759 drivers/dma/fsl-qdma.c fsl_qdma->error_irq = fsl_qdma 761 drivers/dma/fsl-qdma.c if (fsl_qdma->error_irq < 0) fsl_qdma 762 drivers/dma/fsl-qdma.c return fsl_qdma->error_irq; fsl_qdma 764 drivers/dma/fsl-qdma.c ret = devm_request_irq(&pdev->dev, fsl_qdma->error_irq, fsl_qdma 766 drivers/dma/fsl-qdma.c "qDMA error", fsl_qdma); fsl_qdma 772 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->block_number; i++) { fsl_qdma 774 drivers/dma/fsl-qdma.c fsl_qdma->queue_irq[i] = fsl_qdma 777 drivers/dma/fsl-qdma.c if (fsl_qdma->queue_irq[i] < 0) fsl_qdma 778 drivers/dma/fsl-qdma.c return fsl_qdma->queue_irq[i]; fsl_qdma 781 drivers/dma/fsl-qdma.c fsl_qdma->queue_irq[i], fsl_qdma 785 drivers/dma/fsl-qdma.c fsl_qdma); fsl_qdma 793 drivers/dma/fsl-qdma.c ret = irq_set_affinity_hint(fsl_qdma->queue_irq[i], fsl_qdma 799 drivers/dma/fsl-qdma.c fsl_qdma->queue_irq[i]); fsl_qdma 808 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma) fsl_qdma 812 drivers/dma/fsl-qdma.c devm_free_irq(&pdev->dev, fsl_qdma->error_irq, fsl_qdma); fsl_qdma 813 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->block_number; i++) fsl_qdma 814 drivers/dma/fsl-qdma.c devm_free_irq(&pdev->dev, fsl_qdma->queue_irq[i], fsl_qdma); fsl_qdma 817 drivers/dma/fsl-qdma.c static int fsl_qdma_reg_init(struct fsl_qdma_engine *fsl_qdma) fsl_qdma 822 drivers/dma/fsl-qdma.c void __iomem *status = fsl_qdma->status_base; fsl_qdma 823 drivers/dma/fsl-qdma.c void __iomem *block, *ctrl = fsl_qdma->ctrl_base; fsl_qdma 824 drivers/dma/fsl-qdma.c struct fsl_qdma_queue *fsl_queue = fsl_qdma->queue; fsl_qdma 827 drivers/dma/fsl-qdma.c ret = fsl_qdma_halt(fsl_qdma); fsl_qdma 829 drivers/dma/fsl-qdma.c dev_err(fsl_qdma->dma_dev.dev, "DMA halt failed!"); fsl_qdma 833 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->block_number; i++) { fsl_qdma 839 drivers/dma/fsl-qdma.c block = fsl_qdma->block_base + fsl_qdma 840 drivers/dma/fsl-qdma.c FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, i); fsl_qdma 841 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_BCQIDR_CLEAR, fsl_qdma 845 drivers/dma/fsl-qdma.c for (j = 0; j < fsl_qdma->block_number; j++) { fsl_qdma 846 drivers/dma/fsl-qdma.c block = fsl_qdma->block_base + fsl_qdma 847 drivers/dma/fsl-qdma.c FSL_QDMA_BLOCK_BASE_OFFSET(fsl_qdma, j); fsl_qdma 848 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->n_queues; i++) { fsl_qdma 849 drivers/dma/fsl-qdma.c temp = fsl_queue + i + (j * fsl_qdma->n_queues); fsl_qdma 858 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, temp->bus_addr, fsl_qdma 860 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, temp->bus_addr, fsl_qdma 867 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, block + FSL_QDMA_BCQMR(i)); fsl_qdma 876 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_SQCCMR_ENTER_WM, fsl_qdma 886 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, fsl_qdma->status[j]->bus_addr, fsl_qdma 888 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, fsl_qdma->status[j]->bus_addr, fsl_qdma 891 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_BCQIER_CQTIE, fsl_qdma 893 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_BSQICR_ICEN | fsl_qdma 896 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_CQIER_MEIE | fsl_qdma 903 drivers/dma/fsl-qdma.c (fsl_qdma->status[j]->n_cq) - 6); fsl_qdma 905 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, block + FSL_QDMA_BSQMR); fsl_qdma 906 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, block + FSL_QDMA_BSQMR); fsl_qdma 910 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_DEDR_CLEAR, status + FSL_QDMA_DEDR); fsl_qdma 911 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, FSL_QDMA_DEIER_CLEAR, status + FSL_QDMA_DEIER); fsl_qdma 913 drivers/dma/fsl-qdma.c reg = qdma_readl(fsl_qdma, ctrl + FSL_QDMA_DMR); fsl_qdma 915 drivers/dma/fsl-qdma.c qdma_writel(fsl_qdma, reg, ctrl + FSL_QDMA_DMR); fsl_qdma 1019 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma = fsl_chan->qdma; fsl_qdma 1023 drivers/dma/fsl-qdma.c return fsl_qdma->desc_allocated; fsl_qdma 1056 drivers/dma/fsl-qdma.c fsl_qdma->desc_allocated++; fsl_qdma 1057 drivers/dma/fsl-qdma.c return fsl_qdma->desc_allocated; fsl_qdma 1073 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma; fsl_qdma 1096 drivers/dma/fsl-qdma.c len = sizeof(*fsl_qdma); fsl_qdma 1097 drivers/dma/fsl-qdma.c fsl_qdma = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); fsl_qdma 1098 drivers/dma/fsl-qdma.c if (!fsl_qdma) fsl_qdma 1102 drivers/dma/fsl-qdma.c fsl_qdma->chans = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); fsl_qdma 1103 drivers/dma/fsl-qdma.c if (!fsl_qdma->chans) fsl_qdma 1107 drivers/dma/fsl-qdma.c fsl_qdma->status = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); fsl_qdma 1108 drivers/dma/fsl-qdma.c if (!fsl_qdma->status) fsl_qdma 1112 drivers/dma/fsl-qdma.c fsl_qdma->queue_irq = devm_kzalloc(&pdev->dev, len, GFP_KERNEL); fsl_qdma 1113 drivers/dma/fsl-qdma.c if (!fsl_qdma->queue_irq) fsl_qdma 1122 drivers/dma/fsl-qdma.c fsl_qdma->desc_allocated = 0; fsl_qdma 1123 drivers/dma/fsl-qdma.c fsl_qdma->n_chans = chans; fsl_qdma 1124 drivers/dma/fsl-qdma.c fsl_qdma->n_queues = queues; fsl_qdma 1125 drivers/dma/fsl-qdma.c fsl_qdma->block_number = blk_num; fsl_qdma 1126 drivers/dma/fsl-qdma.c fsl_qdma->block_offset = blk_off; fsl_qdma 1128 drivers/dma/fsl-qdma.c mutex_init(&fsl_qdma->fsl_qdma_mutex); fsl_qdma 1130 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->block_number; i++) { fsl_qdma 1131 drivers/dma/fsl-qdma.c fsl_qdma->status[i] = fsl_qdma_prep_status_queue(pdev); fsl_qdma 1132 drivers/dma/fsl-qdma.c if (!fsl_qdma->status[i]) fsl_qdma 1136 drivers/dma/fsl-qdma.c fsl_qdma->ctrl_base = devm_ioremap_resource(&pdev->dev, res); fsl_qdma 1137 drivers/dma/fsl-qdma.c if (IS_ERR(fsl_qdma->ctrl_base)) fsl_qdma 1138 drivers/dma/fsl-qdma.c return PTR_ERR(fsl_qdma->ctrl_base); fsl_qdma 1141 drivers/dma/fsl-qdma.c fsl_qdma->status_base = devm_ioremap_resource(&pdev->dev, res); fsl_qdma 1142 drivers/dma/fsl-qdma.c if (IS_ERR(fsl_qdma->status_base)) fsl_qdma 1143 drivers/dma/fsl-qdma.c return PTR_ERR(fsl_qdma->status_base); fsl_qdma 1146 drivers/dma/fsl-qdma.c fsl_qdma->block_base = devm_ioremap_resource(&pdev->dev, res); fsl_qdma 1147 drivers/dma/fsl-qdma.c if (IS_ERR(fsl_qdma->block_base)) fsl_qdma 1148 drivers/dma/fsl-qdma.c return PTR_ERR(fsl_qdma->block_base); fsl_qdma 1149 drivers/dma/fsl-qdma.c fsl_qdma->queue = fsl_qdma_alloc_queue_resources(pdev, fsl_qdma); fsl_qdma 1150 drivers/dma/fsl-qdma.c if (!fsl_qdma->queue) fsl_qdma 1153 drivers/dma/fsl-qdma.c ret = fsl_qdma_irq_init(pdev, fsl_qdma); fsl_qdma 1157 drivers/dma/fsl-qdma.c fsl_qdma->irq_base = platform_get_irq_byname(pdev, "qdma-queue0"); fsl_qdma 1158 drivers/dma/fsl-qdma.c if (fsl_qdma->irq_base < 0) fsl_qdma 1159 drivers/dma/fsl-qdma.c return fsl_qdma->irq_base; fsl_qdma 1161 drivers/dma/fsl-qdma.c fsl_qdma->feature = of_property_read_bool(np, "big-endian"); fsl_qdma 1162 drivers/dma/fsl-qdma.c INIT_LIST_HEAD(&fsl_qdma->dma_dev.channels); fsl_qdma 1164 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->n_chans; i++) { fsl_qdma 1165 drivers/dma/fsl-qdma.c struct fsl_qdma_chan *fsl_chan = &fsl_qdma->chans[i]; fsl_qdma 1167 drivers/dma/fsl-qdma.c fsl_chan->qdma = fsl_qdma; fsl_qdma 1168 drivers/dma/fsl-qdma.c fsl_chan->queue = fsl_qdma->queue + i % (fsl_qdma->n_queues * fsl_qdma 1169 drivers/dma/fsl-qdma.c fsl_qdma->block_number); fsl_qdma 1171 drivers/dma/fsl-qdma.c vchan_init(&fsl_chan->vchan, &fsl_qdma->dma_dev); fsl_qdma 1174 drivers/dma/fsl-qdma.c dma_cap_set(DMA_MEMCPY, fsl_qdma->dma_dev.cap_mask); fsl_qdma 1176 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.dev = &pdev->dev; fsl_qdma 1177 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_free_chan_resources = fsl_qdma 1179 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_alloc_chan_resources = fsl_qdma 1181 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_tx_status = dma_cookie_status; fsl_qdma 1182 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_prep_dma_memcpy = fsl_qdma_prep_memcpy; fsl_qdma 1183 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_issue_pending = fsl_qdma_issue_pending; fsl_qdma 1184 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_synchronize = fsl_qdma_synchronize; fsl_qdma 1185 drivers/dma/fsl-qdma.c fsl_qdma->dma_dev.device_terminate_all = fsl_qdma_terminate_all; fsl_qdma 1189 drivers/dma/fsl-qdma.c platform_set_drvdata(pdev, fsl_qdma); fsl_qdma 1191 drivers/dma/fsl-qdma.c ret = dma_async_device_register(&fsl_qdma->dma_dev); fsl_qdma 1198 drivers/dma/fsl-qdma.c ret = fsl_qdma_reg_init(fsl_qdma); fsl_qdma 1223 drivers/dma/fsl-qdma.c struct fsl_qdma_engine *fsl_qdma = platform_get_drvdata(pdev); fsl_qdma 1225 drivers/dma/fsl-qdma.c fsl_qdma_irq_exit(pdev, fsl_qdma); fsl_qdma 1226 drivers/dma/fsl-qdma.c fsl_qdma_cleanup_vchan(&fsl_qdma->dma_dev); fsl_qdma 1228 drivers/dma/fsl-qdma.c dma_async_device_unregister(&fsl_qdma->dma_dev); fsl_qdma 1230 drivers/dma/fsl-qdma.c for (i = 0; i < fsl_qdma->block_number; i++) { fsl_qdma 1231 drivers/dma/fsl-qdma.c status = fsl_qdma->status[i];