Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dmaengine: imx-sdma: Split device_control

Split the device_control callback of the Freescale IMX SDMA driver to make use
of the newly introduced callbacks, that will eventually be used to retrieve
slave capabilities.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>

authored by

Maxime Ripard and committed by
Vinod Koul
7b350ab0 502c2ef2

+29 -35
+29 -35
drivers/dma/imx-sdma.c
··· 830 830 return ret; 831 831 } 832 832 833 - static void sdma_disable_channel(struct sdma_channel *sdmac) 833 + static struct sdma_channel *to_sdma_chan(struct dma_chan *chan) 834 834 { 835 + return container_of(chan, struct sdma_channel, chan); 836 + } 837 + 838 + static int sdma_disable_channel(struct dma_chan *chan) 839 + { 840 + struct sdma_channel *sdmac = to_sdma_chan(chan); 835 841 struct sdma_engine *sdma = sdmac->sdma; 836 842 int channel = sdmac->channel; 837 843 838 844 writel_relaxed(BIT(channel), sdma->regs + SDMA_H_STATSTOP); 839 845 sdmac->status = DMA_ERROR; 846 + 847 + return 0; 840 848 } 841 849 842 - static int sdma_config_channel(struct sdma_channel *sdmac) 850 + static int sdma_config_channel(struct dma_chan *chan) 843 851 { 852 + struct sdma_channel *sdmac = to_sdma_chan(chan); 844 853 int ret; 845 854 846 - sdma_disable_channel(sdmac); 855 + sdma_disable_channel(chan); 847 856 848 857 sdmac->event_mask[0] = 0; 849 858 sdmac->event_mask[1] = 0; ··· 944 935 return ret; 945 936 } 946 937 947 - static struct sdma_channel *to_sdma_chan(struct dma_chan *chan) 948 - { 949 - return container_of(chan, struct sdma_channel, chan); 950 - } 951 - 952 938 static dma_cookie_t sdma_tx_submit(struct dma_async_tx_descriptor *tx) 953 939 { 954 940 unsigned long flags; ··· 1008 1004 struct sdma_channel *sdmac = to_sdma_chan(chan); 1009 1005 struct sdma_engine *sdma = sdmac->sdma; 1010 1006 1011 - sdma_disable_channel(sdmac); 1007 + sdma_disable_channel(chan); 1012 1008 1013 1009 if (sdmac->event_id0) 1014 1010 sdma_event_disable(sdmac, sdmac->event_id0); ··· 1207 1203 return NULL; 1208 1204 } 1209 1205 1210 - static int sdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, 1211 - unsigned long arg) 1206 + static int sdma_config(struct dma_chan *chan, 1207 + struct dma_slave_config *dmaengine_cfg) 1212 1208 { 1213 1209 struct sdma_channel *sdmac = to_sdma_chan(chan); 1214 - struct dma_slave_config *dmaengine_cfg = (void *)arg; 1215 1210 1216 - switch (cmd) { 1217 - case DMA_TERMINATE_ALL: 1218 - sdma_disable_channel(sdmac); 1219 - return 0; 1220 - case DMA_SLAVE_CONFIG: 1221 - if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { 1222 - sdmac->per_address = dmaengine_cfg->src_addr; 1223 - sdmac->watermark_level = dmaengine_cfg->src_maxburst * 1224 - dmaengine_cfg->src_addr_width; 1225 - sdmac->word_size = dmaengine_cfg->src_addr_width; 1226 - } else { 1227 - sdmac->per_address = dmaengine_cfg->dst_addr; 1228 - sdmac->watermark_level = dmaengine_cfg->dst_maxburst * 1229 - dmaengine_cfg->dst_addr_width; 1230 - sdmac->word_size = dmaengine_cfg->dst_addr_width; 1231 - } 1232 - sdmac->direction = dmaengine_cfg->direction; 1233 - return sdma_config_channel(sdmac); 1234 - default: 1235 - return -ENOSYS; 1211 + if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { 1212 + sdmac->per_address = dmaengine_cfg->src_addr; 1213 + sdmac->watermark_level = dmaengine_cfg->src_maxburst * 1214 + dmaengine_cfg->src_addr_width; 1215 + sdmac->word_size = dmaengine_cfg->src_addr_width; 1216 + } else { 1217 + sdmac->per_address = dmaengine_cfg->dst_addr; 1218 + sdmac->watermark_level = dmaengine_cfg->dst_maxburst * 1219 + dmaengine_cfg->dst_addr_width; 1220 + sdmac->word_size = dmaengine_cfg->dst_addr_width; 1236 1221 } 1237 - 1238 - return -EINVAL; 1222 + sdmac->direction = dmaengine_cfg->direction; 1223 + return sdma_config_channel(chan); 1239 1224 } 1240 1225 1241 1226 static enum dma_status sdma_tx_status(struct dma_chan *chan, ··· 1593 1600 sdma->dma_device.device_tx_status = sdma_tx_status; 1594 1601 sdma->dma_device.device_prep_slave_sg = sdma_prep_slave_sg; 1595 1602 sdma->dma_device.device_prep_dma_cyclic = sdma_prep_dma_cyclic; 1596 - sdma->dma_device.device_control = sdma_control; 1603 + sdma->dma_device.device_config = sdma_config; 1604 + sdma->dma_device.device_terminate_all = sdma_disable_channel; 1597 1605 sdma->dma_device.device_issue_pending = sdma_issue_pending; 1598 1606 sdma->dma_device.dev->dma_parms = &sdma->dma_parms; 1599 1607 dma_set_max_seg_size(sdma->dma_device.dev, 65535);