aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2014-08-19 13:29:15 -0400
committerVinod Koul <vinod.koul@intel.com>2014-09-11 02:18:13 -0400
commit8950052029874a6738552debb45077c596e90e6b (patch)
tree083a3e015b95ec9415f9ff99638935c9cf5481c9 /drivers/dma
parent7e1e2f27c5508518e58e5cbb11e26cbb815f4c56 (diff)
dmaengine: dw: apply both HS interfaces and remove slave_id usage
Instead of one request line member let's use both source and destination ones. Usually we have no such hardware except Atmel MMC controller found on AVR32 platform (see arch/avr32/mach-at32ap/at32ap700x.c and drivers/mmc/host/atmel-mci.c). This patch removes slave_id usage since it'll be removed from the generic structure in later. This breaks the non-ACPI / non-DT cases for the users of the driver, i.e. SPI and HSUART. However, these cases mean only PCI enumerated devices for now, which is anyway broken (considering more than one DMA controller in the system) and this patch series is intended to fix that eventually. The ACPI and DT cases shall be aware of the channel direction when setting request lines, but this is a minor problem that would be addressed in future. Suggested-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/dw/core.c32
-rw-r--r--drivers/dma/dw/platform.c6
-rw-r--r--drivers/dma/dw/regs.h7
3 files changed, 10 insertions, 35 deletions
diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c
index 0a9c052d437c..1c4521283fa9 100644
--- a/drivers/dma/dw/core.c
+++ b/drivers/dma/dw/core.c
@@ -37,24 +37,6 @@
37 * support descriptor writeback. 37 * support descriptor writeback.
38 */ 38 */
39 39
40static inline bool is_request_line_unset(struct dw_dma_chan *dwc)
41{
42 return dwc->request_line == (typeof(dwc->request_line))~0;
43}
44
45static inline void dwc_set_masters(struct dw_dma_chan *dwc)
46{
47 struct dw_dma *dw = to_dw_dma(dwc->chan.device);
48 struct dw_dma_slave *dws = dwc->chan.private;
49 unsigned char mmax = dw->nr_masters - 1;
50
51 if (!is_request_line_unset(dwc))
52 return;
53
54 dwc->src_master = min_t(unsigned char, mmax, dwc_get_sms(dws));
55 dwc->dst_master = min_t(unsigned char, mmax, dwc_get_dms(dws));
56}
57
58#define DWC_DEFAULT_CTLLO(_chan) ({ \ 40#define DWC_DEFAULT_CTLLO(_chan) ({ \
59 struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan); \ 41 struct dw_dma_chan *_dwc = to_dw_dma_chan(_chan); \
60 struct dma_slave_config *_sconfig = &_dwc->dma_sconfig; \ 42 struct dma_slave_config *_sconfig = &_dwc->dma_sconfig; \
@@ -158,10 +140,8 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
158 cfghi |= DWC_CFGH_DST_PER(dws->dst_id); 140 cfghi |= DWC_CFGH_DST_PER(dws->dst_id);
159 cfghi |= DWC_CFGH_SRC_PER(dws->src_id); 141 cfghi |= DWC_CFGH_SRC_PER(dws->src_id);
160 } else { 142 } else {
161 if (dwc->direction == DMA_MEM_TO_DEV) 143 cfghi |= DWC_CFGH_DST_PER(dwc->dst_id);
162 cfghi = DWC_CFGH_DST_PER(dwc->request_line); 144 cfghi |= DWC_CFGH_SRC_PER(dwc->src_id);
163 else if (dwc->direction == DMA_DEV_TO_MEM)
164 cfghi = DWC_CFGH_SRC_PER(dwc->request_line);
165 } 145 }
166 146
167 channel_writel(dwc, CFG_LO, cfglo); 147 channel_writel(dwc, CFG_LO, cfglo);
@@ -967,10 +947,6 @@ set_runtime_config(struct dma_chan *chan, struct dma_slave_config *sconfig)
967 memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig)); 947 memcpy(&dwc->dma_sconfig, sconfig, sizeof(*sconfig));
968 dwc->direction = sconfig->direction; 948 dwc->direction = sconfig->direction;
969 949
970 /* Take the request line from slave_id member */
971 if (is_request_line_unset(dwc))
972 dwc->request_line = sconfig->slave_id;
973
974 convert_burst(&dwc->dma_sconfig.src_maxburst); 950 convert_burst(&dwc->dma_sconfig.src_maxburst);
975 convert_burst(&dwc->dma_sconfig.dst_maxburst); 951 convert_burst(&dwc->dma_sconfig.dst_maxburst);
976 952
@@ -1123,8 +1099,6 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan)
1123 * doesn't mean what you think it means), and status writeback. 1099 * doesn't mean what you think it means), and status writeback.
1124 */ 1100 */
1125 1101
1126 dwc_set_masters(dwc);
1127
1128 spin_lock_irqsave(&dwc->lock, flags); 1102 spin_lock_irqsave(&dwc->lock, flags);
1129 i = dwc->descs_allocated; 1103 i = dwc->descs_allocated;
1130 while (dwc->descs_allocated < NR_DESCS_PER_CHANNEL) { 1104 while (dwc->descs_allocated < NR_DESCS_PER_CHANNEL) {
@@ -1182,7 +1156,6 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
1182 list_splice_init(&dwc->free_list, &list); 1156 list_splice_init(&dwc->free_list, &list);
1183 dwc->descs_allocated = 0; 1157 dwc->descs_allocated = 0;
1184 dwc->initialized = false; 1158 dwc->initialized = false;
1185 dwc->request_line = ~0;
1186 1159
1187 /* Disable interrupts */ 1160 /* Disable interrupts */
1188 channel_clear_bit(dw, MASK.XFER, dwc->mask); 1161 channel_clear_bit(dw, MASK.XFER, dwc->mask);
@@ -1604,7 +1577,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata)
1604 channel_clear_bit(dw, CH_EN, dwc->mask); 1577 channel_clear_bit(dw, CH_EN, dwc->mask);
1605 1578
1606 dwc->direction = DMA_TRANS_NONE; 1579 dwc->direction = DMA_TRANS_NONE;
1607 dwc->request_line = ~0;
1608 1580
1609 /* Hardware configuration */ 1581 /* Hardware configuration */
1610 if (autocfg) { 1582 if (autocfg) {
diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c
index c5b339af6be5..7aa3cd33fdec 100644
--- a/drivers/dma/dw/platform.c
+++ b/drivers/dma/dw/platform.c
@@ -41,7 +41,8 @@ static bool dw_dma_of_filter(struct dma_chan *chan, void *param)
41 if (chan->device != &fargs->dw->dma) 41 if (chan->device != &fargs->dw->dma)
42 return false; 42 return false;
43 43
44 dwc->request_line = fargs->req; 44 dwc->src_id = fargs->req;
45 dwc->dst_id = fargs->req;
45 dwc->src_master = fargs->src; 46 dwc->src_master = fargs->src;
46 dwc->dst_master = fargs->dst; 47 dwc->dst_master = fargs->dst;
47 48
@@ -86,7 +87,8 @@ static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param)
86 chan->chan_id != dma_spec->chan_id) 87 chan->chan_id != dma_spec->chan_id)
87 return false; 88 return false;
88 89
89 dwc->request_line = dma_spec->slave_id; 90 dwc->src_id = dma_spec->slave_id;
91 dwc->dst_id = dma_spec->slave_id;
90 dwc->src_master = dwc_get_sms(NULL); 92 dwc->src_master = dwc_get_sms(NULL);
91 dwc->dst_master = dwc_get_dms(NULL); 93 dwc->dst_master = dwc_get_dms(NULL);
92 94
diff --git a/drivers/dma/dw/regs.h b/drivers/dma/dw/regs.h
index af02439155e9..0e82d9972c17 100644
--- a/drivers/dma/dw/regs.h
+++ b/drivers/dma/dw/regs.h
@@ -221,9 +221,10 @@ struct dw_dma_chan {
221 bool nollp; 221 bool nollp;
222 222
223 /* custom slave configuration */ 223 /* custom slave configuration */
224 unsigned int request_line; 224 u8 src_id;
225 unsigned char src_master; 225 u8 dst_id;
226 unsigned char dst_master; 226 u8 src_master;
227 u8 dst_master;
227 228
228 /* configuration passed via DMA_SLAVE_CONFIG */ 229 /* configuration passed via DMA_SLAVE_CONFIG */
229 struct dma_slave_config dma_sconfig; 230 struct dma_slave_config dma_sconfig;