Move radio power handling from apps/ to drivers.

Remove direct calls to tuner_power(...) in apps/ and let
the driver manage tuner power with the RADIO_SLEEP setting.

Change-Id: I37cd0472e60db5d666dae1b9fe4755dd65c03edd
Reviewed-on: http://gerrit.rockbox.org/84
Reviewed-by: Amaury Pouly <amaury.pouly@gmail.com>
This commit is contained in:
Amaury Pouly 2012-02-05 15:58:10 +01:00
parent 58b226edc5
commit 906e90eb7b
8 changed files with 39 additions and 41 deletions

View file

@ -192,9 +192,6 @@ void radio_start(void)
/* clear flag before any yielding */
radio_status &= ~FMRADIO_START_PAUSED;
if(radio_status == FMRADIO_OFF)
tuner_power(true);
curr_freq = global_status.last_frequency * fmr->freq_step + fmr->freq_min;
tuner_set(RADIO_SLEEP, 0); /* wake up the tuner */
@ -246,9 +243,6 @@ void radio_pause(void)
}
tuner_set(RADIO_MUTE, 1);
/* For si4700: 2==this is really 'pause'. other tuners treat it
* like 'bool'. */
tuner_set(RADIO_SLEEP, 2);
radio_status = FMRADIO_PAUSED;
} /* radio_pause */
@ -258,7 +252,6 @@ static void radio_off(void)
tuner_set(RADIO_MUTE, 1);
tuner_set(RADIO_SLEEP, 1); /* low power mode, if available */
radio_status = FMRADIO_OFF;
tuner_power(false); /* status update, power off if avail. */
}
void radio_stop(void)

View file

@ -31,8 +31,6 @@
#include "settings.h"
#include "power.h"
static bool powered = false;
static unsigned char tuner_param = 0x00, old_tuner_param = 0xFF;
/* temp var for tests to avoid looping execution in submenus settings*/
static int mono_mode = -1, old_region = -1;
@ -150,7 +148,6 @@ static void rmt_tuner_scan(int param)
iap_send_pkt(data1, sizeof(data1));
}
#if 0 /* function is not used */
static void rmt_tuner_mute(int value)
{
/* mute flag off (play) */
@ -162,7 +159,6 @@ static void rmt_tuner_mute(int value)
}
iap_send_pkt(data, sizeof(data));
}
#endif
static void rmt_tuner_region(int region)
{
@ -362,7 +358,7 @@ int ipod_rmt_tuner_set(int setting, int value)
case RADIO_MUTE:
{
/* mute flag sent to accessory */
/* rmt_tuner_mute(value); */
rmt_tuner_mute(value);
break;
}
@ -453,10 +449,3 @@ char* ipod_get_rds_info(int setting)
}
return text;
}
bool tuner_power(bool status)
{
bool oldstatus = powered;
powered = status;
return oldstatus;
}

View file

@ -740,6 +740,8 @@ static int sd_setcmp(int regval)
static void set_sleep(bool sleep)
{
if (sleep)
tuner_power(false);
if (sleep || tuner_awake())
return;
@ -747,6 +749,7 @@ static void set_sleep(bool sleep)
(TUNER_PRESENT | TUNER_POWERED))
return;
tuner_power(true);
enable_afc(false);
/* 2. Calibrate the IF frequency at 110 kHz: */

View file

@ -177,9 +177,12 @@ static void rda5802_sleep(int snooze)
rda5802_write_clear(POWERCFG, POWERCFG_ENABLE);
}
else {
tuner_power(true);
rda5802_write_set(POWERCFG, POWERCFG_ENABLE);
}
rda5802_write_cache();
if(snooze)
tuner_power(false);
}
bool rda5802_detect(void)

View file

@ -47,12 +47,16 @@ int s1a0903x01_set(int setting, int value)
{
case RADIO_SLEEP:
if (!value)
{ /* wakeup: just unit */
{
tuner_power(true);
/* wakeup: just unit */
fm_in1 = DEFAULT_IN1;
fm_in2 = DEFAULT_IN2;
fmradio_set(1, fm_in1);
fmradio_set(2, fm_in2);
}
else
tuner_power(false);
/* else we have no sleep mode? */
break;

View file

@ -304,9 +304,20 @@ static void si4700_sleep(int snooze)
POWERCFG_DISABLE | POWERCFG_ENABLE);
/* Bits self-clear once placed in powerdown. */
cache[POWERCFG] &= ~(POWERCFG_DISABLE | POWERCFG_ENABLE);
tuner_power(false);
}
else
{
tuner_power(true);
/* read all registers */
si4700_read(16);
#ifdef SI4700_USE_INTERNAL_OSCILLATOR
/* Enable the internal oscillator
(Si4702-16 needs this register to be initialised to 0x100) */
si4700_write_set(TEST1, TEST1_XOSCEN | 0x100);
sleep(HZ/2);
#endif
/** power up **/
/* ENABLE high, DISABLE low */
si4700_write_masked(POWERCFG, POWERCFG_ENABLE,
@ -354,26 +365,9 @@ bool si4700_detect(void)
void si4700_init(void)
{
mutex_init(&fmr_mutex);
/* check device id */
if (si4700_detect()) {
mutex_init(&fmr_mutex);
tuner_power(true);
/* read all registers */
si4700_read(16);
si4700_sleep(0);
#ifdef SI4700_USE_INTERNAL_OSCILLATOR
/* Enable the internal oscillator
(Si4702-16 needs this register to be initialised to 0x100) */
si4700_write_set(TEST1, TEST1_XOSCEN | 0x100);
sleep(HZ/2);
#endif
si4700_sleep(1);
tuner_power(false);
#ifdef HAVE_RDS_CAP
si4700_rds_init();
#endif
@ -445,6 +439,9 @@ int si4700_set(int setting, int value)
{
int val = 1;
if(!tuner_powered() && setting != RADIO_SLEEP)
return -1;
mutex_lock(&fmr_mutex);
switch(setting)
@ -499,12 +496,15 @@ int si4700_get(int setting)
{
int val = -1; /* default for unsupported query */
if(!tuner_powered() && setting != RADIO_PRESENT)
return -1;
mutex_lock(&fmr_mutex);
switch(setting)
{
case RADIO_PRESENT:
val = tuner_present ? 1 : 0;
val = tuner_present;
break;
case RADIO_TUNED:

View file

@ -61,8 +61,10 @@ int tea5760_set(int setting, int value)
if (value) {
/* sleep / standby mode */
tea5760_set_clear(3, (1<<6), 0);
tuner_power(false);
}
else {
tuner_power(true);
/* active mode */
tea5760_set_clear(3, (1<<6), 1);
/* disable hard mute */

View file

@ -106,7 +106,11 @@ int tea5767_set(int setting, int value)
return -1;
}
if(setting == RADIO_SLEEP && !value)
tuner_power(true); /* wakeup */
fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
if(setting == RADIO_SLEEP && value)
tuner_power(false); /* sleep */
return 1;
}