Skip to content

Commit 28deafd

Browse files
ossilatortiwai
authored andcommitted
ALSA: emu10k1: factor out snd_emu1010_load_dock_firmware()
Pulled out of the next patch to improve its legibility. As the function is now available, call it directly from snd_emu10k1_emu1010_init(), thus making the MicroDock firmware loading synchronous - there isn't really a reason not to. Note that this does not affect the AudioDocks of rev1 cards, as these have no independent power supplies, and thus come up only a while after the main card is initialized. As a drive-by, adjust the priorities of two messages to better reflect their impact. Signed-off-by: Oswald Buddenhagen <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> Message-ID: <[email protected]>
1 parent 398321d commit 28deafd

File tree

1 file changed

+36
-30
lines changed

1 file changed

+36
-30
lines changed

sound/pci/emu10k1/emu10k1_main.c

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -732,11 +732,43 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, int dock,
732732
return snd_emu1010_load_firmware_entry(emu, *fw);
733733
}
734734

735+
static void snd_emu1010_load_dock_firmware(struct snd_emu10k1 *emu)
736+
{
737+
u32 tmp, tmp2;
738+
int err;
739+
740+
dev_info(emu->card->dev, "emu1010: Loading Audio Dock Firmware\n");
741+
/* Return to Audio Dock programming mode */
742+
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG,
743+
EMU_HANA_FPGA_CONFIG_AUDIODOCK);
744+
err = snd_emu1010_load_firmware(emu, 1, &emu->dock_fw);
745+
if (err < 0)
746+
return;
747+
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0);
748+
749+
snd_emu1010_fpga_read(emu, EMU_HANA_ID, &tmp);
750+
dev_dbg(emu->card->dev, "emu1010: EMU_HANA+DOCK_ID = 0x%x\n", tmp);
751+
if ((tmp & 0x1f) != 0x15) {
752+
/* FPGA failed to be programmed */
753+
dev_err(emu->card->dev,
754+
"emu1010: Loading Audio Dock Firmware failed, reg = 0x%x\n",
755+
tmp);
756+
return;
757+
}
758+
dev_info(emu->card->dev, "emu1010: Audio Dock Firmware loaded\n");
759+
760+
snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp);
761+
snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2);
762+
dev_info(emu->card->dev, "Audio Dock ver: %u.%u\n", tmp, tmp2);
763+
764+
/* Allow DLL to settle, to sync clocking between 1010 and Dock */
765+
msleep(10);
766+
}
767+
735768
static void emu1010_firmware_work(struct work_struct *work)
736769
{
737770
struct snd_emu10k1 *emu;
738-
u32 tmp, tmp2, reg;
739-
int err;
771+
u32 reg;
740772

741773
emu = container_of(work, struct snd_emu10k1,
742774
emu1010.firmware_work);
@@ -749,33 +781,7 @@ static void emu1010_firmware_work(struct work_struct *work)
749781
snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &reg); /* OPTIONS: Which cards are attached to the EMU */
750782
if (reg & EMU_HANA_OPTION_DOCK_OFFLINE) {
751783
/* Audio Dock attached */
752-
/* Return to Audio Dock programming mode */
753-
dev_info(emu->card->dev,
754-
"emu1010: Loading Audio Dock Firmware\n");
755-
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG,
756-
EMU_HANA_FPGA_CONFIG_AUDIODOCK);
757-
err = snd_emu1010_load_firmware(emu, 1, &emu->dock_fw);
758-
if (err < 0)
759-
return;
760-
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0);
761-
snd_emu1010_fpga_read(emu, EMU_HANA_ID, &tmp);
762-
dev_info(emu->card->dev,
763-
"emu1010: EMU_HANA+DOCK_ID = 0x%x\n", tmp);
764-
if ((tmp & 0x1f) != 0x15) {
765-
/* FPGA failed to be programmed */
766-
dev_info(emu->card->dev,
767-
"emu1010: Loading Audio Dock Firmware file failed, reg = 0x%x\n",
768-
tmp);
769-
return;
770-
}
771-
dev_info(emu->card->dev,
772-
"emu1010: Audio Dock Firmware loaded\n");
773-
snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp);
774-
snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2);
775-
dev_info(emu->card->dev, "Audio Dock ver: %u.%u\n", tmp, tmp2);
776-
/* Sync clocking between 1010 and Dock */
777-
/* Allow DLL to settle */
778-
msleep(10);
784+
snd_emu1010_load_dock_firmware(emu);
779785
/* Unmute all. Default is muted after a firmware load */
780786
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE);
781787
} else if (!(reg & EMU_HANA_OPTION_DOCK_ONLINE)) {
@@ -892,7 +898,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
892898
snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &reg);
893899
dev_info(emu->card->dev, "emu1010: Card options = 0x%x\n", reg);
894900
if (reg & EMU_HANA_OPTION_DOCK_OFFLINE)
895-
schedule_work(&emu->emu1010.firmware_work);
901+
snd_emu1010_load_dock_firmware(emu);
896902
if (emu->card_capabilities->no_adat) {
897903
emu->emu1010.optical_in = 0; /* IN_SPDIF */
898904
emu->emu1010.optical_out = 0; /* OUT_SPDIF */

0 commit comments

Comments
 (0)