diff options
author | Maxime Ripard <maxime.ripard@free-electrons.com> | 2014-11-17 08:42:26 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-12-22 01:59:06 -0500 |
commit | 5c9d2e37ac2bce248e351a7cd784e7c56dffb8e8 (patch) | |
tree | c8c9ce9b8ae321d3afc2b3fa40efc019cd87f4c2 | |
parent | 95335f1ff395a2152f788cee8a7680cfbd76573a (diff) |
dmaengine: mxs: Split device_control
Split the device_control callback of the Freescale MXS DMA 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/mxs-dma.c | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/drivers/dma/mxs-dma.c b/drivers/dma/mxs-dma.c index 5ea61201dbf0..834041e5a769 100644 --- a/drivers/dma/mxs-dma.c +++ b/drivers/dma/mxs-dma.c | |||
@@ -202,8 +202,9 @@ static struct mxs_dma_chan *to_mxs_dma_chan(struct dma_chan *chan) | |||
202 | return container_of(chan, struct mxs_dma_chan, chan); | 202 | return container_of(chan, struct mxs_dma_chan, chan); |
203 | } | 203 | } |
204 | 204 | ||
205 | static void mxs_dma_reset_chan(struct mxs_dma_chan *mxs_chan) | 205 | static void mxs_dma_reset_chan(struct dma_chan *chan) |
206 | { | 206 | { |
207 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | ||
207 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; | 208 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; |
208 | int chan_id = mxs_chan->chan.chan_id; | 209 | int chan_id = mxs_chan->chan.chan_id; |
209 | 210 | ||
@@ -250,8 +251,9 @@ static void mxs_dma_reset_chan(struct mxs_dma_chan *mxs_chan) | |||
250 | mxs_chan->status = DMA_COMPLETE; | 251 | mxs_chan->status = DMA_COMPLETE; |
251 | } | 252 | } |
252 | 253 | ||
253 | static void mxs_dma_enable_chan(struct mxs_dma_chan *mxs_chan) | 254 | static void mxs_dma_enable_chan(struct dma_chan *chan) |
254 | { | 255 | { |
256 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | ||
255 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; | 257 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; |
256 | int chan_id = mxs_chan->chan.chan_id; | 258 | int chan_id = mxs_chan->chan.chan_id; |
257 | 259 | ||
@@ -272,13 +274,16 @@ static void mxs_dma_enable_chan(struct mxs_dma_chan *mxs_chan) | |||
272 | mxs_chan->reset = false; | 274 | mxs_chan->reset = false; |
273 | } | 275 | } |
274 | 276 | ||
275 | static void mxs_dma_disable_chan(struct mxs_dma_chan *mxs_chan) | 277 | static void mxs_dma_disable_chan(struct dma_chan *chan) |
276 | { | 278 | { |
279 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | ||
280 | |||
277 | mxs_chan->status = DMA_COMPLETE; | 281 | mxs_chan->status = DMA_COMPLETE; |
278 | } | 282 | } |
279 | 283 | ||
280 | static void mxs_dma_pause_chan(struct mxs_dma_chan *mxs_chan) | 284 | static void mxs_dma_pause_chan(struct dma_chan *chan) |
281 | { | 285 | { |
286 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | ||
282 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; | 287 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; |
283 | int chan_id = mxs_chan->chan.chan_id; | 288 | int chan_id = mxs_chan->chan.chan_id; |
284 | 289 | ||
@@ -293,8 +298,9 @@ static void mxs_dma_pause_chan(struct mxs_dma_chan *mxs_chan) | |||
293 | mxs_chan->status = DMA_PAUSED; | 298 | mxs_chan->status = DMA_PAUSED; |
294 | } | 299 | } |
295 | 300 | ||
296 | static void mxs_dma_resume_chan(struct mxs_dma_chan *mxs_chan) | 301 | static void mxs_dma_resume_chan(struct dma_chan *chan) |
297 | { | 302 | { |
303 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | ||
298 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; | 304 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; |
299 | int chan_id = mxs_chan->chan.chan_id; | 305 | int chan_id = mxs_chan->chan.chan_id; |
300 | 306 | ||
@@ -383,7 +389,7 @@ static irqreturn_t mxs_dma_int_handler(int irq, void *dev_id) | |||
383 | "%s: error in channel %d\n", __func__, | 389 | "%s: error in channel %d\n", __func__, |
384 | chan); | 390 | chan); |
385 | mxs_chan->status = DMA_ERROR; | 391 | mxs_chan->status = DMA_ERROR; |
386 | mxs_dma_reset_chan(mxs_chan); | 392 | mxs_dma_reset_chan(mxs_chan->chan); |
387 | } else if (mxs_chan->status != DMA_COMPLETE) { | 393 | } else if (mxs_chan->status != DMA_COMPLETE) { |
388 | if (mxs_chan->flags & MXS_DMA_SG_LOOP) { | 394 | if (mxs_chan->flags & MXS_DMA_SG_LOOP) { |
389 | mxs_chan->status = DMA_IN_PROGRESS; | 395 | mxs_chan->status = DMA_IN_PROGRESS; |
@@ -432,7 +438,7 @@ static int mxs_dma_alloc_chan_resources(struct dma_chan *chan) | |||
432 | if (ret) | 438 | if (ret) |
433 | goto err_clk; | 439 | goto err_clk; |
434 | 440 | ||
435 | mxs_dma_reset_chan(mxs_chan); | 441 | mxs_dma_reset_chan(chan); |
436 | 442 | ||
437 | dma_async_tx_descriptor_init(&mxs_chan->desc, chan); | 443 | dma_async_tx_descriptor_init(&mxs_chan->desc, chan); |
438 | mxs_chan->desc.tx_submit = mxs_dma_tx_submit; | 444 | mxs_chan->desc.tx_submit = mxs_dma_tx_submit; |
@@ -456,7 +462,7 @@ static void mxs_dma_free_chan_resources(struct dma_chan *chan) | |||
456 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | 462 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); |
457 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; | 463 | struct mxs_dma_engine *mxs_dma = mxs_chan->mxs_dma; |
458 | 464 | ||
459 | mxs_dma_disable_chan(mxs_chan); | 465 | mxs_dma_disable_chan(chan); |
460 | 466 | ||
461 | free_irq(mxs_chan->chan_irq, mxs_dma); | 467 | free_irq(mxs_chan->chan_irq, mxs_dma); |
462 | 468 | ||
@@ -651,28 +657,14 @@ err_out: | |||
651 | return NULL; | 657 | return NULL; |
652 | } | 658 | } |
653 | 659 | ||
654 | static int mxs_dma_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd, | 660 | static int mxs_dma_terminate_all(struct dma_chan *chan) |
655 | unsigned long arg) | ||
656 | { | 661 | { |
657 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | 662 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); |
658 | int ret = 0; | ||
659 | |||
660 | switch (cmd) { | ||
661 | case DMA_TERMINATE_ALL: | ||
662 | mxs_dma_reset_chan(mxs_chan); | ||
663 | mxs_dma_disable_chan(mxs_chan); | ||
664 | break; | ||
665 | case DMA_PAUSE: | ||
666 | mxs_dma_pause_chan(mxs_chan); | ||
667 | break; | ||
668 | case DMA_RESUME: | ||
669 | mxs_dma_resume_chan(mxs_chan); | ||
670 | break; | ||
671 | default: | ||
672 | ret = -ENOSYS; | ||
673 | } | ||
674 | 663 | ||
675 | return ret; | 664 | mxs_dma_reset_chan(chan); |
665 | mxs_dma_disable_chan(chan); | ||
666 | |||
667 | return 0; | ||
676 | } | 668 | } |
677 | 669 | ||
678 | static enum dma_status mxs_dma_tx_status(struct dma_chan *chan, | 670 | static enum dma_status mxs_dma_tx_status(struct dma_chan *chan, |
@@ -701,13 +693,6 @@ static enum dma_status mxs_dma_tx_status(struct dma_chan *chan, | |||
701 | return mxs_chan->status; | 693 | return mxs_chan->status; |
702 | } | 694 | } |
703 | 695 | ||
704 | static void mxs_dma_issue_pending(struct dma_chan *chan) | ||
705 | { | ||
706 | struct mxs_dma_chan *mxs_chan = to_mxs_dma_chan(chan); | ||
707 | |||
708 | mxs_dma_enable_chan(mxs_chan); | ||
709 | } | ||
710 | |||
711 | static int __init mxs_dma_init(struct mxs_dma_engine *mxs_dma) | 696 | static int __init mxs_dma_init(struct mxs_dma_engine *mxs_dma) |
712 | { | 697 | { |
713 | int ret; | 698 | int ret; |
@@ -860,8 +845,10 @@ static int __init mxs_dma_probe(struct platform_device *pdev) | |||
860 | mxs_dma->dma_device.device_tx_status = mxs_dma_tx_status; | 845 | mxs_dma->dma_device.device_tx_status = mxs_dma_tx_status; |
861 | mxs_dma->dma_device.device_prep_slave_sg = mxs_dma_prep_slave_sg; | 846 | mxs_dma->dma_device.device_prep_slave_sg = mxs_dma_prep_slave_sg; |
862 | mxs_dma->dma_device.device_prep_dma_cyclic = mxs_dma_prep_dma_cyclic; | 847 | mxs_dma->dma_device.device_prep_dma_cyclic = mxs_dma_prep_dma_cyclic; |
863 | mxs_dma->dma_device.device_control = mxs_dma_control; | 848 | mxs_dma->dma_device.device_pause = mxs_dma_pause_chan; |
864 | mxs_dma->dma_device.device_issue_pending = mxs_dma_issue_pending; | 849 | mxs_dma->dma_device.device_resume = mxs_dma_resume_chan; |
850 | mxs_dma->dma_device.device_terminate_all = mxs_dma_terminate_all; | ||
851 | mxs_dma->dma_device.device_issue_pending = mxs_dma_enable_chan; | ||
865 | 852 | ||
866 | ret = dma_async_device_register(&mxs_dma->dma_device); | 853 | ret = dma_async_device_register(&mxs_dma->dma_device); |
867 | if (ret) { | 854 | if (ret) { |