@@ -437,17 +437,18 @@ static void dma_irq_handle_channel(struct imxdma_channel *imxdmac)
437437 struct imxdma_engine * imxdma = imxdmac -> imxdma ;
438438 int chno = imxdmac -> channel ;
439439 struct imxdma_desc * desc ;
440+ unsigned long flags ;
440441
441- spin_lock (& imxdma -> lock );
442+ spin_lock_irqsave (& imxdma -> lock , flags );
442443 if (list_empty (& imxdmac -> ld_active )) {
443- spin_unlock (& imxdma -> lock );
444+ spin_unlock_irqrestore (& imxdma -> lock , flags );
444445 goto out ;
445446 }
446447
447448 desc = list_first_entry (& imxdmac -> ld_active ,
448449 struct imxdma_desc ,
449450 node );
450- spin_unlock (& imxdma -> lock );
451+ spin_unlock_irqrestore (& imxdma -> lock , flags );
451452
452453 if (desc -> sg ) {
453454 u32 tmp ;
@@ -519,15 +520,13 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)
519520{
520521 struct imxdma_channel * imxdmac = to_imxdma_chan (d -> desc .chan );
521522 struct imxdma_engine * imxdma = imxdmac -> imxdma ;
522- unsigned long flags ;
523523 int slot = -1 ;
524524 int i ;
525525
526526 /* Configure and enable */
527527 switch (d -> type ) {
528528 case IMXDMA_DESC_INTERLEAVED :
529529 /* Try to get a free 2D slot */
530- spin_lock_irqsave (& imxdma -> lock , flags );
531530 for (i = 0 ; i < IMX_DMA_2D_SLOTS ; i ++ ) {
532531 if ((imxdma -> slots_2d [i ].count > 0 ) &&
533532 ((imxdma -> slots_2d [i ].xsr != d -> x ) ||
@@ -537,10 +536,8 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)
537536 slot = i ;
538537 break ;
539538 }
540- if (slot < 0 ) {
541- spin_unlock_irqrestore (& imxdma -> lock , flags );
539+ if (slot < 0 )
542540 return - EBUSY ;
543- }
544541
545542 imxdma -> slots_2d [slot ].xsr = d -> x ;
546543 imxdma -> slots_2d [slot ].ysr = d -> y ;
@@ -549,7 +546,6 @@ static int imxdma_xfer_desc(struct imxdma_desc *d)
549546
550547 imxdmac -> slot_2d = slot ;
551548 imxdmac -> enabled_2d = true;
552- spin_unlock_irqrestore (& imxdma -> lock , flags );
553549
554550 if (slot == IMX_DMA_2D_SLOT_A ) {
555551 d -> config_mem &= ~CCR_MSEL_B ;
@@ -625,18 +621,17 @@ static void imxdma_tasklet(unsigned long data)
625621 struct imxdma_channel * imxdmac = (void * )data ;
626622 struct imxdma_engine * imxdma = imxdmac -> imxdma ;
627623 struct imxdma_desc * desc ;
624+ unsigned long flags ;
628625
629- spin_lock (& imxdma -> lock );
626+ spin_lock_irqsave (& imxdma -> lock , flags );
630627
631628 if (list_empty (& imxdmac -> ld_active )) {
632629 /* Someone might have called terminate all */
633- goto out ;
630+ spin_unlock_irqrestore (& imxdma -> lock , flags );
631+ return ;
634632 }
635633 desc = list_first_entry (& imxdmac -> ld_active , struct imxdma_desc , node );
636634
637- if (desc -> desc .callback )
638- desc -> desc .callback (desc -> desc .callback_param );
639-
640635 /* If we are dealing with a cyclic descriptor, keep it on ld_active
641636 * and dont mark the descriptor as complete.
642637 * Only in non-cyclic cases it would be marked as complete
@@ -663,7 +658,11 @@ static void imxdma_tasklet(unsigned long data)
663658 __func__ , imxdmac -> channel );
664659 }
665660out :
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+
667666}
668667
669668static 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(
883882 kfree (imxdmac -> sg_list );
884883
885884 imxdmac -> sg_list = kcalloc (periods + 1 ,
886- sizeof (struct scatterlist ), GFP_KERNEL );
885+ sizeof (struct scatterlist ), GFP_ATOMIC );
887886 if (!imxdmac -> sg_list )
888887 return NULL ;
889888
0 commit comments