diff options
-rw-r--r-- | drivers/dma/dw_dmac.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index 76301c4ba1ad..635a4a5d31ae 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c | |||
@@ -47,13 +47,29 @@ static inline unsigned int dwc_get_sms(struct dw_dma_slave *slave) | |||
47 | return slave ? slave->src_master : 1; | 47 | return slave ? slave->src_master : 1; |
48 | } | 48 | } |
49 | 49 | ||
50 | #define SRC_MASTER 0 | ||
51 | #define DST_MASTER 1 | ||
52 | |||
53 | static inline unsigned int dwc_get_master(struct dma_chan *chan, int master) | ||
54 | { | ||
55 | struct dw_dma *dw = to_dw_dma(chan->device); | ||
56 | struct dw_dma_slave *dws = chan->private; | ||
57 | unsigned int m; | ||
58 | |||
59 | if (master == SRC_MASTER) | ||
60 | m = dwc_get_sms(dws); | ||
61 | else | ||
62 | m = dwc_get_dms(dws); | ||
63 | |||
64 | return min_t(unsigned int, dw->nr_masters - 1, m); | ||
65 | } | ||
66 | |||
50 | #define DWC_DEFAULT_CTLLO(_chan) ({ \ | 67 | #define DWC_DEFAULT_CTLLO(_chan) ({ \ |
51 | struct dw_dma_slave *__slave = (_chan->private); \ | ||
52 | struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan); \ | 68 | struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan); \ |
53 | struct dma_slave_config *_sconfig = &_dwc->dma_sconfig; \ | 69 | struct dma_slave_config *_sconfig = &_dwc->dma_sconfig; \ |
54 | bool _is_slave = is_slave_direction(_dwc->direction); \ | 70 | bool _is_slave = is_slave_direction(_dwc->direction); \ |
55 | int _dms = dwc_get_dms(__slave); \ | 71 | int _dms = dwc_get_master(_chan, DST_MASTER); \ |
56 | int _sms = dwc_get_sms(__slave); \ | 72 | int _sms = dwc_get_master(_chan, SRC_MASTER); \ |
57 | u8 _smsize = _is_slave ? _sconfig->src_maxburst : \ | 73 | u8 _smsize = _is_slave ? _sconfig->src_maxburst : \ |
58 | DW_DMA_MSIZE_16; \ | 74 | DW_DMA_MSIZE_16; \ |
59 | u8 _dmsize = _is_slave ? _sconfig->dst_maxburst : \ | 75 | u8 _dmsize = _is_slave ? _sconfig->dst_maxburst : \ |
@@ -74,20 +90,11 @@ static inline unsigned int dwc_get_sms(struct dw_dma_slave *slave) | |||
74 | */ | 90 | */ |
75 | #define NR_DESCS_PER_CHANNEL 64 | 91 | #define NR_DESCS_PER_CHANNEL 64 |
76 | 92 | ||
77 | #define SRC_MASTER 0 | ||
78 | #define DST_MASTER 1 | ||
79 | |||
80 | static inline unsigned int dwc_get_data_width(struct dma_chan *chan, int master) | 93 | static inline unsigned int dwc_get_data_width(struct dma_chan *chan, int master) |
81 | { | 94 | { |
82 | struct dw_dma *dw = to_dw_dma(chan->device); | 95 | struct dw_dma *dw = to_dw_dma(chan->device); |
83 | struct dw_dma_slave *dws = chan->private; | ||
84 | |||
85 | if (master == SRC_MASTER) | ||
86 | return dw->data_width[dwc_get_sms(dws)]; | ||
87 | else if (master == DST_MASTER) | ||
88 | return dw->data_width[dwc_get_dms(dws)]; | ||
89 | 96 | ||
90 | return 0; | 97 | return dw->data_width[dwc_get_master(chan, master)]; |
91 | } | 98 | } |
92 | 99 | ||
93 | /*----------------------------------------------------------------------*/ | 100 | /*----------------------------------------------------------------------*/ |