• Sugar Zhang's avatar
    dmaengine: pl330: _stop: clear interrupt status · 2da254cc
    Sugar Zhang authored
    This patch kill instructs the DMAC to immediately terminate
    execution of a thread. and then clear the interrupt status,
    at last, stop generating interrupts for DMA_SEV. to guarantee
    the next dma start is clean. otherwise, one interrupt maybe leave
    to next start and make some mistake.
    
    we can reporduce the problem as follows:
    
    DMASEV: modify the event-interrupt resource, and if the INTEN sets
    function as interrupt, the DMAC will set irq<event_num> HIGH to
    generate interrupt. write INTCLR to clear interrupt.
    
    	DMA EXECUTING INSTRUCTS		DMA TERMINATE
    		|				|
    		|				|
    	       ...			      _stop
    		|				|
    		|			spin_lock_irqsave
    	     DMASEV				|
    		|				|
    		|			    mask INTEN
    		|				|
    		|			     DMAKILL
    		|				|
    		|			spin_unlock_irqrestore
    
    in above case, a interrupt was left, and if we unmask INTEN, the DMAC
    will set irq<event_num> HIGH to generate interrupt.
    
    to fix this, do as follows:
    
    	DMA EXECUTING INSTRUCTS		DMA TERMINATE
    		|				|
    		|				|
    	       ...			      _stop
    		|				|
    		|			spin_lock_irqsave
    	     DMASEV				|
    		|				|
    		|			     DMAKILL
    		|				|
    		|			   clear INTCLR
    		|			    mask INTEN
    		|				|
    		|			spin_unlock_irqrestore
    Signed-off-by: default avatarSugar Zhang <sugar.zhang@rock-chips.com>
    Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
    2da254cc
pl330.c 72 KB