@@ -122,6 +122,7 @@ struct jz4780_dma_desc {
122
122
dma_addr_t desc_phys ;
123
123
unsigned int count ;
124
124
enum dma_transaction_type type ;
125
+ u32 transfer_type ;
125
126
u32 status ;
126
127
};
127
128
@@ -130,7 +131,7 @@ struct jz4780_dma_chan {
130
131
unsigned int id ;
131
132
struct dma_pool * desc_pool ;
132
133
133
- u32 transfer_type ;
134
+ u32 transfer_type_tx , transfer_type_rx ;
134
135
u32 transfer_shift ;
135
136
struct dma_slave_config config ;
136
137
@@ -157,7 +158,7 @@ struct jz4780_dma_dev {
157
158
};
158
159
159
160
struct jz4780_dma_filter_data {
160
- u32 transfer_type ;
161
+ u32 transfer_type_tx , transfer_type_rx ;
161
162
int channel ;
162
163
};
163
164
@@ -226,9 +227,10 @@ static inline void jz4780_dma_chan_disable(struct jz4780_dma_dev *jzdma,
226
227
jz4780_dma_ctrl_writel (jzdma , JZ_DMA_REG_DCKEC , BIT (chn ));
227
228
}
228
229
229
- static struct jz4780_dma_desc * jz4780_dma_desc_alloc (
230
- struct jz4780_dma_chan * jzchan , unsigned int count ,
231
- enum dma_transaction_type type )
230
+ static struct jz4780_dma_desc *
231
+ jz4780_dma_desc_alloc (struct jz4780_dma_chan * jzchan , unsigned int count ,
232
+ enum dma_transaction_type type ,
233
+ enum dma_transfer_direction direction )
232
234
{
233
235
struct jz4780_dma_desc * desc ;
234
236
@@ -248,6 +250,12 @@ static struct jz4780_dma_desc *jz4780_dma_desc_alloc(
248
250
249
251
desc -> count = count ;
250
252
desc -> type = type ;
253
+
254
+ if (direction == DMA_DEV_TO_MEM )
255
+ desc -> transfer_type = jzchan -> transfer_type_rx ;
256
+ else
257
+ desc -> transfer_type = jzchan -> transfer_type_tx ;
258
+
251
259
return desc ;
252
260
}
253
261
@@ -361,7 +369,7 @@ static struct dma_async_tx_descriptor *jz4780_dma_prep_slave_sg(
361
369
unsigned int i ;
362
370
int err ;
363
371
364
- desc = jz4780_dma_desc_alloc (jzchan , sg_len , DMA_SLAVE );
372
+ desc = jz4780_dma_desc_alloc (jzchan , sg_len , DMA_SLAVE , direction );
365
373
if (!desc )
366
374
return NULL ;
367
375
@@ -410,7 +418,7 @@ static struct dma_async_tx_descriptor *jz4780_dma_prep_dma_cyclic(
410
418
411
419
periods = buf_len / period_len ;
412
420
413
- desc = jz4780_dma_desc_alloc (jzchan , periods , DMA_CYCLIC );
421
+ desc = jz4780_dma_desc_alloc (jzchan , periods , DMA_CYCLIC , direction );
414
422
if (!desc )
415
423
return NULL ;
416
424
@@ -455,14 +463,14 @@ static struct dma_async_tx_descriptor *jz4780_dma_prep_dma_memcpy(
455
463
struct jz4780_dma_desc * desc ;
456
464
u32 tsz ;
457
465
458
- desc = jz4780_dma_desc_alloc (jzchan , 1 , DMA_MEMCPY );
466
+ desc = jz4780_dma_desc_alloc (jzchan , 1 , DMA_MEMCPY , 0 );
459
467
if (!desc )
460
468
return NULL ;
461
469
462
470
tsz = jz4780_dma_transfer_size (jzchan , dest | src | len ,
463
471
& jzchan -> transfer_shift );
464
472
465
- jzchan -> transfer_type = JZ_DMA_DRT_AUTO ;
473
+ desc -> transfer_type = JZ_DMA_DRT_AUTO ;
466
474
467
475
desc -> desc [0 ].dsa = src ;
468
476
desc -> desc [0 ].dta = dest ;
@@ -528,7 +536,7 @@ static void jz4780_dma_begin(struct jz4780_dma_chan *jzchan)
528
536
529
537
/* Set transfer type. */
530
538
jz4780_dma_chn_writel (jzdma , jzchan -> id , JZ_DMA_REG_DRT ,
531
- jzchan -> transfer_type );
539
+ jzchan -> desc -> transfer_type );
532
540
533
541
/*
534
542
* Set the transfer count. This is redundant for a descriptor-driven
@@ -788,7 +796,8 @@ static bool jz4780_dma_filter_fn(struct dma_chan *chan, void *param)
788
796
return false;
789
797
}
790
798
791
- jzchan -> transfer_type = data -> transfer_type ;
799
+ jzchan -> transfer_type_tx = data -> transfer_type_tx ;
800
+ jzchan -> transfer_type_rx = data -> transfer_type_rx ;
792
801
793
802
return true;
794
803
}
@@ -800,11 +809,17 @@ static struct dma_chan *jz4780_of_dma_xlate(struct of_phandle_args *dma_spec,
800
809
dma_cap_mask_t mask = jzdma -> dma_device .cap_mask ;
801
810
struct jz4780_dma_filter_data data ;
802
811
803
- if (dma_spec -> args_count != 2 )
812
+ if (dma_spec -> args_count == 2 ) {
813
+ data .transfer_type_tx = dma_spec -> args [0 ];
814
+ data .transfer_type_rx = dma_spec -> args [0 ];
815
+ data .channel = dma_spec -> args [1 ];
816
+ } else if (dma_spec -> args_count == 3 ) {
817
+ data .transfer_type_tx = dma_spec -> args [0 ];
818
+ data .transfer_type_rx = dma_spec -> args [1 ];
819
+ data .channel = dma_spec -> args [2 ];
820
+ } else {
804
821
return NULL ;
805
-
806
- data .transfer_type = dma_spec -> args [0 ];
807
- data .channel = dma_spec -> args [1 ];
822
+ }
808
823
809
824
if (data .channel > -1 ) {
810
825
if (data .channel >= jzdma -> soc_data -> nb_channels ) {
@@ -822,7 +837,8 @@ static struct dma_chan *jz4780_of_dma_xlate(struct of_phandle_args *dma_spec,
822
837
return NULL ;
823
838
}
824
839
825
- jzdma -> chan [data .channel ].transfer_type = data .transfer_type ;
840
+ jzdma -> chan [data .channel ].transfer_type_tx = data .transfer_type_tx ;
841
+ jzdma -> chan [data .channel ].transfer_type_rx = data .transfer_type_rx ;
826
842
827
843
return dma_get_slave_channel (
828
844
& jzdma -> chan [data .channel ].vchan .chan );
0 commit comments