Commit 28deafd0 authored by Oswald Buddenhagen's avatar Oswald Buddenhagen Committed by Takashi Iwai
Browse files

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: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Message-ID: <20240428093716.3198666-3-oswald.buddenhagen@gmx.de>
parent 398321d7
Loading
Loading
Loading
Loading
+36 −30
Original line number Diff line number Diff line
@@ -732,50 +732,56 @@ static int snd_emu1010_load_firmware(struct snd_emu10k1 *emu, int dock,
	return snd_emu1010_load_firmware_entry(emu, *fw);
}

static void emu1010_firmware_work(struct work_struct *work)
static void snd_emu1010_load_dock_firmware(struct snd_emu10k1 *emu)
{
	struct snd_emu10k1 *emu;
	u32 tmp, tmp2, reg;
	u32 tmp, tmp2;
	int err;

	emu = container_of(work, struct snd_emu10k1,
			   emu1010.firmware_work);
	if (emu->card->shutdown)
		return;
#ifdef CONFIG_PM_SLEEP
	if (emu->suspend)
		return;
#endif
	snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &reg); /* OPTIONS: Which cards are attached to the EMU */
	if (reg & EMU_HANA_OPTION_DOCK_OFFLINE) {
		/* Audio Dock attached */
	dev_info(emu->card->dev, "emu1010: Loading Audio Dock Firmware\n");
	/* 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);
	dev_dbg(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",
		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");
	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 */

	/* 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 reg;

	emu = container_of(work, struct snd_emu10k1,
			   emu1010.firmware_work);
	if (emu->card->shutdown)
		return;
#ifdef CONFIG_PM_SLEEP
	if (emu->suspend)
		return;
#endif
	snd_emu1010_fpga_read(emu, EMU_HANA_OPTION_CARDS, &reg); /* OPTIONS: Which cards are attached to the EMU */
	if (reg & EMU_HANA_OPTION_DOCK_OFFLINE) {
		/* Audio Dock attached */
		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, &reg);
	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 */