• Adrian Hunter's avatar
    omap_hsmmc: improve interrupt synchronisation · b417577d
    Adrian Hunter authored
    The following changes were needed:
    	- do not use in_interrupt() because it will not work
    	with threaded interrupts
    
    In addition, the following improvements were made:
    	- ensure DMA is unmapped only after the final DMA interrupt
    	- ensure a request is completed only after the final DMA interrupt
    	- disable controller interrupts when a request is not in progress
    	- remove the spin-lock protecting the start of a new request from
    	an unexpected interrupt because the locking was complicated and
    	a 'req_in_progress' flag suffices (since the spin-lock only defers
    	the unexpected interrupts anyway)
    	- instead use the spin-lock to protect the MMC interrupt handler
    	from the DMA interrupt handler
    	- remove the semaphore preventing DMA from being started while
    	the previous DMA is still in progress - the other changes make that
    	impossible, so it is now a BUG_ON condition
    	- ensure the controller interrupt status is clear before exiting
    	the interrrupt handler
    
    In general, these changes make the code safer but do not fix any specific
    bugs so backporting is not necessary.
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@nokia.com>
    Tested-by: default avatarVenkatraman S <svenkatr@ti.com>
    Acked-by: default avatarMadhusudhan Chikkature <madhu.cr@ti.com>
    Acked-by: default avatarTony Lindgren <tony@atomide.com>
    Cc: <linux-mmc@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b417577d
omap_hsmmc.c 58 KB