summaryrefslogtreecommitdiff
path: root/firmware/drivers/tuner/si4700.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers/tuner/si4700.c')
-rw-r--r--firmware/drivers/tuner/si4700.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/firmware/drivers/tuner/si4700.c b/firmware/drivers/tuner/si4700.c
index 6966891a38..a5b004aef4 100644
--- a/firmware/drivers/tuner/si4700.c
+++ b/firmware/drivers/tuner/si4700.c
@@ -304,9 +304,20 @@ static void si4700_sleep(int snooze)
304 POWERCFG_DISABLE | POWERCFG_ENABLE); 304 POWERCFG_DISABLE | POWERCFG_ENABLE);
305 /* Bits self-clear once placed in powerdown. */ 305 /* Bits self-clear once placed in powerdown. */
306 cache[POWERCFG] &= ~(POWERCFG_DISABLE | POWERCFG_ENABLE); 306 cache[POWERCFG] &= ~(POWERCFG_DISABLE | POWERCFG_ENABLE);
307
308 tuner_power(false);
307 } 309 }
308 else 310 else
309 { 311 {
312 tuner_power(true);
313 /* read all registers */
314 si4700_read(16);
315#ifdef SI4700_USE_INTERNAL_OSCILLATOR
316 /* Enable the internal oscillator
317 (Si4702-16 needs this register to be initialised to 0x100) */
318 si4700_write_set(TEST1, TEST1_XOSCEN | 0x100);
319 sleep(HZ/2);
320#endif
310 /** power up **/ 321 /** power up **/
311 /* ENABLE high, DISABLE low */ 322 /* ENABLE high, DISABLE low */
312 si4700_write_masked(POWERCFG, POWERCFG_ENABLE, 323 si4700_write_masked(POWERCFG, POWERCFG_ENABLE,
@@ -354,26 +365,9 @@ bool si4700_detect(void)
354 365
355void si4700_init(void) 366void si4700_init(void)
356{ 367{
368 mutex_init(&fmr_mutex);
357 /* check device id */ 369 /* check device id */
358 if (si4700_detect()) { 370 if (si4700_detect()) {
359 mutex_init(&fmr_mutex);
360
361 tuner_power(true);
362
363 /* read all registers */
364 si4700_read(16);
365 si4700_sleep(0);
366
367#ifdef SI4700_USE_INTERNAL_OSCILLATOR
368 /* Enable the internal oscillator
369 (Si4702-16 needs this register to be initialised to 0x100) */
370 si4700_write_set(TEST1, TEST1_XOSCEN | 0x100);
371 sleep(HZ/2);
372#endif
373
374 si4700_sleep(1);
375 tuner_power(false);
376
377#ifdef HAVE_RDS_CAP 371#ifdef HAVE_RDS_CAP
378 si4700_rds_init(); 372 si4700_rds_init();
379#endif 373#endif
@@ -445,6 +439,9 @@ int si4700_set(int setting, int value)
445{ 439{
446 int val = 1; 440 int val = 1;
447 441
442 if(!tuner_powered() && setting != RADIO_SLEEP)
443 return -1;
444
448 mutex_lock(&fmr_mutex); 445 mutex_lock(&fmr_mutex);
449 446
450 switch(setting) 447 switch(setting)
@@ -483,7 +480,7 @@ int si4700_set(int setting, int value)
483 si4700_write_masked(POWERCFG, value ? POWERCFG_MONO : 0, 480 si4700_write_masked(POWERCFG, value ? POWERCFG_MONO : 0,
484 POWERCFG_MONO); 481 POWERCFG_MONO);
485 break; 482 break;
486 483
487 default: 484 default:
488 val = -1; 485 val = -1;
489 break; 486 break;
@@ -499,12 +496,15 @@ int si4700_get(int setting)
499{ 496{
500 int val = -1; /* default for unsupported query */ 497 int val = -1; /* default for unsupported query */
501 498
499 if(!tuner_powered() && setting != RADIO_PRESENT)
500 return -1;
501
502 mutex_lock(&fmr_mutex); 502 mutex_lock(&fmr_mutex);
503 503
504 switch(setting) 504 switch(setting)
505 { 505 {
506 case RADIO_PRESENT: 506 case RADIO_PRESENT:
507 val = tuner_present ? 1 : 0; 507 val = tuner_present;
508 break; 508 break;
509 509
510 case RADIO_TUNED: 510 case RADIO_TUNED:
@@ -526,7 +526,7 @@ int si4700_get(int setting)
526 case RADIO_RSSI_MAX: 526 case RADIO_RSSI_MAX:
527 val = RSSI_MAX; 527 val = RSSI_MAX;
528 break; 528 break;
529 529
530#ifdef HAVE_RDS_CAP 530#ifdef HAVE_RDS_CAP
531 case RADIO_EVENT: 531 case RADIO_EVENT:
532 { 532 {