Commit ad3499f4 authored by Giuliano Pochini's avatar Giuliano Pochini Committed by Takashi Iwai

ALSA: Echoaudio - Add suspend support #1

Move the controls init code outside the init_hw() function because is must
not be called during resume.

This patch moves the code that initializes the card's controls with
default valued from the init_hw() function into a separated
set_mixer_defaults() function (one for each of the 16 supported
cards). This change is necessary because during resume we must
resurrect the hardware without losing the previous
settings. set_mixer_defaults() must be called only once when the
module is loaded.
Signed-off-by: default avatarGiuliano Pochini <pochini@shiny.it>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 4f8ada44
...@@ -57,15 +57,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -57,15 +57,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
/* The Darla20 has no external clock sources */ /* The Darla20 has no external clock sources */
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
......
...@@ -56,15 +56,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -56,15 +56,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
u32 clocks_from_dsp, clock_bits; u32 clocks_from_dsp, clock_bits;
......
...@@ -97,23 +97,21 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -97,23 +97,21 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
chip->digital_modes = ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA | chip->digital_modes = ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL | ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
ECHOCAPS_HAS_DIGITAL_MODE_ADAT; ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
DE_INIT(("init_hw done\n"));
return err;
}
static int set_mixer_defaults(struct echoaudio *chip)
{
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA; chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
chip->professional_spdif = FALSE; chip->professional_spdif = FALSE;
chip->non_audio_spdif = FALSE; chip->non_audio_spdif = FALSE;
chip->bad_board = FALSE; chip->bad_board = FALSE;
chip->phantom_power = FALSE;
if ((err = init_line_levels(chip)) < 0) return init_line_levels(chip);
return err;
err = set_digital_mode(chip, DIGITAL_MODE_SPDIF_RCA);
if (err < 0)
return err;
err = set_phantom_power(chip, 0);
if (err < 0)
return err;
err = set_professional_spdif(chip, TRUE);
DE_INIT(("init_hw done\n"));
return err;
} }
......
...@@ -62,13 +62,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -62,13 +62,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0) DE_INIT(("init_hw done\n"));
return err; return err;
}
err = set_professional_spdif(chip, TRUE);
DE_INIT(("init_hw done\n"));
return err; static int set_mixer_defaults(struct echoaudio *chip)
{
chip->professional_spdif = FALSE;
return init_line_levels(chip);
} }
......
...@@ -57,9 +57,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -57,9 +57,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF | ECHO_CLOCK_BIT_INTERNAL | ECHO_CLOCK_BIT_SPDIF |
ECHO_CLOCK_BIT_ESYNC | ECHO_CLOCK_BIT_ESYNC96 | ECHO_CLOCK_BIT_ESYNC | ECHO_CLOCK_BIT_ESYNC96 |
ECHO_CLOCK_BIT_ADAT; ECHO_CLOCK_BIT_ADAT;
chip->professional_spdif = FALSE;
chip->digital_in_automute = TRUE;
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
/* Gina24 comes in both '301 and '361 flavors */ /* Gina24 comes in both '301 and '361 flavors */
if (chip->device_id == DEVICE_ID_56361) { if (chip->device_id == DEVICE_ID_56361) {
...@@ -81,19 +78,22 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -81,19 +78,22 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0)
return err;
err = set_digital_mode(chip, DIGITAL_MODE_SPDIF_RCA);
if (err < 0)
return err;
err = set_professional_spdif(chip, TRUE);
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
chip->professional_spdif = FALSE;
chip->digital_in_automute = TRUE;
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
u32 clocks_from_dsp, clock_bits; u32 clocks_from_dsp, clock_bits;
......
...@@ -60,15 +60,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -60,15 +60,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
return ECHO_CLOCK_BIT_INTERNAL; return ECHO_CLOCK_BIT_INTERNAL;
......
...@@ -61,6 +61,7 @@ static int set_sample_rate(struct echoaudio *chip, u32 rate) ...@@ -61,6 +61,7 @@ static int set_sample_rate(struct echoaudio *chip, u32 rate)
control_reg |= clock; control_reg |= clock;
if (control_reg != old_control_reg) { if (control_reg != old_control_reg) {
DE_ACT(("set_sample_rate: %d clock %d\n", rate, clock));
chip->comm_page->control_register = cpu_to_le32(control_reg); chip->comm_page->control_register = cpu_to_le32(control_reg);
chip->sample_rate = rate; chip->sample_rate = rate;
clear_handshake(chip); clear_handshake(chip);
......
...@@ -60,15 +60,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -60,15 +60,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
return ECHO_CLOCK_BIT_INTERNAL; return ECHO_CLOCK_BIT_INTERNAL;
......
...@@ -59,10 +59,13 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -59,10 +59,13 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
err = init_line_levels(chip);
if (err < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
...@@ -60,15 +60,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -60,15 +60,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
return ECHO_CLOCK_BIT_INTERNAL; return ECHO_CLOCK_BIT_INTERNAL;
......
...@@ -59,10 +59,13 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -59,10 +59,13 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
err = init_line_levels(chip);
if (err < 0)
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
...@@ -64,13 +64,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -64,13 +64,16 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0) DE_INIT(("init_hw done\n"));
return err; return err;
}
err = set_professional_spdif(chip, TRUE);
DE_INIT(("init_hw done\n"));
return err; static int set_mixer_defaults(struct echoaudio *chip)
{
chip->professional_spdif = FALSE;
return init_line_levels(chip);
} }
......
...@@ -61,9 +61,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -61,9 +61,6 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA | ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_RCA |
ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL | ECHOCAPS_HAS_DIGITAL_MODE_SPDIF_OPTICAL |
ECHOCAPS_HAS_DIGITAL_MODE_ADAT; ECHOCAPS_HAS_DIGITAL_MODE_ADAT;
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
chip->professional_spdif = FALSE;
chip->digital_in_automute = TRUE;
if ((err = load_firmware(chip)) < 0) if ((err = load_firmware(chip)) < 0)
return err; return err;
...@@ -72,17 +69,22 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -72,17 +69,22 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
if ((err = init_line_levels(chip)) < 0) if ((err = init_line_levels(chip)) < 0)
return err; return err;
err = set_digital_mode(chip, DIGITAL_MODE_SPDIF_RCA);
if (err < 0)
return err;
err = set_professional_spdif(chip, TRUE);
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
chip->professional_spdif = FALSE;
chip->digital_in_automute = TRUE;
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
u32 clocks_from_dsp, clock_bits; u32 clocks_from_dsp, clock_bits;
......
...@@ -66,15 +66,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -66,15 +66,19 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)))
return err;
DE_INIT(("init_hw done\n")); DE_INIT(("init_hw done\n"));
return err; return err;
} }
static int set_mixer_defaults(struct echoaudio *chip)
{
return init_line_levels(chip);
}
static u32 detect_input_clocks(const struct echoaudio *chip) static u32 detect_input_clocks(const struct echoaudio *chip)
{ {
u32 clocks_from_dsp, clock_bits; u32 clocks_from_dsp, clock_bits;
......
...@@ -67,24 +67,22 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id) ...@@ -67,24 +67,22 @@ static int init_hw(struct echoaudio *chip, u16 device_id, u16 subdevice_id)
else else
chip->dsp_code_to_load = FW_MONA_301_DSP; chip->dsp_code_to_load = FW_MONA_301_DSP;
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
chip->professional_spdif = FALSE;
chip->digital_in_automute = TRUE;
if ((err = load_firmware(chip)) < 0) if ((err = load_firmware(chip)) < 0)
return err; return err;
chip->bad_board = FALSE; chip->bad_board = FALSE;
if ((err = init_line_levels(chip)) < 0) DE_INIT(("init_hw done\n"));
return err; return err;
}
err = set_digital_mode(chip, DIGITAL_MODE_SPDIF_RCA);
if (err < 0)
return err;
err = set_professional_spdif(chip, TRUE);
DE_INIT(("init_hw done\n"));
return err; static int set_mixer_defaults(struct echoaudio *chip)
{
chip->digital_mode = DIGITAL_MODE_SPDIF_RCA;
chip->professional_spdif = FALSE;
chip->digital_in_automute = TRUE;
return init_line_levels(chip);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment