diff options
Diffstat (limited to 'firmware/target/arm/imx233/kernel-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/kernel-imx233.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/kernel-imx233.c b/firmware/target/arm/imx233/kernel-imx233.c index edb9b8366c..b59d3ed63f 100644 --- a/firmware/target/arm/imx233/kernel-imx233.c +++ b/firmware/target/arm/imx233/kernel-imx233.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include "kernel.h" | 21 | #include "kernel.h" |
22 | #include "timrot-imx233.h" | 22 | #include "timrot-imx233.h" |
23 | #include "clkctrl-imx233.h" | 23 | #include "clkctrl-imx233.h" |
24 | #include "kernel-imx233.h" | ||
24 | 25 | ||
25 | static void tick_timer(void) | 26 | static void tick_timer(void) |
26 | { | 27 | { |
@@ -35,3 +36,45 @@ void tick_start(unsigned int interval_in_ms) | |||
35 | HW_TIMROT_TIMCTRL__SELECT_1KHZ_XTAL, HW_TIMROT_TIMCTRL__PRESCALE_1, | 36 | HW_TIMROT_TIMCTRL__SELECT_1KHZ_XTAL, HW_TIMROT_TIMCTRL__PRESCALE_1, |
36 | false, &tick_timer); | 37 | false, &tick_timer); |
37 | } | 38 | } |
39 | |||
40 | |||
41 | void arbiter_init(struct channel_arbiter_t *a, unsigned count) | ||
42 | { | ||
43 | mutex_init(&a->mutex); | ||
44 | semaphore_init(&a->sema, count, count); | ||
45 | a->free_bm = (1 << count) - 1; | ||
46 | a->count = count; | ||
47 | } | ||
48 | |||
49 | // doesn't check in use ! | ||
50 | void arbiter_reserve(struct channel_arbiter_t *a, unsigned channel) | ||
51 | { | ||
52 | // assume semaphore has a free slot immediately | ||
53 | if(semaphore_wait(&a->sema, TIMEOUT_NOBLOCK) != OBJ_WAIT_SUCCEEDED) | ||
54 | panicf("arbiter_reserve failed on semaphore_wait !"); | ||
55 | mutex_lock(&a->mutex); | ||
56 | a->free_bm &= ~(1 << channel); | ||
57 | mutex_unlock(&a->mutex); | ||
58 | } | ||
59 | |||
60 | int arbiter_acquire(struct channel_arbiter_t *a, int timeout) | ||
61 | { | ||
62 | int w = semaphore_wait(&a->sema, timeout); | ||
63 | if(w == OBJ_WAIT_TIMEDOUT) | ||
64 | return w; | ||
65 | mutex_lock(&a->mutex); | ||
66 | int chan = find_first_set_bit(a->free_bm); | ||
67 | if(chan >= a->count) | ||
68 | panicf("arbiter_acquire cannot find a free channel !"); | ||
69 | a->free_bm &= ~(1 << chan); | ||
70 | mutex_unlock(&a->mutex); | ||
71 | return chan; | ||
72 | } | ||
73 | |||
74 | void arbiter_release(struct channel_arbiter_t *a, int channel) | ||
75 | { | ||
76 | mutex_lock(&a->mutex); | ||
77 | a->free_bm |= 1 << channel; | ||
78 | mutex_unlock(&a->mutex); | ||
79 | semaphore_release(&a->sema); | ||
80 | } | ||