base/include/rtai_usi.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
#ifndef _RTAI_USI_H
00020
#define _RTAI_USI_H
00021
00022
#ifndef __KERNEL__
00023
00024
#include <asm/rtai_usi.h>
00025
00026
#include <asm/rtai_srq.h>
00027
00028
#ifdef __cplusplus
00029
extern "C" {
00030
#endif
00031
00032 static inline int rt_startup_irq(
unsigned int irq)
00033 {
00034
return (
int)
rtai_srq(
USI_SRQ_MASK |
_STARTUP_IRQ, irq);
00035 }
00036
00037 #define rt_shutdown_irq(irq) \
00038
do { rtai_srq(USI_SRQ_MASK | _SHUTDOWN_IRQ, irq); } while (0)
00039
00040 #define rt_enable_irq(irq) \
00041
do { rtai_srq(USI_SRQ_MASK | _ENABLE_IRQ, irq); } while (0)
00042
00043 #define rt_disable_irq(irq) \
00044
do { rtai_srq(USI_SRQ_MASK | _DISABLE_IRQ, irq); } while (0)
00045
00046 #define rt_mask_and_ack_irq(irq) \
00047
do { rtai_srq(USI_SRQ_MASK | _MASK_AND_ACK_IRQ, irq); } while (0)
00048
00049 #define rt_ack_irq(irq) \
00050
do { rtai_srq(USI_SRQ_MASK | _ACK_IRQ, irq); } while (0)
00051
00052 #define rt_unmask_irq(irq) \
00053
do { rtai_srq(USI_SRQ_MASK | _UNMASK_IRQ, irq); } while (0)
00054
00055 #define rtai_cli() \
00056
do { rtai_srq(USI_SRQ_MASK | _DISINT, 0); } while (0)
00057
00058 #define rtai_sti() \
00059
do { rtai_srq(USI_SRQ_MASK | _ENINT, 0); } while (0)
00060
00061 #define rtai_save_flags_and_cli(flags) \
00062
do { flags = (unsigned long)rtai_srq(USI_SRQ_MASK | _SAVE_FLAGS_CLI, 0); } while(0)
00063
00064 #define rtai_restore_flags(flags) \
00065
do { rtai_srq(USI_SRQ_MASK | _RESTORE_FLAGS, flags); } while (0)
00066
00067
#ifdef CONFIG_SMP
00068
00069
struct __usi_xchg_dummy {
unsigned long a[100]; };
00070
#define __usi_xg(x) ((struct __usi_xchg_dummy *)(x))
00071
00072
static inline unsigned long usi_atomic_cmpxchg(
volatile void *ptr,
unsigned long o,
unsigned long n)
00073 {
00074
unsigned long prev;
00075 __asm__ __volatile__ (
"lock; cmpxchgl %1, %2"
00076 :
"=a" (prev)
00077 :
"q"(n),
"m" (*__usi_xg(ptr)),
"0" (o)
00078 :
"memory");
00079
return prev;
00080 }
00081
00082
#define rt_spin_lock(lock) \
00083
do { while (usi_atomic_cmpxchg(lock, 0, 1)); } while (0)
00084
00085
#define rt_spin_unlock(lock) \
00086
do { *(volatile int *)lock = 0; } while (0)
00087
00088
#else
00089 #define rt_spin_lock(lock);
00090
00091 #define rt_spin_unlock(lock);
00092
#endif
00093
00094 #define rt_spin_lock_init(lock) \
00095
do { *(volatile int *)lock = 0; } while (0)
00096
00097 #define rt_spin_lock_irq(lock) \
00098
do { rtai_cli(); rt_spin_lock(lock); } while (0)
00099
00100 #define rt_spin_unlock_irq(lock) \
00101
do { rt_spin_unlock(lock); rtai_sti(); } while (0)
00102
00103 static inline unsigned long rt_spin_lock_irqsave(
void *lock)
00104 {
00105
unsigned long flags;
00106
rtai_save_flags_and_cli(
flags);
00107
rt_spin_lock(lock);
00108
return flags;
00109 }
00110
00111 #define rt_spin_unlock_irqrestore(flags, lock) \
00112
do { rt_spin_unlock(lock); rtai_restore_flags(flags); } while (0)
00113
00114
#ifdef __cplusplus
00115
}
00116
#endif
00117
00118
#endif
00119
00120
#endif
Generated on Thu Nov 20 11:49:49 2008 for RTAI API by
1.3.8