summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/lradc-imx233.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/imx233/lradc-imx233.c')
-rw-r--r--firmware/target/arm/imx233/lradc-imx233.c54
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"
25struct channel_arbiter_t
26{
27 struct semaphore sema;
28 struct mutex mutex;
29 unsigned free_bm;
30 int count;
31};
32
33static 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 !
42static 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
52static 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
66static 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 */
75struct channel_arbiter_t channel_arbiter; 27static struct channel_arbiter_t channel_arbiter;
76/* delay channels */ 28/* delay channels */
77struct channel_arbiter_t delay_arbiter; 29static struct channel_arbiter_t delay_arbiter;
78 30
79void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) 31void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src)
80{ 32{