summaryrefslogtreecommitdiff
path: root/firmware/target/arm/as3525/ascodec-as3525.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-03-02 08:49:38 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-03-02 08:49:38 +0000
commit12375d1d3aa41f7d277a9af584c7b810b636ec95 (patch)
treefc9ce8029a6910a8dac71b3bf60c71155a01eea4 /firmware/target/arm/as3525/ascodec-as3525.c
parent05e180a1308a095d51d51d0e047fcd44425ea88f (diff)
downloadrockbox-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.c27
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;
121static struct ascodec_request *req_head = NULL; 121static struct ascodec_request *req_head = NULL;
122static struct ascodec_request *req_tail = NULL; 122static struct ascodec_request *req_tail = NULL;
123 123
124static struct wakeup adc_wkup; 124static struct semaphore adc_done_sem;
125static struct ascodec_request as_audio_req; 125static 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)
312static void ascodec_req_init(struct ascodec_request *req, int type, 312static 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
340static 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
349static void ascodec_wait(struct ascodec_request *req) 340static 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
493void ascodec_wait_adc_finished(void) 484void 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