• Jon Hunter's avatar
    dmaengine: tegra-apb: Simplify locking for device using global pause · 23a1ec30
    Jon Hunter authored
    Sparse reports the following with regard to locking in the
    tegra_dma_global_pause() and tegra_dma_global_resume() functions:
    
    drivers/dma/tegra20-apb-dma.c:362:9: warning: context imbalance in
    	'tegra_dma_global_pause' - wrong count at exit
    drivers/dma/tegra20-apb-dma.c:366:13: warning: context imbalance in
    	'tegra_dma_global_resume' - unexpected unlock
    
    The warning is caused because tegra_dma_global_pause() acquires a lock
    but does not release it. However, the lock is released by
    tegra_dma_global_resume(). These pause/resume functions are called in
    pairs and so it does appear to work.
    
    This global pause is used on early tegra devices that do not have an
    individual pause for each channel. The lock appears to be used to ensure
    that multiple channels do not attempt to assert/de-assert the global pause
    at the same time which could cause the DMA controller to be in the wrong
    paused state. Rather than locking around the entire code between the pause
    and resume, employ a simple counter to keep track of the global pause
    requests. By using a counter, it is only necessary to hold the lock when
    pausing and unpausing the DMA controller and hence, fixes the sparse
    warning.
    
    Please note that for devices that support individual channel pausing, the
    DMA controller lock is not held between pausing and unpausing the channel.
    Hence, this change will make the devices that use the global pause behave
    in the same way, with regard to locking, as those that don't.
    Signed-off-by: default avatarJon Hunter <jonathanh@nvidia.com>
    Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
    23a1ec30
tegra20-apb-dma.c 44.4 KB