diff options
author | Maxime Ripard <maxime.ripard@free-electrons.com> | 2014-11-17 08:42:27 -0500 |
---|---|---|
committer | Vinod Koul <vinod.koul@intel.com> | 2014-12-22 01:59:06 -0500 |
commit | e22aec0f0072164e7a2243059715c92ff56016c6 (patch) | |
tree | 2453c9bde009cceaf53e43789b16073a6bb51900 | |
parent | 5c9d2e37ac2bce248e351a7cd784e7c56dffb8e8 (diff) |
dmaengine: nbpfaxi: Split device_control
Split the device_control callback of the NBPF AXI 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/nbpfaxi.c | 93 |
1 files changed, 46 insertions, 47 deletions
diff --git a/drivers/dma/nbpfaxi.c b/drivers/dma/nbpfaxi.c index 3d993e785180..0202602597f7 100644 --- a/drivers/dma/nbpfaxi.c +++ b/drivers/dma/nbpfaxi.c | |||
@@ -565,13 +565,6 @@ static void nbpf_configure(struct nbpf_device *nbpf) | |||
565 | nbpf_write(nbpf, NBPF_CTRL, NBPF_CTRL_LVINT); | 565 | nbpf_write(nbpf, NBPF_CTRL, NBPF_CTRL_LVINT); |
566 | } | 566 | } |
567 | 567 | ||
568 | static void nbpf_pause(struct nbpf_channel *chan) | ||
569 | { | ||
570 | nbpf_chan_write(chan, NBPF_CHAN_CTRL, NBPF_CHAN_CTRL_SETSUS); | ||
571 | /* See comment in nbpf_prep_one() */ | ||
572 | nbpf_chan_write(chan, NBPF_CHAN_CTRL, NBPF_CHAN_CTRL_CLREN); | ||
573 | } | ||
574 | |||
575 | /* Generic part */ | 568 | /* Generic part */ |
576 | 569 | ||
577 | /* DMA ENGINE functions */ | 570 | /* DMA ENGINE functions */ |
@@ -837,54 +830,58 @@ static void nbpf_chan_idle(struct nbpf_channel *chan) | |||
837 | } | 830 | } |
838 | } | 831 | } |
839 | 832 | ||
840 | static int nbpf_control(struct dma_chan *dchan, enum dma_ctrl_cmd cmd, | 833 | static int nbpf_pause(struct dma_chan *dchan) |
841 | unsigned long arg) | ||
842 | { | 834 | { |
843 | struct nbpf_channel *chan = nbpf_to_chan(dchan); | 835 | struct nbpf_channel *chan = nbpf_to_chan(dchan); |
844 | struct dma_slave_config *config; | ||
845 | 836 | ||
846 | dev_dbg(dchan->device->dev, "Entry %s(%d)\n", __func__, cmd); | 837 | dev_dbg(dchan->device->dev, "Entry %s\n", __func__); |
847 | 838 | ||
848 | switch (cmd) { | 839 | chan->paused = true; |
849 | case DMA_TERMINATE_ALL: | 840 | nbpf_chan_write(chan, NBPF_CHAN_CTRL, NBPF_CHAN_CTRL_SETSUS); |
850 | dev_dbg(dchan->device->dev, "Terminating\n"); | 841 | /* See comment in nbpf_prep_one() */ |
851 | nbpf_chan_halt(chan); | 842 | nbpf_chan_write(chan, NBPF_CHAN_CTRL, NBPF_CHAN_CTRL_CLREN); |
852 | nbpf_chan_idle(chan); | ||
853 | break; | ||
854 | 843 | ||
855 | case DMA_SLAVE_CONFIG: | 844 | return 0; |
856 | if (!arg) | 845 | } |
857 | return -EINVAL; | ||
858 | config = (struct dma_slave_config *)arg; | ||
859 | 846 | ||
860 | /* | 847 | static int nbpf_terminate_all(struct dma_chan *dchan) |
861 | * We could check config->slave_id to match chan->terminal here, | 848 | { |
862 | * but with DT they would be coming from the same source, so | 849 | struct nbpf_channel *chan = nbpf_to_chan(dchan); |
863 | * such a check would be superflous | ||
864 | */ | ||
865 | 850 | ||
866 | chan->slave_dst_addr = config->dst_addr; | 851 | dev_dbg(dchan->device->dev, "Entry %s\n", __func__); |
867 | chan->slave_dst_width = nbpf_xfer_size(chan->nbpf, | 852 | dev_dbg(dchan->device->dev, "Terminating\n"); |
868 | config->dst_addr_width, 1); | ||
869 | chan->slave_dst_burst = nbpf_xfer_size(chan->nbpf, | ||
870 | config->dst_addr_width, | ||
871 | config->dst_maxburst); | ||
872 | chan->slave_src_addr = config->src_addr; | ||
873 | chan->slave_src_width = nbpf_xfer_size(chan->nbpf, | ||
874 | config->src_addr_width, 1); | ||
875 | chan->slave_src_burst = nbpf_xfer_size(chan->nbpf, | ||
876 | config->src_addr_width, | ||
877 | config->src_maxburst); | ||
878 | break; | ||
879 | 853 | ||
880 | case DMA_PAUSE: | 854 | nbpf_chan_halt(chan); |
881 | chan->paused = true; | 855 | nbpf_chan_idle(chan); |
882 | nbpf_pause(chan); | ||
883 | break; | ||
884 | 856 | ||
885 | default: | 857 | return 0; |
886 | return -ENXIO; | 858 | } |
887 | } | 859 | |
860 | static int nbpf_config(struct dma_chan *dchan, | ||
861 | struct dma_slave_config *config) | ||
862 | { | ||
863 | struct nbpf_channel *chan = nbpf_to_chan(dchan); | ||
864 | |||
865 | dev_dbg(dchan->device->dev, "Entry %s\n", __func__); | ||
866 | |||
867 | /* | ||
868 | * We could check config->slave_id to match chan->terminal here, | ||
869 | * but with DT they would be coming from the same source, so | ||
870 | * such a check would be superflous | ||
871 | */ | ||
872 | |||
873 | chan->slave_dst_addr = config->dst_addr; | ||
874 | chan->slave_dst_width = nbpf_xfer_size(chan->nbpf, | ||
875 | config->dst_addr_width, 1); | ||
876 | chan->slave_dst_burst = nbpf_xfer_size(chan->nbpf, | ||
877 | config->dst_addr_width, | ||
878 | config->dst_maxburst); | ||
879 | chan->slave_src_addr = config->src_addr; | ||
880 | chan->slave_src_width = nbpf_xfer_size(chan->nbpf, | ||
881 | config->src_addr_width, 1); | ||
882 | chan->slave_src_burst = nbpf_xfer_size(chan->nbpf, | ||
883 | config->src_addr_width, | ||
884 | config->src_maxburst); | ||
888 | 885 | ||
889 | return 0; | 886 | return 0; |
890 | } | 887 | } |
@@ -1426,7 +1423,9 @@ static int nbpf_probe(struct platform_device *pdev) | |||
1426 | 1423 | ||
1427 | /* Compulsory for DMA_SLAVE fields */ | 1424 | /* Compulsory for DMA_SLAVE fields */ |
1428 | dma_dev->device_prep_slave_sg = nbpf_prep_slave_sg; | 1425 | dma_dev->device_prep_slave_sg = nbpf_prep_slave_sg; |
1429 | dma_dev->device_control = nbpf_control; | 1426 | dma_dev->device_config = nbpf_config; |
1427 | dma_dev->device_pause = nbpf_pause; | ||
1428 | dma_dev->device_terminate_all = nbpf_terminate_all; | ||
1430 | 1429 | ||
1431 | platform_set_drvdata(pdev, nbpf); | 1430 | platform_set_drvdata(pdev, nbpf); |
1432 | 1431 | ||