Lines Matching full:dw
20 #include "dw-edma-core.h"
21 #include "dw-edma-v0-core.h"
22 #include "dw-hdma-v0-core.h"
35 struct dw_edma_chip *chip = chan->dw->chip; in dw_edma_get_pci_address()
67 struct dw_edma_chip *chip = desc->chan->dw->chip; in dw_edma_alloc_chunk()
176 struct dw_edma *dw = chan->dw; in dw_edma_start_transfer() local
194 dw_edma_core_start(dw, child, !desc->xfer_sz); in dw_edma_start_transfer()
209 if (chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) { in dw_edma_device_caps()
378 * If eDMA is embedded into the DW PCIe RP/EP and controlled from the in dw_edma_device_transfer()
393 if (chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) { in dw_edma_device_transfer()
699 static int dw_edma_channel_setup(struct dw_edma *dw, u32 wr_alloc, u32 rd_alloc) in dw_edma_channel_setup() argument
701 struct dw_edma_chip *chip = dw->chip; in dw_edma_channel_setup()
709 ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt; in dw_edma_channel_setup()
710 dma = &dw->dma; in dw_edma_channel_setup()
715 chan = &dw->chan[i]; in dw_edma_channel_setup()
717 chan->dw = dw; in dw_edma_channel_setup()
719 if (i < dw->wr_ch_cnt) { in dw_edma_channel_setup()
723 chan->id = i - dw->wr_ch_cnt; in dw_edma_channel_setup()
741 if (dw->nr_irqs == 1) in dw_edma_channel_setup()
748 irq = &dw->irq[pos]; in dw_edma_channel_setup()
755 irq->dw = dw; in dw_edma_channel_setup()
766 &dw->chip->dt_region_wr[chan->id] : in dw_edma_channel_setup()
767 &dw->chip->dt_region_rd[chan->id]; in dw_edma_channel_setup()
820 static int dw_edma_irq_request(struct dw_edma *dw, in dw_edma_irq_request() argument
823 struct dw_edma_chip *chip = dw->chip; in dw_edma_irq_request()
824 struct device *dev = dw->chip->dev; in dw_edma_irq_request()
831 ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt; in dw_edma_irq_request()
836 dw->irq = devm_kcalloc(dev, chip->nr_irqs, sizeof(*dw->irq), GFP_KERNEL); in dw_edma_irq_request()
837 if (!dw->irq) in dw_edma_irq_request()
844 IRQF_SHARED, dw->name, &dw->irq[0]); in dw_edma_irq_request()
846 dw->nr_irqs = 0; in dw_edma_irq_request()
851 get_cached_msi_msg(irq, &dw->irq[0].msi); in dw_edma_irq_request()
853 dw->nr_irqs = 1; in dw_edma_irq_request()
859 dw_edma_dec_irq_alloc(&tmp, wr_alloc, dw->wr_ch_cnt); in dw_edma_irq_request()
860 dw_edma_dec_irq_alloc(&tmp, rd_alloc, dw->rd_ch_cnt); in dw_edma_irq_request()
863 dw_edma_add_irq_mask(&wr_mask, *wr_alloc, dw->wr_ch_cnt); in dw_edma_irq_request()
864 dw_edma_add_irq_mask(&rd_mask, *rd_alloc, dw->rd_ch_cnt); in dw_edma_irq_request()
872 IRQF_SHARED, dw->name, in dw_edma_irq_request()
873 &dw->irq[i]); in dw_edma_irq_request()
878 get_cached_msi_msg(irq, &dw->irq[i].msi); in dw_edma_irq_request()
881 dw->nr_irqs = i; in dw_edma_irq_request()
889 free_irq(irq, &dw->irq[i]); in dw_edma_irq_request()
898 struct dw_edma *dw; in dw_edma_probe() local
910 dw = devm_kzalloc(dev, sizeof(*dw), GFP_KERNEL); in dw_edma_probe()
911 if (!dw) in dw_edma_probe()
914 dw->chip = chip; in dw_edma_probe()
916 if (dw->chip->mf == EDMA_MF_HDMA_NATIVE) in dw_edma_probe()
917 dw_hdma_v0_core_register(dw); in dw_edma_probe()
919 dw_edma_v0_core_register(dw); in dw_edma_probe()
921 raw_spin_lock_init(&dw->lock); in dw_edma_probe()
923 dw->wr_ch_cnt = min_t(u16, chip->ll_wr_cnt, in dw_edma_probe()
924 dw_edma_core_ch_count(dw, EDMA_DIR_WRITE)); in dw_edma_probe()
925 dw->wr_ch_cnt = min_t(u16, dw->wr_ch_cnt, EDMA_MAX_WR_CH); in dw_edma_probe()
927 dw->rd_ch_cnt = min_t(u16, chip->ll_rd_cnt, in dw_edma_probe()
928 dw_edma_core_ch_count(dw, EDMA_DIR_READ)); in dw_edma_probe()
929 dw->rd_ch_cnt = min_t(u16, dw->rd_ch_cnt, EDMA_MAX_RD_CH); in dw_edma_probe()
931 if (!dw->wr_ch_cnt && !dw->rd_ch_cnt) in dw_edma_probe()
935 dw->wr_ch_cnt, dw->rd_ch_cnt); in dw_edma_probe()
938 dw->chan = devm_kcalloc(dev, dw->wr_ch_cnt + dw->rd_ch_cnt, in dw_edma_probe()
939 sizeof(*dw->chan), GFP_KERNEL); in dw_edma_probe()
940 if (!dw->chan) in dw_edma_probe()
943 snprintf(dw->name, sizeof(dw->name), "dw-edma-core:%s", in dw_edma_probe()
947 dw_edma_core_off(dw); in dw_edma_probe()
950 err = dw_edma_irq_request(dw, &wr_alloc, &rd_alloc); in dw_edma_probe()
955 err = dw_edma_channel_setup(dw, wr_alloc, rd_alloc); in dw_edma_probe()
960 dw_edma_core_debugfs_on(dw); in dw_edma_probe()
962 chip->dw = dw; in dw_edma_probe()
967 for (i = (dw->nr_irqs - 1); i >= 0; i--) in dw_edma_probe()
968 free_irq(chip->ops->irq_vector(dev, i), &dw->irq[i]); in dw_edma_probe()
978 struct dw_edma *dw = chip->dw; in dw_edma_remove() local
982 if (!dw) in dw_edma_remove()
986 dw_edma_core_off(dw); in dw_edma_remove()
989 for (i = (dw->nr_irqs - 1); i >= 0; i--) in dw_edma_remove()
990 free_irq(chip->ops->irq_vector(dev, i), &dw->irq[i]); in dw_edma_remove()
993 dma_async_device_unregister(&dw->dma); in dw_edma_remove()
994 list_for_each_entry_safe(chan, _chan, &dw->dma.channels, in dw_edma_remove()