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>
ac97->regs[reg] = value;
ac97->bus->ops->write(ac97, reg, value);
}
ac97->regs[reg] = value;
ac97->bus->ops->write(ac97, reg, value);
}
+ set_bit(reg, ac97->reg_accessed);
up(&ac97->reg_mutex);
return change;
}
up(&ac97->reg_mutex);
return change;
}
ac97->regs[reg] = new;
ac97->bus->ops->write(ac97, reg, new);
}
ac97->regs[reg] = new;
ac97->bus->ops->write(ac97, reg, new);
}
+ set_bit(reg, ac97->reg_accessed);
unsigned xbox: 1; /* workaround for Xbox AC'97 detection */
int spdif_idx; /* SPDIF BAR index; *_SPBAR or -1 if use PCMOUT */
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];
ac97_bus_t *ac97_bus;
ac97_t *ac97[3];
for (i = 0; i < 3; i++)
if (chip->ac97[i])
snd_ac97_suspend(chip->ac97[i]);
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;
}
pci_disable_device(chip->pci);
return 0;
}
pci_set_master(chip->pci);
snd_intel8x0_chip_init(chip, 0);
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);
/* refill nocache */
if (chip->fix_nocache)
fill_nocache(chip->bdbars.area, chip->bdbars.bytes, 1);