aboutsummaryrefslogtreecommitdiffstats
path: root/arch/blackfin/mach-common/interrupt.S
diff options
context:
space:
mode:
authorBarry Song <barry.song@analog.com>2010-08-12 07:56:40 +0000
committerMike Frysinger <vapier@gentoo.org>2010-10-22 03:48:55 -0400
commit33ded95b1ca5ebd27a762cabaee63f50eb46dcd6 (patch)
treefe12da8aab11c04b7062be41efbdf75358bee50d /arch/blackfin/mach-common/interrupt.S
parentBlackfin: workaround anomaly 05000481 (corruption with ITEST MMRs) (diff)
downloadlinux-dev-33ded95b1ca5ebd27a762cabaee63f50eb46dcd6.tar.xz
linux-dev-33ded95b1ca5ebd27a762cabaee63f50eb46dcd6.zip
Blackfin: initial preempt support while returning from interrupt
Signed-off-by: Barry Song <barry.song@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to '')
-rw-r--r--arch/blackfin/mach-common/interrupt.S17
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/blackfin/mach-common/interrupt.S b/arch/blackfin/mach-common/interrupt.S
index cee62cf4acd4..2df37db3b49b 100644
--- a/arch/blackfin/mach-common/interrupt.S
+++ b/arch/blackfin/mach-common/interrupt.S
@@ -116,7 +116,24 @@ __common_int_entry:
cc = r0 == 0;
if cc jump .Lcommon_restore_context;
#else /* CONFIG_IPIPE */
+
+#ifdef CONFIG_PREEMPT
+ r7 = sp;
+ r4.l = lo(ALIGN_PAGE_MASK);
+ r4.h = hi(ALIGN_PAGE_MASK);
+ r7 = r7 & r4;
+ p5 = r7;
+ r7 = [p5 + TI_PREEMPT]; /* get preempt count */
+ r7 += 1; /* increment it */
+ [p5 + TI_PREEMPT] = r7;
+#endif
pseudo_long_call _do_irq, p2;
+
+#ifdef CONFIG_PREEMPT
+ r7 += -1;
+ [p5 + TI_PREEMPT] = r7; /* restore preempt count */
+#endif
+
SP += 12;
#endif /* CONFIG_IPIPE */
pseudo_long_call _return_from_int, p2;