Lines Matching full:dw
20 #include "dw-edma-core.h"
21 #include "dw-edma-v0-core.h"
22 #include "dw-hdma-v0-core.h"
47 struct dw_edma_chip *chip = chan->dw->chip; in dw_edma_get_pci_address()
79 struct dw_edma_chip *chip = desc->chan->dw->chip; in dw_edma_alloc_chunk()
188 struct dw_edma *dw = chan->dw; in dw_edma_start_transfer() local
206 dw_edma_core_start(dw, child, !desc->xfer_sz); in dw_edma_start_transfer()
221 if (chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) { in dw_edma_device_caps()
390 * If eDMA is embedded into the DW PCIe RP/EP and controlled from the in dw_edma_device_transfer()
405 if (chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) { in dw_edma_device_transfer()
711 static int dw_edma_channel_setup(struct dw_edma *dw, u32 wr_alloc, u32 rd_alloc) in dw_edma_channel_setup() argument
713 struct dw_edma_chip *chip = dw->chip; in dw_edma_channel_setup()
721 ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt; in dw_edma_channel_setup()
722 dma = &dw->dma; in dw_edma_channel_setup()
727 chan = &dw->chan[i]; in dw_edma_channel_setup()
729 chan->dw = dw; in dw_edma_channel_setup()
731 if (i < dw->wr_ch_cnt) { in dw_edma_channel_setup()
735 chan->id = i - dw->wr_ch_cnt; in dw_edma_channel_setup()
753 if (dw->nr_irqs == 1) in dw_edma_channel_setup()
760 irq = &dw->irq[pos]; in dw_edma_channel_setup()
767 irq->dw = dw; in dw_edma_channel_setup()
778 &dw->chip->dt_region_wr[chan->id] : in dw_edma_channel_setup()
779 &dw->chip->dt_region_rd[chan->id]; in dw_edma_channel_setup()
832 static int dw_edma_irq_request(struct dw_edma *dw, in dw_edma_irq_request() argument
835 struct dw_edma_chip *chip = dw->chip; in dw_edma_irq_request()
836 struct device *dev = dw->chip->dev; in dw_edma_irq_request()
843 ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt; in dw_edma_irq_request()
848 dw->irq = devm_kcalloc(dev, chip->nr_irqs, sizeof(*dw->irq), GFP_KERNEL); in dw_edma_irq_request()
849 if (!dw->irq) in dw_edma_irq_request()
856 IRQF_SHARED, dw->name, &dw->irq[0]); in dw_edma_irq_request()
858 dw->nr_irqs = 0; in dw_edma_irq_request()
863 get_cached_msi_msg(irq, &dw->irq[0].msi); in dw_edma_irq_request()
865 dw->nr_irqs = 1; in dw_edma_irq_request()
871 dw_edma_dec_irq_alloc(&tmp, wr_alloc, dw->wr_ch_cnt); in dw_edma_irq_request()
872 dw_edma_dec_irq_alloc(&tmp, rd_alloc, dw->rd_ch_cnt); in dw_edma_irq_request()
875 dw_edma_add_irq_mask(&wr_mask, *wr_alloc, dw->wr_ch_cnt); in dw_edma_irq_request()
876 dw_edma_add_irq_mask(&rd_mask, *rd_alloc, dw->rd_ch_cnt); in dw_edma_irq_request()
884 IRQF_SHARED, dw->name, in dw_edma_irq_request()
885 &dw->irq[i]); in dw_edma_irq_request()
890 get_cached_msi_msg(irq, &dw->irq[i].msi); in dw_edma_irq_request()
893 dw->nr_irqs = i; in dw_edma_irq_request()
901 free_irq(irq, &dw->irq[i]); in dw_edma_irq_request()
910 struct dw_edma *dw; in dw_edma_probe() local
922 dw = devm_kzalloc(dev, sizeof(*dw), GFP_KERNEL); in dw_edma_probe()
923 if (!dw) in dw_edma_probe()
926 dw->chip = chip; in dw_edma_probe()
928 if (dw->chip->mf == EDMA_MF_HDMA_NATIVE) in dw_edma_probe()
929 dw_hdma_v0_core_register(dw); in dw_edma_probe()
931 dw_edma_v0_core_register(dw); in dw_edma_probe()
933 raw_spin_lock_init(&dw->lock); in dw_edma_probe()
935 dw->wr_ch_cnt = min_t(u16, chip->ll_wr_cnt, in dw_edma_probe()
936 dw_edma_core_ch_count(dw, EDMA_DIR_WRITE)); in dw_edma_probe()
937 dw->wr_ch_cnt = min_t(u16, dw->wr_ch_cnt, EDMA_MAX_WR_CH); in dw_edma_probe()
939 dw->rd_ch_cnt = min_t(u16, chip->ll_rd_cnt, in dw_edma_probe()
940 dw_edma_core_ch_count(dw, EDMA_DIR_READ)); in dw_edma_probe()
941 dw->rd_ch_cnt = min_t(u16, dw->rd_ch_cnt, EDMA_MAX_RD_CH); in dw_edma_probe()
943 if (!dw->wr_ch_cnt && !dw->rd_ch_cnt) in dw_edma_probe()
947 dw->wr_ch_cnt, dw->rd_ch_cnt); in dw_edma_probe()
950 dw->chan = devm_kcalloc(dev, dw->wr_ch_cnt + dw->rd_ch_cnt, in dw_edma_probe()
951 sizeof(*dw->chan), GFP_KERNEL); in dw_edma_probe()
952 if (!dw->chan) in dw_edma_probe()
955 snprintf(dw->name, sizeof(dw->name), "dw-edma-core:%s", in dw_edma_probe()
959 dw_edma_core_off(dw); in dw_edma_probe()
962 err = dw_edma_irq_request(dw, &wr_alloc, &rd_alloc); in dw_edma_probe()
967 err = dw_edma_channel_setup(dw, wr_alloc, rd_alloc); in dw_edma_probe()
972 dw_edma_core_debugfs_on(dw); in dw_edma_probe()
974 chip->dw = dw; in dw_edma_probe()
979 for (i = (dw->nr_irqs - 1); i >= 0; i--) in dw_edma_probe()
980 free_irq(chip->ops->irq_vector(dev, i), &dw->irq[i]); in dw_edma_probe()
990 struct dw_edma *dw = chip->dw; in dw_edma_remove() local
994 if (!dw) in dw_edma_remove()
998 dw_edma_core_off(dw); in dw_edma_remove()
1001 for (i = (dw->nr_irqs - 1); i >= 0; i--) in dw_edma_remove()
1002 free_irq(chip->ops->irq_vector(dev, i), &dw->irq[i]); in dw_edma_remove()
1005 dma_async_device_unregister(&dw->dma); in dw_edma_remove()
1006 list_for_each_entry_safe(chan, _chan, &dw->dma.channels, in dw_edma_remove()