Skip to content

Commit

Permalink
ALSA: ymfpci: Store additional legacy registers on suspend
Browse files Browse the repository at this point in the history
YMF744 and newer store the base IO ports in separate PCI config registers.

Since these registers were not restored, when set to a non-default value,
features that rely on them (FM, MPU401, gameport) were not functional
after restore, as their respective IO ports were reset to their defaults.

Signed-off-by: Tasos Sahanidis <tasos@tasossah.com>
Link: https://lore.kernel.org/r/20230329041440.177363-5-tasos@tasossah.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Tasos Sahanidis authored and Takashi Iwai committed Mar 29, 2023
1 parent 39fef76 commit 4fa4a14
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
8 changes: 8 additions & 0 deletions sound/pci/ymfpci/ymfpci.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,10 +298,18 @@ static const int saved_regs_index[] = {
#define YDSXGR_NUM_SAVED_REGS ARRAY_SIZE(saved_regs_index)

static const int pci_saved_regs_index[] = {
/* All Chips */
PCIR_DSXG_LEGACY,
PCIR_DSXG_ELEGACY,
/* YMF 744/754 */
PCIR_DSXG_FMBASE,
PCIR_DSXG_SBBASE,
PCIR_DSXG_MPU401BASE,
PCIR_DSXG_JOYBASE,
};
#define DSXG_PCI_NUM_SAVED_REGS ARRAY_SIZE(pci_saved_regs_index)
#define DSXG_PCI_NUM_SAVED_LEGACY_REGS 2
static_assert(DSXG_PCI_NUM_SAVED_LEGACY_REGS <= DSXG_PCI_NUM_SAVED_REGS);

struct snd_ymfpci {
int irq;
Expand Down
16 changes: 11 additions & 5 deletions sound/pci/ymfpci/ymfpci_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2224,8 +2224,11 @@ static int snd_ymfpci_suspend(struct device *dev)
{
struct snd_card *card = dev_get_drvdata(dev);
struct snd_ymfpci *chip = card->private_data;
unsigned int i;

unsigned int i, legacy_reg_count = DSXG_PCI_NUM_SAVED_LEGACY_REGS;

if (chip->pci->device >= 0x0010) /* YMF 744/754 */
legacy_reg_count = DSXG_PCI_NUM_SAVED_REGS;

snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
snd_ac97_suspend(chip->ac97);

Expand All @@ -2234,7 +2237,7 @@ static int snd_ymfpci_suspend(struct device *dev)

chip->saved_ydsxgr_mode = snd_ymfpci_readl(chip, YDSXGR_MODE);

for (i = 0; i < DSXG_PCI_NUM_SAVED_REGS; i++)
for (i = 0; i < legacy_reg_count; i++)
pci_read_config_word(chip->pci, pci_saved_regs_index[i],
chip->saved_dsxg_pci_regs + i);

Expand All @@ -2249,7 +2252,10 @@ static int snd_ymfpci_resume(struct device *dev)
struct pci_dev *pci = to_pci_dev(dev);
struct snd_card *card = dev_get_drvdata(dev);
struct snd_ymfpci *chip = card->private_data;
unsigned int i;
unsigned int i, legacy_reg_count = DSXG_PCI_NUM_SAVED_LEGACY_REGS;

if (chip->pci->device >= 0x0010) /* YMF 744/754 */
legacy_reg_count = DSXG_PCI_NUM_SAVED_REGS;

snd_ymfpci_aclink_reset(pci);
snd_ymfpci_codec_ready(chip, 0);
Expand All @@ -2261,7 +2267,7 @@ static int snd_ymfpci_resume(struct device *dev)

snd_ac97_resume(chip->ac97);

for (i = 0; i < DSXG_PCI_NUM_SAVED_REGS; i++)
for (i = 0; i < legacy_reg_count; i++)
pci_write_config_word(chip->pci, pci_saved_regs_index[i],
chip->saved_dsxg_pci_regs[i]);

Expand Down

0 comments on commit 4fa4a14

Please sign in to comment.