summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/imx233/kernel-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2012-01-15 01:38:41 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2012-01-15 02:29:30 +0100
commit35ba39e57f3e1af32f4b3fd24ef633243b36d30e (patch)
tree8147420bdef1cc02eacd7eed5929570a1ecbb631 /firmware/target/arm/imx233/kernel-imx233.c
parent8cadb587e88797e7ff94a57464bac3a0bab3523a (diff)
downloadrockbox-35ba39e57f3e1af32f4b3fd24ef633243b36d30e.tar.gz
rockbox-35ba39e57f3e1af32f4b3fd24ef633243b36d30e.tar.bz2
rockbox-35ba39e57f3e1af32f4b3fd24ef633243b36d30e.zip
imx233: add DCP driver (only memcpy implemented), move channel arbiter to kernel-imx233
Change-Id: I2bc5a49459c354027fc67a880bbf3b87c942bdd0
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 @@
#include "kernel.h"
#include "timrot-imx233.h"
#include "clkctrl-imx233.h"
+#include "kernel-imx233.h"
static void tick_timer(void)
{
@@ -35,3 +36,45 @@ void tick_start(unsigned int interval_in_ms)
HW_TIMROT_TIMCTRL__SELECT_1KHZ_XTAL, HW_TIMROT_TIMCTRL__PRESCALE_1,
false, &tick_timer);
}
+
+
+void arbiter_init(struct channel_arbiter_t *a, unsigned count)
+{
+ mutex_init(&a->mutex);
+ semaphore_init(&a->sema, count, count);
+ a->free_bm = (1 << count) - 1;
+ a->count = count;
+}
+
+// doesn't check in use !
+void arbiter_reserve(struct channel_arbiter_t *a, unsigned channel)
+{
+ // assume semaphore has a free slot immediately
+ if(semaphore_wait(&a->sema, TIMEOUT_NOBLOCK) != OBJ_WAIT_SUCCEEDED)
+ panicf("arbiter_reserve failed on semaphore_wait !");
+ mutex_lock(&a->mutex);
+ a->free_bm &= ~(1 << channel);
+ mutex_unlock(&a->mutex);
+}
+
+int arbiter_acquire(struct channel_arbiter_t *a, int timeout)
+{
+ int w = semaphore_wait(&a->sema, timeout);
+ if(w == OBJ_WAIT_TIMEDOUT)
+ return w;
+ mutex_lock(&a->mutex);
+ int chan = find_first_set_bit(a->free_bm);
+ if(chan >= a->count)
+ panicf("arbiter_acquire cannot find a free channel !");
+ a->free_bm &= ~(1 << chan);
+ mutex_unlock(&a->mutex);
+ return chan;
+}
+
+void arbiter_release(struct channel_arbiter_t *a, int channel)
+{
+ mutex_lock(&a->mutex);
+ a->free_bm |= 1 << channel;
+ mutex_unlock(&a->mutex);
+ semaphore_release(&a->sema);
+}