@@ -437,17 +437,18 @@ static void dma_irq_handle_channel(struct imxdma_channel *imxdmac)
437
437
struct imxdma_engine * imxdma = imxdmac -> imxdma ;
438
438
int chno = imxdmac -> channel ;
439
439
struct imxdma_desc * desc ;
440
+ unsigned long flags ;
440
441
441
- spin_lock (& imxdma -> lock );
442
+ spin_lock_irqsave (& imxdma -> lock , flags );
442
443
if (list_empty (& imxdmac -> ld_active )) {
443
- spin_unlock (& imxdma -> lock );
444
+ spin_unlock_irqrestore (& imxdma -> lock , flags );
444
445
goto out ;
445
446
}
446
447
447
448
desc = list_first_entry (& imxdmac -> ld_active ,
448
449
struct imxdma_desc ,
449
450
node );
450
- spin_unlock (& imxdma -> lock );
451
+ spin_unlock_irqrestore (& imxdma -> lock , flags );
451
452
452
453
if (desc -> sg ) {
453
454
u32 tmp ;
@@ -519,15 +520,13 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)
519
520
{
520
521
struct imxdma_channel * imxdmac = to_imxdma_chan (d -> desc .chan );
521
522
struct imxdma_engine * imxdma = imxdmac -> imxdma ;
522
- unsigned long flags ;
523
523
int slot = -1 ;
524
524
int i ;
525
525
526
526
/* Configure and enable */
527
527
switch (d -> type ) {
528
528
case IMXDMA_DESC_INTERLEAVED :
529
529
/* Try to get a free 2D slot */
530
- spin_lock_irqsave (& imxdma -> lock , flags );
531
530
for (i = 0 ; i < IMX_DMA_2D_SLOTS ; i ++ ) {
532
531
if ((imxdma -> slots_2d [i ].count > 0 ) &&
533
532
((imxdma -> slots_2d [i ].xsr != d -> x ) ||
@@ -537,10 +536,8 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)
537
536
slot = i ;
538
537
break ;
539
538
}
540
- if (slot < 0 ) {
541
- spin_unlock_irqrestore (& imxdma -> lock , flags );
539
+ if (slot < 0 )
542
540
return - EBUSY ;
543
- }
544
541
545
542
imxdma -> slots_2d [slot ].xsr = d -> x ;
546
543
imxdma -> slots_2d [slot ].ysr = d -> y ;
@@ -549,7 +546,6 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)
549
546
550
547
imxdmac -> slot_2d = slot ;
551
548
imxdmac -> enabled_2d = true;
552
- spin_unlock_irqrestore (& imxdma -> lock , flags );
553
549
554
550
if (slot == IMX_DMA_2D_SLOT_A ) {
555
551
d -> config_mem &= ~CCR_MSEL_B ;
@@ -625,18 +621,17 @@ static void imxdma_tasklet(unsigned long data)
625
621
struct imxdma_channel * imxdmac = (void * )data ;
626
622
struct imxdma_engine * imxdma = imxdmac -> imxdma ;
627
623
struct imxdma_desc * desc ;
624
+ unsigned long flags ;
628
625
629
- spin_lock (& imxdma -> lock );
626
+ spin_lock_irqsave (& imxdma -> lock , flags );
630
627
631
628
if (list_empty (& imxdmac -> ld_active )) {
632
629
/* Someone might have called terminate all */
633
- goto out ;
630
+ spin_unlock_irqrestore (& imxdma -> lock , flags );
631
+ return ;
634
632
}
635
633
desc = list_first_entry (& imxdmac -> ld_active , struct imxdma_desc , node );
636
634
637
- if (desc -> desc .callback )
638
- desc -> desc .callback (desc -> desc .callback_param );
639
-
640
635
/* If we are dealing with a cyclic descriptor, keep it on ld_active
641
636
* and dont mark the descriptor as complete.
642
637
* Only in non-cyclic cases it would be marked as complete
@@ -663,7 +658,11 @@ static void imxdma_tasklet(unsigned long data)
663
658
__func__ , imxdmac -> channel );
664
659
}
665
660
out :
666
- spin_unlock (& imxdma -> lock );
661
+ spin_unlock_irqrestore (& imxdma -> lock , flags );
662
+
663
+ if (desc -> desc .callback )
664
+ desc -> desc .callback (desc -> desc .callback_param );
665
+
667
666
}
668
667
669
668
static int imxdma_control (struct dma_chan * chan , enum dma_ctrl_cmd cmd ,
@@ -883,7 +882,7 @@ static struct dma_async_tx_descriptor *imxdma_prep_dma_cyclic(
883
882
kfree (imxdmac -> sg_list );
884
883
885
884
imxdmac -> sg_list = kcalloc (periods + 1 ,
886
- sizeof (struct scatterlist ), GFP_KERNEL );
885
+ sizeof (struct scatterlist ), GFP_ATOMIC );
887
886
if (!imxdmac -> sg_list )
888
887
return NULL ;
889
888
0 commit comments