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: Giuliano Pochini <pochini@shiny.it>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Giuliano Pochini 2010-02-14 18:15:51 +01:00 committed by Takashi Iwai
parent 19b5006378
commit 4f8ada444c
2 changed files with 41 additions and 4 deletions

View File

@ -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;

View File

@ -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 */