@@ -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,8 +621,9 @@ 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 */
@@ -663,7 +660,7 @@ static void imxdma_tasklet(unsigned long data)
663660 __func__ , imxdmac -> channel );
664661 }
665662out :
666- spin_unlock (& imxdma -> lock );
663+ spin_unlock_irqrestore (& imxdma -> lock , flags );
667664}
668665
669666static int imxdma_control (struct dma_chan * chan , enum dma_ctrl_cmd cmd ,
0 commit comments