diff options
Diffstat (limited to 'firmware/target/arm/imx233/lradc-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/lradc-imx233.c | 54 |
1 files changed, 3 insertions, 51 deletions
diff --git a/firmware/target/arm/imx233/lradc-imx233.c b/firmware/target/arm/imx233/lradc-imx233.c index 8b065bffea..432d1c1035 100644 --- a/firmware/target/arm/imx233/lradc-imx233.c +++ b/firmware/target/arm/imx233/lradc-imx233.c | |||
@@ -21,60 +21,12 @@ | |||
21 | #include "system.h" | 21 | #include "system.h" |
22 | #include "system-target.h" | 22 | #include "system-target.h" |
23 | #include "lradc-imx233.h" | 23 | #include "lradc-imx233.h" |
24 | 24 | #include "kernel-imx233.h" | |
25 | struct channel_arbiter_t | ||
26 | { | ||
27 | struct semaphore sema; | ||
28 | struct mutex mutex; | ||
29 | unsigned free_bm; | ||
30 | int count; | ||
31 | }; | ||
32 | |||
33 | static void arbiter_init(struct channel_arbiter_t *a, unsigned count) | ||
34 | { | ||
35 | mutex_init(&a->mutex); | ||
36 | semaphore_init(&a->sema, count, count); | ||
37 | a->free_bm = (1 << count) - 1; | ||
38 | a->count = count; | ||
39 | } | ||
40 | |||
41 | // doesn't check in use ! | ||
42 | static void arbiter_reserve(struct channel_arbiter_t *a, unsigned channel) | ||
43 | { | ||
44 | // assume semaphore has a free slot immediately | ||
45 | if(semaphore_wait(&a->sema, TIMEOUT_NOBLOCK) != OBJ_WAIT_SUCCEEDED) | ||
46 | panicf("arbiter_reserve failed on semaphore_wait !"); | ||
47 | mutex_lock(&a->mutex); | ||
48 | a->free_bm &= ~(1 << channel); | ||
49 | mutex_unlock(&a->mutex); | ||
50 | } | ||
51 | |||
52 | static int arbiter_acquire(struct channel_arbiter_t *a, int timeout) | ||
53 | { | ||
54 | int w = semaphore_wait(&a->sema, timeout); | ||
55 | if(w == OBJ_WAIT_TIMEDOUT) | ||
56 | return w; | ||
57 | mutex_lock(&a->mutex); | ||
58 | int chan = find_first_set_bit(a->free_bm); | ||
59 | if(chan >= a->count) | ||
60 | panicf("arbiter_acquire cannot find a free channel !"); | ||
61 | a->free_bm &= ~(1 << chan); | ||
62 | mutex_unlock(&a->mutex); | ||
63 | return chan; | ||
64 | } | ||
65 | |||
66 | static void arbiter_release(struct channel_arbiter_t *a, int channel) | ||
67 | { | ||
68 | mutex_lock(&a->mutex); | ||
69 | a->free_bm |= 1 << channel; | ||
70 | mutex_unlock(&a->mutex); | ||
71 | semaphore_release(&a->sema); | ||
72 | } | ||
73 | 25 | ||
74 | /* channels */ | 26 | /* channels */ |
75 | struct channel_arbiter_t channel_arbiter; | 27 | static struct channel_arbiter_t channel_arbiter; |
76 | /* delay channels */ | 28 | /* delay channels */ |
77 | struct channel_arbiter_t delay_arbiter; | 29 | static struct channel_arbiter_t delay_arbiter; |
78 | 30 | ||
79 | void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) | 31 | void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) |
80 | { | 32 | { |