Lines Matching full:dma
12 /* Functions for DMA support */
18 struct stm32_i2c_dma *dma; in stm32_i2c_dma_request() local
22 dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); in stm32_i2c_dma_request()
23 if (!dma) in stm32_i2c_dma_request()
26 /* Request and configure I2C TX dma channel */ in stm32_i2c_dma_request()
27 dma->chan_tx = dma_request_chan(dev, "tx"); in stm32_i2c_dma_request()
28 if (IS_ERR(dma->chan_tx)) { in stm32_i2c_dma_request()
29 dev_dbg(dev, "can't request DMA tx channel\n"); in stm32_i2c_dma_request()
30 ret = PTR_ERR(dma->chan_tx); in stm32_i2c_dma_request()
39 ret = dmaengine_slave_config(dma->chan_tx, &dma_sconfig); in stm32_i2c_dma_request()
45 /* Request and configure I2C RX dma channel */ in stm32_i2c_dma_request()
46 dma->chan_rx = dma_request_chan(dev, "rx"); in stm32_i2c_dma_request()
47 if (IS_ERR(dma->chan_rx)) { in stm32_i2c_dma_request()
48 dev_err(dev, "can't request DMA rx channel\n"); in stm32_i2c_dma_request()
49 ret = PTR_ERR(dma->chan_rx); in stm32_i2c_dma_request()
58 ret = dmaengine_slave_config(dma->chan_rx, &dma_sconfig); in stm32_i2c_dma_request()
64 init_completion(&dma->dma_complete); in stm32_i2c_dma_request()
66 dev_info(dev, "using %s (tx) and %s (rx) for DMA transfers\n", in stm32_i2c_dma_request()
67 dma_chan_name(dma->chan_tx), dma_chan_name(dma->chan_rx)); in stm32_i2c_dma_request()
69 return dma; in stm32_i2c_dma_request()
72 dma_release_channel(dma->chan_rx); in stm32_i2c_dma_request()
74 dma_release_channel(dma->chan_tx); in stm32_i2c_dma_request()
76 devm_kfree(dev, dma); in stm32_i2c_dma_request()
77 dev_info(dev, "can't use DMA\n"); in stm32_i2c_dma_request()
82 void stm32_i2c_dma_free(struct stm32_i2c_dma *dma) in stm32_i2c_dma_free() argument
84 dma->dma_buf = 0; in stm32_i2c_dma_free()
85 dma->dma_len = 0; in stm32_i2c_dma_free()
87 dma_release_channel(dma->chan_tx); in stm32_i2c_dma_free()
88 dma->chan_tx = NULL; in stm32_i2c_dma_free()
90 dma_release_channel(dma->chan_rx); in stm32_i2c_dma_free()
91 dma->chan_rx = NULL; in stm32_i2c_dma_free()
93 dma->chan_using = NULL; in stm32_i2c_dma_free()
96 int stm32_i2c_prep_dma_xfer(struct device *dev, struct stm32_i2c_dma *dma, in stm32_i2c_prep_dma_xfer() argument
106 dma->chan_using = dma->chan_rx; in stm32_i2c_prep_dma_xfer()
107 dma->dma_transfer_dir = DMA_DEV_TO_MEM; in stm32_i2c_prep_dma_xfer()
108 dma->dma_data_dir = DMA_FROM_DEVICE; in stm32_i2c_prep_dma_xfer()
110 dma->chan_using = dma->chan_tx; in stm32_i2c_prep_dma_xfer()
111 dma->dma_transfer_dir = DMA_MEM_TO_DEV; in stm32_i2c_prep_dma_xfer()
112 dma->dma_data_dir = DMA_TO_DEVICE; in stm32_i2c_prep_dma_xfer()
115 dma->dma_len = len; in stm32_i2c_prep_dma_xfer()
116 chan_dev = dma->chan_using->device->dev; in stm32_i2c_prep_dma_xfer()
118 dma->dma_buf = dma_map_single(chan_dev, buf, dma->dma_len, in stm32_i2c_prep_dma_xfer()
119 dma->dma_data_dir); in stm32_i2c_prep_dma_xfer()
120 if (dma_mapping_error(chan_dev, dma->dma_buf)) { in stm32_i2c_prep_dma_xfer()
121 dev_err(dev, "DMA mapping failed\n"); in stm32_i2c_prep_dma_xfer()
125 txdesc = dmaengine_prep_slave_single(dma->chan_using, dma->dma_buf, in stm32_i2c_prep_dma_xfer()
126 dma->dma_len, in stm32_i2c_prep_dma_xfer()
127 dma->dma_transfer_dir, in stm32_i2c_prep_dma_xfer()
130 dev_err(dev, "Not able to get desc for DMA xfer\n"); in stm32_i2c_prep_dma_xfer()
135 reinit_completion(&dma->dma_complete); in stm32_i2c_prep_dma_xfer()
141 dev_err(dev, "DMA submit failed\n"); in stm32_i2c_prep_dma_xfer()
145 dma_async_issue_pending(dma->chan_using); in stm32_i2c_prep_dma_xfer()
150 dma_unmap_single(chan_dev, dma->dma_buf, dma->dma_len, in stm32_i2c_prep_dma_xfer()
151 dma->dma_data_dir); in stm32_i2c_prep_dma_xfer()