summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/plat-mxc/sdma/iapi/src/iapiLow.c10
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);
}