diff options
Diffstat (limited to 'arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c')
-rw-r--r-- | arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c b/arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c index 92d3fa4ebf6e..47611fe52743 100644 --- a/arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c +++ b/arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c @@ -33,6 +33,8 @@ /* **************************************************************************** * Include File Section *****************************************************************************/ +#include <linux/preempt.h> +#include <linux/hardirq.h> #include "epm.h" #include "iapiLow.h" @@ -118,8 +120,12 @@ iapi_ChangeCallbackISR(channelDescriptor *cd_p, */ void iapi_lowSynchChannel(unsigned char channel) { - while (!((1UL << channel) & iapi_SDMAIntr)) - ; + if (preempt_count() || in_interrupt()) { + while (!((1UL << channel) & iapi_SDMAIntr)) + ; + } else + GOTO_SLEEP(channel); + iapi_SDMAIntr &= ~(1UL << channel); } |