Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 182712
b: refs/heads/master
c: 4f8ada4
h: refs/heads/master
v: v3
  • Loading branch information
Giuliano Pochini authored and Takashi Iwai committed Feb 15, 2010
1 parent 87b322b commit 5587231
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 19b50063780953563e3c3a2867c39aad7b9e64cf
refs/heads/master: 4f8ada444cc7a7ea70cdc81f098b34c5f1f2df41
42 changes: 38 additions & 4 deletions trunk/sound/pci/echoaudio/echoaudio.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,54 @@ static int get_firmware(const struct firmware **fw_entry,
{
int err;
char name[30];
const struct firmware *frm = &card_fw[fw_index];

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



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);
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
}


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

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

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

0 comments on commit 5587231

Please sign in to comment.