00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _RTAI_ASM_M68KNOMMU_USI_H
00020 #define _RTAI_ASM_M68KNOMMU_USI_H
00021
00022 #define USI_SRQ_MASK 0xFFFFFFF0
00023
00024 #define _STARTUP_IRQ 1
00025 #define _SHUTDOWN_IRQ 2
00026 #define _ENABLE_IRQ 3
00027 #define _DISABLE_IRQ 4
00028 #define _MASK_AND_ACK_IRQ 5
00029 #define _ACK_IRQ 6
00030 #define _UNMASK_IRQ 7
00031 #define _DISINT 8
00032 #define _ENINT 9
00033 #define _SAVE_FLAGS_CLI 10
00034 #define _RESTORE_FLAGS 11
00035
00036 #ifdef __KERNEL__
00037
00038 #ifdef CONFIG_RTAI_USI
00039
00040 static void usi_cli(unsigned long arg, unsigned long *eflags)
00041 {
00042
00043 *eflags |= ~ALLOWINT;
00044 }
00045
00046 static void usi_sti(unsigned long arg, unsigned long *eflags)
00047 {
00048
00049 *eflags &= ALLOWINT;
00050 }
00051
00052 static unsigned long usi_save_flags_and_cli(unsigned long arg, unsigned long *eflags)
00053 {
00054 unsigned long flags = *eflags;
00055
00056 *eflags |= ~ALLOWINT;
00057 return flags;
00058 }
00059
00060 static void usi_restore_flags(unsigned long flags, unsigned long *eflags)
00061 {
00062
00063 if (!(flags & ~ALLOWINT)) {
00064
00065 *eflags &= ALLOWINT;
00066 } else {
00067
00068 *eflags |= ~ALLOWINT;
00069 }
00070 }
00071
00072 static unsigned long (*usi_fun_entry[ ])(unsigned long, unsigned long *) = {
00073 [_STARTUP_IRQ] = (void *)rt_startup_irq,
00074 [_SHUTDOWN_IRQ] = (void *)rt_shutdown_irq,
00075 [_ENABLE_IRQ] = (void *)rt_enable_irq,
00076 [_DISABLE_IRQ] = (void *)rt_disable_irq,
00077 [_MASK_AND_ACK_IRQ] = (void *)rt_mask_and_ack_irq,
00078 [_ACK_IRQ] = (void *)rt_ack_irq,
00079 [_UNMASK_IRQ] = (void *)rt_unmask_irq,
00080 [_DISINT] = (void *)usi_cli,
00081 [_ENINT] = (void *)usi_sti,
00082 [_SAVE_FLAGS_CLI] = (void *)usi_save_flags_and_cli,
00083 [_RESTORE_FLAGS] = (void *)usi_restore_flags
00084 };
00085
00086 #define IF_IS_A_USI_SRQ_CALL_IT(srq, args, retval, psr, retpath) \
00087 if (srq > USI_SRQ_MASK) { \
00088 unsigned long lsr = psr; \
00089 *retval = usi_fun_entry[srq & ~USI_SRQ_MASK](args, &(lsr)); \
00090 psr = (unsigned short)lsr; \
00091 return retpath; \
00092 }
00093 #else
00094
00095 #define IF_IS_A_USI_SRQ_CALL_IT(srq, args, retval, psr, retpath)
00096
00097 #endif
00098
00099 #endif
00100
00101 #endif