Source
106
106
enum dma_transfer_direction direction;
107
107
bool cyclic;
108
108
109
109
unsigned int num_sgs;
110
110
struct jz4740_dma_sg sg[];
111
111
};
112
112
113
113
struct jz4740_dmaengine_chan {
114
114
struct virt_dma_chan vchan;
115
115
unsigned int id;
116
+
struct dma_slave_config config;
116
117
117
118
dma_addr_t fifo_addr;
118
119
unsigned int transfer_shift;
119
120
120
121
struct jz4740_dma_desc *desc;
121
122
unsigned int next_sg;
122
123
};
123
124
124
125
struct jz4740_dma_dev {
125
126
struct dma_device ddev;
196
197
else if (maxburst <= 3)
197
198
return JZ4740_DMA_TRANSFER_SIZE_2BYTE;
198
199
else if (maxburst <= 15)
199
200
return JZ4740_DMA_TRANSFER_SIZE_4BYTE;
200
201
else if (maxburst <= 31)
201
202
return JZ4740_DMA_TRANSFER_SIZE_16BYTE;
202
203
203
204
return JZ4740_DMA_TRANSFER_SIZE_32BYTE;
204
205
}
205
206
206
-
static int jz4740_dma_slave_config(struct dma_chan *c,
207
-
struct dma_slave_config *config)
207
+
static int jz4740_dma_slave_config_write(struct dma_chan *c,
208
+
struct dma_slave_config *config,
209
+
enum dma_transfer_direction direction)
208
210
{
209
211
struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c);
210
212
struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan);
211
213
enum jz4740_dma_width src_width;
212
214
enum jz4740_dma_width dst_width;
213
215
enum jz4740_dma_transfer_size transfer_size;
214
216
enum jz4740_dma_flags flags;
215
217
uint32_t cmd;
216
218
217
-
switch (config->direction) {
219
+
switch (direction) {
218
220
case DMA_MEM_TO_DEV:
219
221
flags = JZ4740_DMA_SRC_AUTOINC;
220
222
transfer_size = jz4740_dma_maxburst(config->dst_maxburst);
221
223
chan->fifo_addr = config->dst_addr;
222
224
break;
223
225
case DMA_DEV_TO_MEM:
224
226
flags = JZ4740_DMA_DST_AUTOINC;
225
227
transfer_size = jz4740_dma_maxburst(config->src_maxburst);
226
228
chan->fifo_addr = config->src_addr;
227
229
break;
258
260
cmd |= JZ_DMA_CMD_TRANSFER_IRQ_ENABLE;
259
261
260
262
jz4740_dma_write(dmadev, JZ_REG_DMA_CMD(chan->id), cmd);
261
263
jz4740_dma_write(dmadev, JZ_REG_DMA_STATUS_CTRL(chan->id), 0);
262
264
jz4740_dma_write(dmadev, JZ_REG_DMA_REQ_TYPE(chan->id),
263
265
config->slave_id);
264
266
265
267
return 0;
266
268
}
267
269
270
+
static int jz4740_dma_slave_config(struct dma_chan *c,
271
+
struct dma_slave_config *config)
272
+
{
273
+
struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c);
274
+
275
+
memcpy(&chan->config, config, sizeof(*config));
276
+
return 0;
277
+
}
278
+
268
279
static int jz4740_dma_terminate_all(struct dma_chan *c)
269
280
{
270
281
struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c);
271
282
struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan);
272
283
unsigned long flags;
273
284
LIST_HEAD(head);
274
285
275
286
spin_lock_irqsave(&chan->vchan.lock, flags);
276
287
jz4740_dma_write_mask(dmadev, JZ_REG_DMA_STATUS_CTRL(chan->id), 0,
277
288
JZ_DMA_STATUS_CTRL_ENABLE);
400
411
401
412
for_each_sg(sgl, sg, sg_len, i) {
402
413
desc->sg[i].addr = sg_dma_address(sg);
403
414
desc->sg[i].len = sg_dma_len(sg);
404
415
}
405
416
406
417
desc->num_sgs = sg_len;
407
418
desc->direction = direction;
408
419
desc->cyclic = false;
409
420
421
+
jz4740_dma_slave_config_write(c, &chan->config, direction);
422
+
410
423
return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
411
424
}
412
425
413
426
static struct dma_async_tx_descriptor *jz4740_dma_prep_dma_cyclic(
414
427
struct dma_chan *c, dma_addr_t buf_addr, size_t buf_len,
415
428
size_t period_len, enum dma_transfer_direction direction,
416
429
unsigned long flags)
417
430
{
418
431
struct jz4740_dmaengine_chan *chan = to_jz4740_dma_chan(c);
419
432
struct jz4740_dma_desc *desc;
431
444
for (i = 0; i < num_periods; i++) {
432
445
desc->sg[i].addr = buf_addr;
433
446
desc->sg[i].len = period_len;
434
447
buf_addr += period_len;
435
448
}
436
449
437
450
desc->num_sgs = num_periods;
438
451
desc->direction = direction;
439
452
desc->cyclic = true;
440
453
454
+
jz4740_dma_slave_config_write(c, &chan->config, direction);
455
+
441
456
return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
442
457
}
443
458
444
459
static size_t jz4740_dma_desc_residue(struct jz4740_dmaengine_chan *chan,
445
460
struct jz4740_dma_desc *desc, unsigned int next_sg)
446
461
{
447
462
struct jz4740_dma_dev *dmadev = jz4740_dma_chan_get_dev(chan);
448
463
unsigned int residue, count;
449
464
unsigned int i;
450
465