aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dma/dw_dmac.c27
-rw-r--r--drivers/dma/dw_dmac_regs.h3
2 files changed, 20 insertions, 10 deletions
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index e5378b5741be..154952abc2e9 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -73,6 +73,22 @@ static inline unsigned int dwc_get_sms(struct dw_dma_slave *slave)
73 */ 73 */
74#define NR_DESCS_PER_CHANNEL 64 74#define NR_DESCS_PER_CHANNEL 64
75 75
76#define SRC_MASTER 0
77#define DST_MASTER 1
78
79static inline unsigned int dwc_get_data_width(struct dma_chan *chan, int master)
80{
81 struct dw_dma *dw = to_dw_dma(chan->device);
82 struct dw_dma_slave *dws = chan->private;
83
84 if (master == SRC_MASTER)
85 return dw->data_width[dwc_get_sms(dws)];
86 else if (master == DST_MASTER)
87 return dw->data_width[dwc_get_dms(dws)];
88
89 return 0;
90}
91
76/*----------------------------------------------------------------------*/ 92/*----------------------------------------------------------------------*/
77 93
78/* 94/*
@@ -701,7 +717,6 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
701 size_t len, unsigned long flags) 717 size_t len, unsigned long flags)
702{ 718{
703 struct dw_dma_chan *dwc = to_dw_dma_chan(chan); 719 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
704 struct dw_dma_slave *dws = chan->private;
705 struct dw_desc *desc; 720 struct dw_desc *desc;
706 struct dw_desc *first; 721 struct dw_desc *first;
707 struct dw_desc *prev; 722 struct dw_desc *prev;
@@ -724,8 +739,8 @@ dwc_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,
724 739
725 dwc->direction = DMA_MEM_TO_MEM; 740 dwc->direction = DMA_MEM_TO_MEM;
726 741
727 data_width = min_t(unsigned int, dwc->dw->data_width[dwc_get_sms(dws)], 742 data_width = min_t(unsigned int, dwc_get_data_width(chan, SRC_MASTER),
728 dwc->dw->data_width[dwc_get_dms(dws)]); 743 dwc_get_data_width(chan, DST_MASTER));
729 744
730 src_width = dst_width = min_t(unsigned int, data_width, 745 src_width = dst_width = min_t(unsigned int, data_width,
731 dwc_fast_fls(src | dest | len)); 746 dwc_fast_fls(src | dest | len));
@@ -790,7 +805,6 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
790 unsigned long flags, void *context) 805 unsigned long flags, void *context)
791{ 806{
792 struct dw_dma_chan *dwc = to_dw_dma_chan(chan); 807 struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
793 struct dw_dma_slave *dws = chan->private;
794 struct dma_slave_config *sconfig = &dwc->dma_sconfig; 808 struct dma_slave_config *sconfig = &dwc->dma_sconfig;
795 struct dw_desc *prev; 809 struct dw_desc *prev;
796 struct dw_desc *first; 810 struct dw_desc *first;
@@ -824,7 +838,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
824 ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_M2P) : 838 ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_M2P) :
825 DWC_CTLL_FC(DW_DMA_FC_D_M2P); 839 DWC_CTLL_FC(DW_DMA_FC_D_M2P);
826 840
827 data_width = dwc->dw->data_width[dwc_get_sms(dws)]; 841 data_width = dwc_get_data_width(chan, SRC_MASTER);
828 842
829 for_each_sg(sgl, sg, sg_len, i) { 843 for_each_sg(sgl, sg, sg_len, i) {
830 struct dw_desc *desc; 844 struct dw_desc *desc;
@@ -887,7 +901,7 @@ slave_sg_todev_fill_desc:
887 ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_P2M) : 901 ctllo |= sconfig->device_fc ? DWC_CTLL_FC(DW_DMA_FC_P_P2M) :
888 DWC_CTLL_FC(DW_DMA_FC_D_P2M); 902 DWC_CTLL_FC(DW_DMA_FC_D_P2M);
889 903
890 data_width = dwc->dw->data_width[dwc_get_dms(dws)]; 904 data_width = dwc_get_data_width(chan, DST_MASTER);
891 905
892 for_each_sg(sgl, sg, sg_len, i) { 906 for_each_sg(sgl, sg, sg_len, i) {
893 struct dw_desc *desc; 907 struct dw_desc *desc;
@@ -1739,7 +1753,6 @@ static int dw_probe(struct platform_device *pdev)
1739 1753
1740 channel_clear_bit(dw, CH_EN, dwc->mask); 1754 channel_clear_bit(dw, CH_EN, dwc->mask);
1741 1755
1742 dwc->dw = dw;
1743 dwc->direction = DMA_TRANS_NONE; 1756 dwc->direction = DMA_TRANS_NONE;
1744 1757
1745 /* hardware configuration */ 1758 /* hardware configuration */
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
index f9532c29b808..577f2dd35882 100644
--- a/drivers/dma/dw_dmac_regs.h
+++ b/drivers/dma/dw_dmac_regs.h
@@ -214,9 +214,6 @@ struct dw_dma_chan {
214 214
215 /* configuration passed via DMA_SLAVE_CONFIG */ 215 /* configuration passed via DMA_SLAVE_CONFIG */
216 struct dma_slave_config dma_sconfig; 216 struct dma_slave_config dma_sconfig;
217
218 /* backlink to dw_dma */
219 struct dw_dma *dw;
220}; 217};
221 218
222static inline struct dw_dma_chan_regs __iomem * 219static inline struct dw_dma_chan_regs __iomem *