diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2012-01-15 01:38:41 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2012-01-15 02:29:30 +0100 |
commit | 35ba39e57f3e1af32f4b3fd24ef633243b36d30e (patch) | |
tree | 8147420bdef1cc02eacd7eed5929570a1ecbb631 /firmware/target/arm/imx233/kernel-imx233.c | |
parent | 8cadb587e88797e7ff94a57464bac3a0bab3523a (diff) | |
download | rockbox-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.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 @@ #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); +} |