diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2011-03-02 08:49:38 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2011-03-02 08:49:38 +0000 |
commit | 12375d1d3aa41f7d277a9af584c7b810b636ec95 (patch) | |
tree | fc9ce8029a6910a8dac71b3bf60c71155a01eea4 /firmware/target/arm/as3525/ascodec-as3525.c | |
parent | 05e180a1308a095d51d51d0e047fcd44425ea88f (diff) | |
download | rockbox-12375d1d3aa41f7d277a9af584c7b810b636ec95.tar.gz rockbox-12375d1d3aa41f7d277a9af584c7b810b636ec95.zip |
Merge functionality of wakeups and semaphores-- fewer APIs and object types. semaphore_wait takes a timeout now so codecs and plugins have to be made incompatible. Don't make semaphores for targets not using them.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29492 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/as3525/ascodec-as3525.c')
-rw-r--r-- | firmware/target/arm/as3525/ascodec-as3525.c | 27 |
1 files changed, 9 insertions, 18 deletions
diff --git a/firmware/target/arm/as3525/ascodec-as3525.c b/firmware/target/arm/as3525/ascodec-as3525.c index 822d48e241..39658c0637 100644 --- a/firmware/target/arm/as3525/ascodec-as3525.c +++ b/firmware/target/arm/as3525/ascodec-as3525.c | |||
@@ -107,7 +107,7 @@ struct ascodec_request { | |||
107 | unsigned char status; | 107 | unsigned char status; |
108 | unsigned char cnt; | 108 | unsigned char cnt; |
109 | unsigned char data[ASCODEC_REQ_MAXLEN]; | 109 | unsigned char data[ASCODEC_REQ_MAXLEN]; |
110 | struct wakeup wkup; | 110 | struct semaphore complete; |
111 | ascodec_cb_fn *callback; | 111 | ascodec_cb_fn *callback; |
112 | struct ascodec_request *next; | 112 | struct ascodec_request *next; |
113 | }; | 113 | }; |
@@ -121,7 +121,7 @@ static unsigned char *req_data_ptr = NULL; | |||
121 | static struct ascodec_request *req_head = NULL; | 121 | static struct ascodec_request *req_head = NULL; |
122 | static struct ascodec_request *req_tail = NULL; | 122 | static struct ascodec_request *req_tail = NULL; |
123 | 123 | ||
124 | static struct wakeup adc_wkup; | 124 | static struct semaphore adc_done_sem; |
125 | static struct ascodec_request as_audio_req; | 125 | static struct ascodec_request as_audio_req; |
126 | 126 | ||
127 | #ifdef DEBUG | 127 | #ifdef DEBUG |
@@ -168,7 +168,7 @@ static void ascodec_finish_req(struct ascodec_request *req) | |||
168 | if (req->callback) { | 168 | if (req->callback) { |
169 | req->callback(req->data, req_data_ptr - req->data); | 169 | req->callback(req->data, req_data_ptr - req->data); |
170 | } | 170 | } |
171 | wakeup_signal(&req->wkup); | 171 | semaphore_release(&req->complete); |
172 | 172 | ||
173 | req_head = req->next; | 173 | req_head = req->next; |
174 | req->next = NULL; | 174 | req->next = NULL; |
@@ -263,7 +263,7 @@ void ascodec_init(void) | |||
263 | int prescaler; | 263 | int prescaler; |
264 | 264 | ||
265 | mutex_init(&as_mtx); | 265 | mutex_init(&as_mtx); |
266 | wakeup_init(&adc_wkup); | 266 | semaphore_init(&adc_done_sem, 1, 0); |
267 | 267 | ||
268 | /* enable clock */ | 268 | /* enable clock */ |
269 | bitset32(&CGU_PERI, CGU_I2C_AUDIO_MASTER_CLOCK_ENABLE); | 269 | bitset32(&CGU_PERI, CGU_I2C_AUDIO_MASTER_CLOCK_ENABLE); |
@@ -312,7 +312,7 @@ void ascodec_init(void) | |||
312 | static void ascodec_req_init(struct ascodec_request *req, int type, | 312 | static void ascodec_req_init(struct ascodec_request *req, int type, |
313 | unsigned int index, unsigned int cnt) | 313 | unsigned int index, unsigned int cnt) |
314 | { | 314 | { |
315 | wakeup_init(&req->wkup); | 315 | semaphore_init(&req->complete, 1, 0); |
316 | req->next = NULL; | 316 | req->next = NULL; |
317 | req->callback = NULL; | 317 | req->callback = NULL; |
318 | req->type = type; | 318 | req->type = type; |
@@ -337,19 +337,10 @@ static void ascodec_submit(struct ascodec_request *req) | |||
337 | restore_irq(oldlevel); | 337 | restore_irq(oldlevel); |
338 | } | 338 | } |
339 | 339 | ||
340 | static int irq_disabled(void) | ||
341 | { | ||
342 | unsigned long cpsr; | ||
343 | |||
344 | asm volatile ("mrs %0, cpsr" : "=r"(cpsr)); | ||
345 | |||
346 | return (cpsr & IRQ_STATUS) == IRQ_DISABLED; | ||
347 | } | ||
348 | |||
349 | static void ascodec_wait(struct ascodec_request *req) | 340 | static void ascodec_wait(struct ascodec_request *req) |
350 | { | 341 | { |
351 | if (!irq_disabled()) { | 342 | if (irq_enabled()) { |
352 | wakeup_wait(&req->wkup, TIMEOUT_BLOCK); | 343 | semaphore_wait(&req->complete, TIMEOUT_BLOCK); |
353 | return; | 344 | return; |
354 | } | 345 | } |
355 | 346 | ||
@@ -477,7 +468,7 @@ static void ascodec_read_cb(unsigned const char *data, unsigned int len) | |||
477 | } | 468 | } |
478 | if (data[2] & IRQ_ADC) { /* adc finished */ | 469 | if (data[2] & IRQ_ADC) { /* adc finished */ |
479 | IFDEBUG(int_adc++); | 470 | IFDEBUG(int_adc++); |
480 | wakeup_signal(&adc_wkup); | 471 | semaphore_release(&adc_done_sem); |
481 | } | 472 | } |
482 | VIC_INT_ENABLE = INTERRUPT_AUDIO; | 473 | VIC_INT_ENABLE = INTERRUPT_AUDIO; |
483 | } | 474 | } |
@@ -492,7 +483,7 @@ void INT_AUDIO(void) | |||
492 | 483 | ||
493 | void ascodec_wait_adc_finished(void) | 484 | void ascodec_wait_adc_finished(void) |
494 | { | 485 | { |
495 | wakeup_wait(&adc_wkup, TIMEOUT_BLOCK); | 486 | semaphore_wait(&adc_done_sem, TIMEOUT_BLOCK); |
496 | } | 487 | } |
497 | 488 | ||
498 | #ifdef CONFIG_CHARGING | 489 | #ifdef CONFIG_CHARGING |