Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4f8ada44 authored by Giuliano Pochini's avatar Giuliano Pochini Committed by Takashi Iwai
Browse files

ALSA: Echoaudio - Add firmware cache #2



This patch implements a simple cache for the firmware files when CONFIG_PM is defined.

This patch changes get_firmware(), free_firmware() and adds
free_firmware_cache(). The first two functions implement a very
simple cache and the latter is used to actually release all the stored
firmwares when the module is unloaded. 
When CONFIG_PM is not enabled those functions act as before, that is
free_firmware() releases the firmware immediately and
free_firmware_cache() does nothing.

Signed-off-by: default avatarGiuliano Pochini <pochini@shiny.it>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 19b50063
Loading
Loading
Loading
Loading
+38 −4
Original line number Original line Diff line number Diff line
@@ -43,12 +43,24 @@ static int get_firmware(const struct firmware **fw_entry,
{
{
	int err;
	int err;
	char name[30];
	char name[30];
	const struct firmware *frm = &card_fw[fw_index];


	DE_ACT(("firmware requested: %s\n", frm->data));
#ifdef CONFIG_PM
	snprintf(name, sizeof(name), "ea/%s", frm->data);
	if (chip->fw_cache[fw_index]) {
	if ((err = request_firmware(fw_entry, name, pci_device(chip))) < 0)
		DE_ACT(("firmware requested: %s is cached\n", card_fw[fw_index].data));
		*fw_entry = chip->fw_cache[fw_index];
		return 0;
	}
#endif

	DE_ACT(("firmware requested: %s\n", card_fw[fw_index].data));
	snprintf(name, sizeof(name), "ea/%s", card_fw[fw_index].data);
	err = request_firmware(fw_entry, name, pci_device(chip));
	if (err < 0)
		snd_printk(KERN_ERR "get_firmware(): Firmware not available (%d)\n", err);
		snd_printk(KERN_ERR "get_firmware(): Firmware not available (%d)\n", err);
#ifdef CONFIG_PM
	else
		chip->fw_cache[fw_index] = *fw_entry;
#endif
	return err;
	return err;
}
}


@@ -56,8 +68,29 @@ static int get_firmware(const struct firmware **fw_entry,


static void free_firmware(const struct firmware *fw_entry)
static void free_firmware(const struct firmware *fw_entry)
{
{
#ifdef CONFIG_PM
	DE_ACT(("firmware not released (kept in cache)\n"));
#else
	release_firmware(fw_entry);
	release_firmware(fw_entry);
	DE_ACT(("firmware released\n"));
	DE_ACT(("firmware released\n"));
#endif
}



static void free_firmware_cache(struct echoaudio *chip)
{
#ifdef CONFIG_PM
	int i;

	for (i = 0; i < 8 ; i++)
		if (chip->fw_cache[i]) {
			release_firmware(chip->fw_cache[i]);
			DE_ACT(("release_firmware(%d)\n", i));
		}

	DE_ACT(("firmware_cache released\n"));
#endif
}
}




@@ -1880,6 +1913,7 @@ static int snd_echo_free(struct echoaudio *chip)
	pci_disable_device(chip->pci);
	pci_disable_device(chip->pci);


	/* release chip data */
	/* release chip data */
	free_firmware_cache(chip);
	kfree(chip);
	kfree(chip);
	DE_INIT(("Chip freed.\n"));
	DE_INIT(("Chip freed.\n"));
	return 0;
	return 0;
+3 −0
Original line number Original line Diff line number Diff line
@@ -449,6 +449,9 @@ struct echoaudio {
	volatile u32 __iomem *dsp_registers;	/* DSP's register base */
	volatile u32 __iomem *dsp_registers;	/* DSP's register base */
	u32 active_mask;			/* Chs. active mask or
	u32 active_mask;			/* Chs. active mask or
						 * punks out */
						 * punks out */
#ifdef CONFIG_PM
	const struct firmware *fw_cache[8];	/* Cached firmwares */
#endif


#ifdef ECHOCARD_HAS_MIDI
#ifdef ECHOCARD_HAS_MIDI
	u16 mtc_state;				/* State for MIDI input parsing state machine */
	u16 mtc_state;				/* State for MIDI input parsing state machine */