summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/kernel-imx233.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233/kernel-imx233.c')
-rw-r--r--firmware/target/arm/imx233/kernel-imx233.c43
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
25static void tick_timer(void) 26static 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
41void 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 !
50void 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
60int 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
74void 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}