Skip to content

Commit

Permalink
[ALSA] Fix resume of intel8x0
Browse files Browse the repository at this point in the history
Intel8x0 driver,AC97 Codec
Fix resume of intel8x0 driver.  The ac97 codec didn't restore some registers
properly, and the restore of ICH4 SPDIF and SDIN settings was missing.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Iwai authored and Jaroslav Kysela committed Jul 28, 2005
1 parent 2eff7ec commit 52b7238
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
2 changes: 2 additions & 0 deletions sound/pci/ac97/ac97_codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,7 @@ int snd_ac97_update(ac97_t *ac97, unsigned short reg, unsigned short value)
ac97->regs[reg] = value;
ac97->bus->ops->write(ac97, reg, value);
}
set_bit(reg, ac97->reg_accessed);
up(&ac97->reg_mutex);
return change;
}
Expand Down Expand Up @@ -410,6 +411,7 @@ int snd_ac97_update_bits_nolock(ac97_t *ac97, unsigned short reg,
ac97->regs[reg] = new;
ac97->bus->ops->write(ac97, reg, new);
}
set_bit(reg, ac97->reg_accessed);
return change;
}

Expand Down
13 changes: 13 additions & 0 deletions sound/pci/intel8x0.c
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ struct _snd_intel8x0 {
unsigned xbox: 1; /* workaround for Xbox AC'97 detection */

int spdif_idx; /* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */
unsigned int sdm_saved; /* SDM reg value */

ac97_bus_t *ac97_bus;
ac97_t *ac97[3];
Expand Down Expand Up @@ -2373,6 +2374,8 @@ static int intel8x0_suspend(snd_card_t *card, pm_message_t state)
for (i = 0; i < 3; i++)
if (chip->ac97[i])
snd_ac97_suspend(chip->ac97[i]);
if (chip->device_type == DEVICE_INTEL_ICH4)
chip->sdm_saved = igetbyte(chip, ICHREG(SDM));
pci_disable_device(chip->pci);
return 0;
}
Expand All @@ -2386,6 +2389,16 @@ static int intel8x0_resume(snd_card_t *card)
pci_set_master(chip->pci);
snd_intel8x0_chip_init(chip, 0);

/* re-initialize mixer stuff */
if (chip->device_type == DEVICE_INTEL_ICH4) {
/* enable separate SDINs for ICH4 */
iputbyte(chip, ICHREG(SDM), chip->sdm_saved);
/* use slot 10/11 for SPDIF */
iputdword(chip, ICHREG(GLOB_CNT),
(igetdword(chip, ICHREG(GLOB_CNT)) & ~ICH_PCM_SPDIF_MASK) |
ICH_PCM_SPDIF_1011);
}

/* refill nocache */
if (chip->fix_nocache)
fill_nocache(chip->bdbars.area, chip->bdbars.bytes, 1);
Expand Down

0 comments on commit 52b7238

Please sign in to comment.