Lines Matching refs:xdev
423 struct xilinx_dma_device *xdev; member
533 readl_poll_timeout_atomic(chan->xdev->regs + chan->ctrl_offset + reg, \
539 return ioread32(chan->xdev->regs + reg); in dma_read()
544 iowrite32(value, chan->xdev->regs + reg); in dma_write()
591 writel(value_lsb, chan->xdev->regs + chan->desc_offset + reg); in vdma_desc_write_64()
594 writel(value_msb, chan->xdev->regs + chan->desc_offset + reg + 4); in vdma_desc_write_64()
599 lo_hi_writeq(value, chan->xdev->regs + chan->ctrl_offset + reg); in dma_writeq()
865 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { in xilinx_dma_free_tx_descriptor()
870 } else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_CDMA) { in xilinx_dma_free_tx_descriptor()
876 } else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_free_tx_descriptor()
941 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_free_chan_resources()
956 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) { in xilinx_dma_free_chan_resources()
967 if (chan->xdev->dma_config->dmatype != XDMA_TYPE_AXIDMA && in xilinx_dma_free_chan_resources()
968 chan->xdev->dma_config->dmatype != XDMA_TYPE_AXIMCDMA) { in xilinx_dma_free_chan_resources()
995 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_CDMA) { in xilinx_dma_get_residue()
1000 residue += (cdma_hw->control & chan->xdev->max_buffer_len) - in xilinx_dma_get_residue()
1001 (cdma_hw->status & chan->xdev->max_buffer_len); in xilinx_dma_get_residue()
1002 } else if (chan->xdev->dma_config->dmatype == in xilinx_dma_get_residue()
1008 residue += (axidma_hw->control & chan->xdev->max_buffer_len) - in xilinx_dma_get_residue()
1009 (axidma_hw->status & chan->xdev->max_buffer_len); in xilinx_dma_get_residue()
1017 (aximcdma_hw->control & chan->xdev->max_buffer_len) - in xilinx_dma_get_residue()
1018 (aximcdma_hw->status & chan->xdev->max_buffer_len); in xilinx_dma_get_residue()
1146 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_alloc_chan_resources()
1189 } else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) { in xilinx_dma_alloc_chan_resources()
1213 } else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_CDMA) { in xilinx_dma_alloc_chan_resources()
1228 ((chan->xdev->dma_config->dmatype != XDMA_TYPE_AXIDMA) && in xilinx_dma_alloc_chan_resources()
1229 chan->xdev->dma_config->dmatype != XDMA_TYPE_AXIMCDMA)) { in xilinx_dma_alloc_chan_resources()
1238 if ((chan->xdev->dma_config->dmatype == XDMA_TYPE_CDMA) && chan->has_sg) in xilinx_dma_alloc_chan_resources()
1259 chan->xdev->max_buffer_len); in xilinx_dma_calc_copysize()
1262 chan->xdev->common.copy_align) { in xilinx_dma_calc_copysize()
1268 (1 << chan->xdev->common.copy_align)); in xilinx_dma_calc_copysize()
1303 if (chan->has_sg && chan->xdev->dma_config->dmatype != XDMA_TYPE_VDMA) in xilinx_dma_tx_status()
1538 hw->control & chan->xdev->max_buffer_len); in xilinx_cdma_start_transfer()
1637 hw->control & chan->xdev->max_buffer_len); in xilinx_dma_start_transfer()
1757 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_complete_descriptor()
1765 if (chan->has_sg && chan->xdev->dma_config->dmatype != in xilinx_dma_complete_descriptor()
1768 else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA && in xilinx_dma_complete_descriptor()
1862 chan_offset = chan->xdev->dma_config->max_channels / 2; in xilinx_mcdma_irq_handler()
1865 chan = chan->xdev->chan[chan_offset]; in xilinx_mcdma_irq_handler()
1985 if (chan->xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { in append_desc_queue()
1990 } else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_CDMA) { in append_desc_queue()
1995 } else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in append_desc_queue()
2016 if (chan->has_sg && (chan->xdev->dma_config->dmatype == XDMA_TYPE_VDMA) in append_desc_queue()
2174 if (!len || len > chan->xdev->max_buffer_len) in xilinx_cdma_prep_memcpy()
2294 if (chan->xdev->has_axistream_connected) in xilinx_dma_prep_peripheral_dma_vec()
2396 if (chan->xdev->has_axistream_connected) in xilinx_dma_prep_slave_sg()
2568 chan->xdev->max_buffer_len); in xilinx_mcdma_prep_slave_sg()
2646 if ((chan->xdev->dma_config->dmatype == XDMA_TYPE_CDMA) && chan->has_sg) in xilinx_dma_terminate_all()
2922 static void xdma_disable_allclks(struct xilinx_dma_device *xdev) in xdma_disable_allclks() argument
2924 clk_disable_unprepare(xdev->rxs_clk); in xdma_disable_allclks()
2925 clk_disable_unprepare(xdev->rx_clk); in xdma_disable_allclks()
2926 clk_disable_unprepare(xdev->txs_clk); in xdma_disable_allclks()
2927 clk_disable_unprepare(xdev->tx_clk); in xdma_disable_allclks()
2928 clk_disable_unprepare(xdev->axi_clk); in xdma_disable_allclks()
2941 static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev, in xilinx_dma_chan_probe() argument
2950 chan = devm_kzalloc(xdev->dev, sizeof(*chan), GFP_KERNEL); in xilinx_dma_chan_probe()
2954 chan->dev = xdev->dev; in xilinx_dma_chan_probe()
2955 chan->xdev = xdev; in xilinx_dma_chan_probe()
2957 chan->ext_addr = xdev->ext_addr; in xilinx_dma_chan_probe()
2980 dev_err(xdev->dev, "missing xlnx,datawidth property\n"); in xilinx_dma_chan_probe()
2990 xdev->common.copy_align = (enum dmaengine_alignment)fls(width - 1); in xilinx_dma_chan_probe()
2996 chan->id = xdev->mm2s_chan_id++; in xilinx_dma_chan_probe()
3000 if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { in xilinx_dma_chan_probe()
3004 if (xdev->flush_on_fsync == XILINX_DMA_FLUSH_BOTH || in xilinx_dma_chan_probe()
3005 xdev->flush_on_fsync == XILINX_DMA_FLUSH_MM2S) in xilinx_dma_chan_probe()
3013 chan->id = xdev->s2mm_chan_id++; in xilinx_dma_chan_probe()
3014 chan->tdest = chan->id - xdev->dma_config->max_channels / 2; in xilinx_dma_chan_probe()
3023 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) in xilinx_dma_chan_probe()
3028 if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { in xilinx_dma_chan_probe()
3032 if (xdev->flush_on_fsync == XILINX_DMA_FLUSH_BOTH || in xilinx_dma_chan_probe()
3033 xdev->flush_on_fsync == XILINX_DMA_FLUSH_S2MM) in xilinx_dma_chan_probe()
3037 dev_err(xdev->dev, "Invalid channel compatible node\n"); in xilinx_dma_chan_probe()
3041 xdev->common.directions |= BIT(chan->direction); in xilinx_dma_chan_probe()
3046 return dev_err_probe(xdev->dev, chan->irq, "failed to get irq\n"); in xilinx_dma_chan_probe()
3047 err = request_irq(chan->irq, xdev->dma_config->irq_handler, in xilinx_dma_chan_probe()
3050 dev_err(xdev->dev, "unable to request IRQ %d\n", chan->irq); in xilinx_dma_chan_probe()
3054 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_chan_probe()
3057 } else if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) { in xilinx_dma_chan_probe()
3060 } else if (xdev->dma_config->dmatype == XDMA_TYPE_CDMA) { in xilinx_dma_chan_probe()
3069 if (xdev->dma_config->dmatype != XDMA_TYPE_VDMA) { in xilinx_dma_chan_probe()
3070 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA || in xilinx_dma_chan_probe()
3085 chan->common.device = &xdev->common; in xilinx_dma_chan_probe()
3087 list_add_tail(&chan->common.device_node, &xdev->common.channels); in xilinx_dma_chan_probe()
3088 xdev->chan[chan->id] = chan; in xilinx_dma_chan_probe()
3093 dev_err(xdev->dev, "Reset channel failed\n"); in xilinx_dma_chan_probe()
3110 static int xilinx_dma_child_probe(struct xilinx_dma_device *xdev, in xilinx_dma_child_probe() argument
3117 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA && ret < 0) in xilinx_dma_child_probe()
3118 dev_warn(xdev->dev, "missing dma-channels property\n"); in xilinx_dma_child_probe()
3121 ret = xilinx_dma_chan_probe(xdev, node); in xilinx_dma_child_probe()
3139 struct xilinx_dma_device *xdev = ofdma->of_dma_data; in of_dma_xilinx_xlate() local
3142 if (chan_id >= xdev->dma_config->max_channels || !xdev->chan[chan_id]) in of_dma_xilinx_xlate()
3145 return dma_get_slave_channel(&xdev->chan[chan_id]->common); in of_dma_xilinx_xlate()
3196 struct xilinx_dma_device *xdev; in xilinx_dma_probe() local
3202 xdev = devm_kzalloc(&pdev->dev, sizeof(*xdev), GFP_KERNEL); in xilinx_dma_probe()
3203 if (!xdev) in xilinx_dma_probe()
3206 xdev->dev = &pdev->dev; in xilinx_dma_probe()
3212 xdev->dma_config = match->data; in xilinx_dma_probe()
3213 clk_init = xdev->dma_config->clk_init; in xilinx_dma_probe()
3217 err = clk_init(pdev, &xdev->axi_clk, &xdev->tx_clk, &xdev->txs_clk, in xilinx_dma_probe()
3218 &xdev->rx_clk, &xdev->rxs_clk); in xilinx_dma_probe()
3223 xdev->regs = devm_platform_ioremap_resource(pdev, 0); in xilinx_dma_probe()
3224 if (IS_ERR(xdev->regs)) { in xilinx_dma_probe()
3225 err = PTR_ERR(xdev->regs); in xilinx_dma_probe()
3229 xdev->max_buffer_len = GENMASK(XILINX_DMA_MAX_TRANS_LEN_MAX - 1, 0); in xilinx_dma_probe()
3230 xdev->s2mm_chan_id = xdev->dma_config->max_channels / 2; in xilinx_dma_probe()
3232 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA || in xilinx_dma_probe()
3233 xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) { in xilinx_dma_probe()
3238 dev_warn(xdev->dev, in xilinx_dma_probe()
3242 dev_warn(xdev->dev, "Please ensure that IP supports buffer length > 23 bits\n"); in xilinx_dma_probe()
3243 xdev->max_buffer_len = in xilinx_dma_probe()
3249 dma_set_max_seg_size(xdev->dev, xdev->max_buffer_len); in xilinx_dma_probe()
3251 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_probe()
3252 xdev->has_axistream_connected = in xilinx_dma_probe()
3256 if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { in xilinx_dma_probe()
3260 dev_err(xdev->dev, in xilinx_dma_probe()
3266 &xdev->flush_on_fsync); in xilinx_dma_probe()
3268 dev_warn(xdev->dev, in xilinx_dma_probe()
3274 dev_warn(xdev->dev, in xilinx_dma_probe()
3279 xdev->ext_addr = true; in xilinx_dma_probe()
3281 xdev->ext_addr = false; in xilinx_dma_probe()
3284 if (xdev->has_axistream_connected) in xilinx_dma_probe()
3285 xdev->common.desc_metadata_modes = DESC_METADATA_ENGINE; in xilinx_dma_probe()
3288 err = dma_set_mask_and_coherent(xdev->dev, DMA_BIT_MASK(addr_width)); in xilinx_dma_probe()
3290 dev_err(xdev->dev, "DMA mask error %d\n", err); in xilinx_dma_probe()
3295 xdev->common.dev = &pdev->dev; in xilinx_dma_probe()
3297 INIT_LIST_HEAD(&xdev->common.channels); in xilinx_dma_probe()
3298 if (!(xdev->dma_config->dmatype == XDMA_TYPE_CDMA)) { in xilinx_dma_probe()
3299 dma_cap_set(DMA_SLAVE, xdev->common.cap_mask); in xilinx_dma_probe()
3300 dma_cap_set(DMA_PRIVATE, xdev->common.cap_mask); in xilinx_dma_probe()
3303 xdev->common.device_alloc_chan_resources = in xilinx_dma_probe()
3305 xdev->common.device_free_chan_resources = in xilinx_dma_probe()
3307 xdev->common.device_terminate_all = xilinx_dma_terminate_all; in xilinx_dma_probe()
3308 xdev->common.device_synchronize = xilinx_dma_synchronize; in xilinx_dma_probe()
3309 xdev->common.device_tx_status = xilinx_dma_tx_status; in xilinx_dma_probe()
3310 xdev->common.device_issue_pending = xilinx_dma_issue_pending; in xilinx_dma_probe()
3311 xdev->common.device_config = xilinx_dma_device_config; in xilinx_dma_probe()
3312 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) { in xilinx_dma_probe()
3313 dma_cap_set(DMA_CYCLIC, xdev->common.cap_mask); in xilinx_dma_probe()
3314 xdev->common.device_prep_peripheral_dma_vec = xilinx_dma_prep_peripheral_dma_vec; in xilinx_dma_probe()
3315 xdev->common.device_prep_slave_sg = xilinx_dma_prep_slave_sg; in xilinx_dma_probe()
3316 xdev->common.device_prep_dma_cyclic = in xilinx_dma_probe()
3319 xdev->common.residue_granularity = in xilinx_dma_probe()
3321 } else if (xdev->dma_config->dmatype == XDMA_TYPE_CDMA) { in xilinx_dma_probe()
3322 dma_cap_set(DMA_MEMCPY, xdev->common.cap_mask); in xilinx_dma_probe()
3323 xdev->common.device_prep_dma_memcpy = xilinx_cdma_prep_memcpy; in xilinx_dma_probe()
3325 xdev->common.residue_granularity = in xilinx_dma_probe()
3327 } else if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) { in xilinx_dma_probe()
3328 xdev->common.device_prep_slave_sg = xilinx_mcdma_prep_slave_sg; in xilinx_dma_probe()
3330 xdev->common.device_prep_interleaved_dma = in xilinx_dma_probe()
3334 platform_set_drvdata(pdev, xdev); in xilinx_dma_probe()
3338 err = xilinx_dma_child_probe(xdev, child); in xilinx_dma_probe()
3345 if (xdev->dma_config->dmatype == XDMA_TYPE_VDMA) { in xilinx_dma_probe()
3346 for (i = 0; i < xdev->dma_config->max_channels; i++) in xilinx_dma_probe()
3347 if (xdev->chan[i]) in xilinx_dma_probe()
3348 xdev->chan[i]->num_frms = num_frames; in xilinx_dma_probe()
3352 err = dma_async_device_register(&xdev->common); in xilinx_dma_probe()
3354 dev_err(xdev->dev, "failed to register the dma device\n"); in xilinx_dma_probe()
3359 xdev); in xilinx_dma_probe()
3362 dma_async_device_unregister(&xdev->common); in xilinx_dma_probe()
3366 if (xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) in xilinx_dma_probe()
3368 else if (xdev->dma_config->dmatype == XDMA_TYPE_CDMA) in xilinx_dma_probe()
3370 else if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA) in xilinx_dma_probe()
3378 for (i = 0; i < xdev->dma_config->max_channels; i++) in xilinx_dma_probe()
3379 if (xdev->chan[i]) in xilinx_dma_probe()
3380 xilinx_dma_chan_remove(xdev->chan[i]); in xilinx_dma_probe()
3382 xdma_disable_allclks(xdev); in xilinx_dma_probe()
3393 struct xilinx_dma_device *xdev = platform_get_drvdata(pdev); in xilinx_dma_remove() local
3398 dma_async_device_unregister(&xdev->common); in xilinx_dma_remove()
3400 for (i = 0; i < xdev->dma_config->max_channels; i++) in xilinx_dma_remove()
3401 if (xdev->chan[i]) in xilinx_dma_remove()
3402 xilinx_dma_chan_remove(xdev->chan[i]); in xilinx_dma_remove()
3404 xdma_disable_allclks(xdev); in xilinx_dma_remove()