OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [include/] [asm-or32/] [semaphore.h] - Blame information for rev 7

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 7 xianfeng
/*
2
 * Based on:
3
 * include/asm-cris/semaphore.h
4
 */
5
 
6
#ifndef _OR32_SEMAPHORE_H
7
#define _OR32_SEMAPHORE_H
8
 
9
#define RW_LOCK_BIAS             0x01000000
10
 
11
#include <linux/wait.h>
12
#include <linux/spinlock.h>
13
#include <linux/rwsem.h>
14
 
15
#include <asm/system.h>
16
#include <asm/atomic.h>
17
 
18
int printk(const char *fmt, ...);
19
 
20
struct semaphore {
21
        atomic_t count;
22
        atomic_t waking;
23
        wait_queue_head_t wait;
24
};
25
 
26
#define __SEMAPHORE_INITIALIZER(name, n)                                \
27
{                                                                       \
28
        .count          = ATOMIC_INIT(n),                               \
29
        .waking         = ATOMIC_INIT(0),                                \
30
        .wait           = __WAIT_QUEUE_HEAD_INITIALIZER((name).wait)    \
31
}
32
#if 0 /*RGD*/
33
#define __MUTEX_INITIALIZER(name) \
34
        __SEMAPHORE_INITIALIZER(name,1)
35
#endif /*RGD*/
36
#define __DECLARE_SEMAPHORE_GENERIC(name,count) \
37
        struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
38
 
39
#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
40
#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
41
 
42
extern inline void sema_init(struct semaphore *sem, int val)
43
{
44
        *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val);
45
}
46
 
47
extern inline void init_MUTEX (struct semaphore *sem)
48
{
49
        sema_init(sem, 1);
50
}
51
 
52
extern inline void init_MUTEX_LOCKED (struct semaphore *sem)
53
{
54
        sema_init(sem, 0);
55
}
56
 
57
extern void __down(struct semaphore * sem);
58
extern int __down_interruptible(struct semaphore * sem);
59
extern int __down_trylock(struct semaphore * sem);
60
extern void __up(struct semaphore * sem);
61
 
62
/* notice - we probably can do cli/sti here instead of saving */
63
 
64
extern inline void down(struct semaphore * sem)
65
{
66
        unsigned long flags;
67
        int failed;
68
 
69
        might_sleep();
70
 
71
        /* atomically decrement the semaphores count, and if its negative, we wait */
72
        local_irq_save(flags);
73
        failed = --(sem->count.counter) < 0;
74
        local_irq_restore(flags);
75
        if(failed) {
76
                __down(sem);
77
        }
78
}
79
 
80
/*
81
 * This version waits in interruptible state so that the waiting
82
 * process can be killed.  The down_interruptible routine
83
 * returns negative for signalled and zero for semaphore acquired.
84
 */
85
 
86
extern inline int down_interruptible(struct semaphore * sem)
87
{
88
        unsigned long flags;
89
        int failed;
90
 
91
        might_sleep();
92
 
93
        /* atomically decrement the semaphores count, and if its negative, we wait */
94
        local_irq_save(flags);
95
        failed = --(sem->count.counter) < 0;
96
        local_irq_restore(flags);
97
        if(failed)
98
                failed = __down_interruptible(sem);
99
        return(failed);
100
}
101
 
102
extern inline int down_trylock(struct semaphore * sem)
103
{
104
        unsigned long flags;
105
        int failed;
106
 
107
        local_irq_save(flags);
108
        failed = --(sem->count.counter) < 0;
109
        local_irq_restore(flags);
110
        if(failed)
111
                failed = __down_trylock(sem);
112
        return(failed);
113
 
114
}
115
 
116
/*
117
 * Note! This is subtle. We jump to wake people up only if
118
 * the semaphore was negative (== somebody was waiting on it).
119
 * The default case (no contention) will result in NO
120
 * jumps for both down() and up().
121
 */
122
extern inline void up(struct semaphore * sem)
123
{
124
        unsigned long flags;
125
        int wakeup;
126
 
127
        /* atomically increment the semaphores count, and if it was negative, we wake people */
128
        local_irq_save(flags);
129
        wakeup = ++(sem->count.counter) <= 0;
130
        local_irq_restore(flags);
131
        if(wakeup) {
132
                __up(sem);
133
        }
134
}
135
 
136
 
137
#endif /* _OR32_SEMAPHORE_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.