diff options
author | Maxime Ripard <maxime.ripard@free-electrons.com> | 2014-11-17 08:42:17 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-12-22 01:58:59 -0500 |
commit | 7b350ab0fa338dae86a62d83efee21fab39fcdc6 (patch) | |
tree | f87536654c84d719867b9fb36daa231badb6a68f | |
parent | 502c2ef26dba04128af260de0ca3e2940e57fc7a (diff) |
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>
-rw-r--r-- | drivers/dma/imx-sdma.c | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c index d0df198f62e9..1748a4bd475f 100644 --- a/drivers/dma/imx-sdma.c +++ b/drivers/dma/imx-sdma.c | |||
@@ -830,20 +830,29 @@ static int sdma_load_context(struct sdma_channel *sdmac) | |||
830 | return ret; | 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 | { | ||
835 | return container_of(chan, struct sdma_channel, chan); | ||
836 | } | ||
837 | |||
838 | static int sdma_disable_channel(struct dma_chan *chan) | ||
834 | { | 839 | { |
840 | struct sdma_channel *sdmac = to_sdma_chan(chan); | ||
835 | struct sdma_engine *sdma = sdmac->sdma; | 841 | struct sdma_engine *sdma = sdmac->sdma; |
836 | int channel = sdmac->channel; | 842 | int channel = sdmac->channel; |
837 | 843 | ||
838 | writel_relaxed(BIT(channel), sdma->regs + SDMA_H_STATSTOP); | 844 | writel_relaxed(BIT(channel), sdma->regs + SDMA_H_STATSTOP); |
839 | sdmac->status = DMA_ERROR; | 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 | int ret; | 853 | int ret; |
845 | 854 | ||
846 | sdma_disable_channel(sdmac); | 855 | sdma_disable_channel(chan); |
847 | 856 | ||
848 | sdmac->event_mask[0] = 0; | 857 | sdmac->event_mask[0] = 0; |
849 | sdmac->event_mask[1] = 0; | 858 | sdmac->event_mask[1] = 0; |
@@ -935,11 +944,6 @@ out: | |||
935 | return ret; | 944 | return ret; |
936 | } | 945 | } |
937 | 946 | ||
938 | static struct sdma_channel *to_sdma_chan(struct dma_chan *chan) | ||
939 | { | ||
940 | return container_of(chan, struct sdma_channel, chan); | ||
941 | } | ||
942 | |||
943 | static dma_cookie_t sdma_tx_submit(struct dma_async_tx_descriptor *tx) | 947 | static dma_cookie_t sdma_tx_submit(struct dma_async_tx_descriptor *tx) |
944 | { | 948 | { |
945 | unsigned long flags; | 949 | unsigned long flags; |
@@ -1004,7 +1008,7 @@ static void sdma_free_chan_resources(struct dma_chan *chan) | |||
1004 | struct sdma_channel *sdmac = to_sdma_chan(chan); | 1008 | struct sdma_channel *sdmac = to_sdma_chan(chan); |
1005 | struct sdma_engine *sdma = sdmac->sdma; | 1009 | struct sdma_engine *sdma = sdmac->sdma; |
1006 | 1010 | ||
1007 | sdma_disable_channel(sdmac); | 1011 | sdma_disable_channel(chan); |
1008 | 1012 | ||
1009 | if (sdmac->event_id0) | 1013 | if (sdmac->event_id0) |
1010 | sdma_event_disable(sdmac, sdmac->event_id0); | 1014 | sdma_event_disable(sdmac, sdmac->event_id0); |
@@ -1203,35 +1207,24 @@ err_out: | |||
1203 | return NULL; | 1207 | return NULL; |
1204 | } | 1208 | } |
1205 | 1209 | ||
1206 | static int sdma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 1210 | static int sdma_config(struct dma_chan *chan, |
1207 | unsigned long arg) | 1211 | struct dma_slave_config *dmaengine_cfg) |
1208 | { | 1212 | { |
1209 | struct sdma_channel *sdmac = to_sdma_chan(chan); | 1213 | struct sdma_channel *sdmac = to_sdma_chan(chan); |
1210 | struct dma_slave_config *dmaengine_cfg = (void *)arg; | ||
1211 | |||
1212 | switch (cmd) { | ||
1213 | case DMA_TERMINATE_ALL: | ||
1214 | sdma_disable_channel(sdmac); | ||
1215 | return 0; | ||
1216 | case DMA_SLAVE_CONFIG: | ||
1217 | if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { | ||
1218 | sdmac->per_address = dmaengine_cfg->src_addr; | ||
1219 | sdmac->watermark_level = dmaengine_cfg->src_maxburst * | ||
1220 | dmaengine_cfg->src_addr_width; | ||
1221 | sdmac->word_size = dmaengine_cfg->src_addr_width; | ||
1222 | } else { | ||
1223 | sdmac->per_address = dmaengine_cfg->dst_addr; | ||
1224 | sdmac->watermark_level = dmaengine_cfg->dst_maxburst * | ||
1225 | dmaengine_cfg->dst_addr_width; | ||
1226 | sdmac->word_size = dmaengine_cfg->dst_addr_width; | ||
1227 | } | ||
1228 | sdmac->direction = dmaengine_cfg->direction; | ||
1229 | return sdma_config_channel(sdmac); | ||
1230 | default: | ||
1231 | return -ENOSYS; | ||
1232 | } | ||
1233 | 1214 | ||
1234 | return -EINVAL; | 1215 | if (dmaengine_cfg->direction == DMA_DEV_TO_MEM) { |
1216 | sdmac->per_address = dmaengine_cfg->src_addr; | ||
1217 | sdmac->watermark_level = dmaengine_cfg->src_maxburst * | ||
1218 | dmaengine_cfg->src_addr_width; | ||
1219 | sdmac->word_size = dmaengine_cfg->src_addr_width; | ||
1220 | } else { | ||
1221 | sdmac->per_address = dmaengine_cfg->dst_addr; | ||
1222 | sdmac->watermark_level = dmaengine_cfg->dst_maxburst * | ||
1223 | dmaengine_cfg->dst_addr_width; | ||
1224 | sdmac->word_size = dmaengine_cfg->dst_addr_width; | ||
1225 | } | ||
1226 | sdmac->direction = dmaengine_cfg->direction; | ||
1227 | return sdma_config_channel(chan); | ||
1235 | } | 1228 | } |
1236 | 1229 | ||
1237 | static enum dma_status sdma_tx_status(struct dma_chan *chan, | 1230 | static enum dma_status sdma_tx_status(struct dma_chan *chan, |
@@ -1600,7 +1593,8 @@ static int sdma_probe(struct platform_device *pdev) | |||
1600 | sdma->dma_device.device_tx_status = sdma_tx_status; | 1593 | sdma->dma_device.device_tx_status = sdma_tx_status; |
1601 | sdma->dma_device.device_prep_slave_sg = sdma_prep_slave_sg; | 1594 | sdma->dma_device.device_prep_slave_sg = sdma_prep_slave_sg; |
1602 | sdma->dma_device.device_prep_dma_cyclic = sdma_prep_dma_cyclic; | 1595 | sdma->dma_device.device_prep_dma_cyclic = sdma_prep_dma_cyclic; |
1603 | sdma->dma_device.device_control = sdma_control; | 1596 | sdma->dma_device.device_config = sdma_config; |
1597 | sdma->dma_device.device_terminate_all = sdma_disable_channel; | ||
1604 | sdma->dma_device.device_issue_pending = sdma_issue_pending; | 1598 | sdma->dma_device.device_issue_pending = sdma_issue_pending; |
1605 | sdma->dma_device.dev->dma_parms = &sdma->dma_parms; | 1599 | sdma->dma_device.dev->dma_parms = &sdma->dma_parms; |
1606 | dma_set_max_seg_size(sdma->dma_device.dev, 65535); | 1600 | dma_set_max_seg_size(sdma->dma_device.dev, 65535); |