@@ -87,6 +87,7 @@ struct litex_mmc_host {
87
87
dma_addr_t dma ;
88
88
89
89
struct completion cmd_done ;
90
+ struct completion data_done ;
90
91
int irq ;
91
92
92
93
unsigned int ref_clk ;
@@ -258,6 +259,18 @@ static irqreturn_t litex_mmc_interrupt(int irq, void *arg)
258
259
complete (& host -> cmd_done );
259
260
}
260
261
262
+ /* Check for DMA read completed */
263
+ if (pending & SDIRQ_SD_TO_MEM_DONE ) {
264
+ handled |= SDIRQ_SD_TO_MEM_DONE ;
265
+ complete (& host -> data_done );
266
+ }
267
+
268
+ /* Check for DMA write completed */
269
+ if (pending & SDIRQ_MEM_TO_SD_DONE ) {
270
+ handled |= SDIRQ_MEM_TO_SD_DONE ;
271
+ complete (& host -> data_done );
272
+ }
273
+
261
274
/* Acknowledge handled interrupts */
262
275
litex_write32 (host -> sdirq + LITEX_IRQ_PENDING , handled );
263
276
@@ -369,6 +382,10 @@ static void litex_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
369
382
return ;
370
383
}
371
384
385
+ if (host -> irq > 0 ) {
386
+ reinit_completion (& host -> data_done );
387
+ }
388
+
372
389
litex_mmc_do_dma (host , data , & len , & direct , & transfer );
373
390
}
374
391
@@ -384,6 +401,9 @@ static void litex_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
384
401
u8 evt ;
385
402
386
403
/* Wait for completion of (read or write) DMA transfer */
404
+ if (host -> irq > 0 ) {
405
+ wait_for_completion (& host -> data_done );
406
+ }
387
407
cmd -> error = readx_poll_timeout (litex_read8 , reg ,
388
408
evt , evt & SD_BIT_DONE ,
389
409
SD_SLEEP_US , SD_TIMEOUT_US );
@@ -507,11 +527,14 @@ static int litex_mmc_irq_init(struct platform_device *pdev,
507
527
508
528
/* Clear & enable interrupts */
509
529
litex_write32 (host -> sdirq + LITEX_IRQ_PENDING ,
510
- SDIRQ_CARD_DETECT | SDIRQ_CMD_DONE );
530
+ SDIRQ_CARD_DETECT | SDIRQ_CMD_DONE |
531
+ SDIRQ_SD_TO_MEM_DONE | SDIRQ_MEM_TO_SD_DONE );
511
532
litex_write32 (host -> sdirq + LITEX_IRQ_ENABLE ,
512
- SDIRQ_CARD_DETECT | SDIRQ_CMD_DONE );
533
+ SDIRQ_CARD_DETECT | SDIRQ_CMD_DONE |
534
+ SDIRQ_SD_TO_MEM_DONE | SDIRQ_MEM_TO_SD_DONE );
513
535
514
536
init_completion (& host -> cmd_done );
537
+ init_completion (& host -> data_done );
515
538
516
539
return 0 ;
517
540
0 commit comments