mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-13 14:24:11 +08:00
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 <oswald.buddenhagen@gmx.de> Signed-off-by: Takashi Iwai <tiwai@suse.de> Message-ID: <20240428093716.3198666-3-oswald.buddenhagen@gmx.de>
This commit is contained in:
parent
398321d753
commit
28deafd0fb
@ -732,11 +732,43 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, int dock,
|
||||
return snd_emu1010_load_firmware_entry(emu, *fw);
|
||||
}
|
||||
|
||||
static void snd_emu1010_load_dock_firmware(struct snd_emu10k1 *emu)
|
||||
{
|
||||
u32 tmp, tmp2;
|
||||
int err;
|
||||
|
||||
dev_info(emu->card->dev, "emu1010: Loading Audio Dock Firmware\n");
|
||||
/* Return to Audio Dock programming mode */
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG,
|
||||
EMU_HANA_FPGA_CONFIG_AUDIODOCK);
|
||||
err = snd_emu1010_load_firmware(emu, 1, &emu->dock_fw);
|
||||
if (err < 0)
|
||||
return;
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0);
|
||||
|
||||
snd_emu1010_fpga_read(emu, EMU_HANA_ID, &tmp);
|
||||
dev_dbg(emu->card->dev, "emu1010: EMU_HANA+DOCK_ID = 0x%x\n", tmp);
|
||||
if ((tmp & 0x1f) != 0x15) {
|
||||
/* FPGA failed to be programmed */
|
||||
dev_err(emu->card->dev,
|
||||
"emu1010: Loading Audio Dock Firmware failed, reg = 0x%x\n",
|
||||
tmp);
|
||||
return;
|
||||
}
|
||||
dev_info(emu->card->dev, "emu1010: Audio Dock Firmware loaded\n");
|
||||
|
||||
snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp);
|
||||
snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2);
|
||||
dev_info(emu->card->dev, "Audio Dock ver: %u.%u\n", tmp, tmp2);
|
||||
|
||||
/* Allow DLL to settle, to sync clocking between 1010 and Dock */
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
static void emu1010_firmware_work(struct work_struct *work)
|
||||
{
|
||||
struct snd_emu10k1 *emu;
|
||||
u32 tmp, tmp2, reg;
|
||||
int err;
|
||||
u32 reg;
|
||||
|
||||
emu = container_of(work, struct snd_emu10k1,
|
||||
emu1010.firmware_work);
|
||||
@ -749,33 +781,7 @@ static void emu1010_firmware_work(struct work_struct *work)
|
||||
snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ®); /* OPTIONS: Which cards are attached to the EMU */
|
||||
if (reg & EMU_HANA_OPTION_DOCK_OFFLINE) {
|
||||
/* Audio Dock attached */
|
||||
/* Return to Audio Dock programming mode */
|
||||
dev_info(emu->card->dev,
|
||||
"emu1010: Loading Audio Dock Firmware\n");
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG,
|
||||
EMU_HANA_FPGA_CONFIG_AUDIODOCK);
|
||||
err = snd_emu1010_load_firmware(emu, 1, &emu->dock_fw);
|
||||
if (err < 0)
|
||||
return;
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_FPGA_CONFIG, 0);
|
||||
snd_emu1010_fpga_read(emu, EMU_HANA_ID, &tmp);
|
||||
dev_info(emu->card->dev,
|
||||
"emu1010: EMU_HANA+DOCK_ID = 0x%x\n", tmp);
|
||||
if ((tmp & 0x1f) != 0x15) {
|
||||
/* FPGA failed to be programmed */
|
||||
dev_info(emu->card->dev,
|
||||
"emu1010: Loading Audio Dock Firmware file failed, reg = 0x%x\n",
|
||||
tmp);
|
||||
return;
|
||||
}
|
||||
dev_info(emu->card->dev,
|
||||
"emu1010: Audio Dock Firmware loaded\n");
|
||||
snd_emu1010_fpga_read(emu, EMU_DOCK_MAJOR_REV, &tmp);
|
||||
snd_emu1010_fpga_read(emu, EMU_DOCK_MINOR_REV, &tmp2);
|
||||
dev_info(emu->card->dev, "Audio Dock ver: %u.%u\n", tmp, tmp2);
|
||||
/* Sync clocking between 1010 and Dock */
|
||||
/* Allow DLL to settle */
|
||||
msleep(10);
|
||||
snd_emu1010_load_dock_firmware(emu);
|
||||
/* Unmute all. Default is muted after a firmware load */
|
||||
snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE);
|
||||
} else if (!(reg & EMU_HANA_OPTION_DOCK_ONLINE)) {
|
||||
@ -892,7 +898,7 @@ static int snd_emu10k1_emu1010_init(struct snd_emu10k1 *emu)
|
||||
snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, ®);
|
||||
dev_info(emu->card->dev, "emu1010: Card options = 0x%x\n", reg);
|
||||
if (reg & EMU_HANA_OPTION_DOCK_OFFLINE)
|
||||
schedule_work(&emu->emu1010.firmware_work);
|
||||
snd_emu1010_load_dock_firmware(emu);
|
||||
if (emu->card_capabilities->no_adat) {
|
||||
emu->emu1010.optical_in = 0; /* IN_SPDIF */
|
||||
emu->emu1010.optical_out = 0; /* OUT_SPDIF */
|
||||
|
Loading…
Reference in New Issue
Block a user