summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pci/via82c686.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pci/via82c686.c')
-rw-r--r--sys/dev/sound/pci/via82c686.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/sys/dev/sound/pci/via82c686.c b/sys/dev/sound/pci/via82c686.c
index 1e0440f..b76987f 100644
--- a/sys/dev/sound/pci/via82c686.c
+++ b/sys/dev/sound/pci/via82c686.c
@@ -475,8 +475,20 @@ via_attach(device_t dev)
pci_write_config(dev, PCIR_COMMAND, data, 2);
data = pci_read_config(dev, PCIR_COMMAND, 2);
- pci_write_config(dev, VIA_PCICONF_MISC,
- VIA_PCICONF_ACLINKENAB | VIA_PCICONF_ACSGD | VIA_PCICONF_ACNOTRST | VIA_PCICONF_ACVSR, 1);
+ /* Wake up and reset AC97 if necessary */
+ if (!(pci_read_config(dev, VIA_AC97STATUS, 1) & VIA_AC97STATUS_RDY)) {
+ pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_EN | VIA_ACLINK_NRST | VIA_ACLINK_SYNC, 1);
+ DELAY(1000);
+ pci_write_config(dev, VIA_ACLINKCTRL, 0, 1);
+ DELAY(1000);
+ pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_DESIRED, 1);
+ DELAY(1000);
+ }
+
+ if (pci_read_config(dev, VIA_ACLINKCTRL, 1) != VIA_ACLINK_DESIRED) {
+ pci_write_config(dev, VIA_ACLINKCTRL, VIA_ACLINK_DESIRED, 1);
+ DELAY(1000);
+ }
via->regid = PCIR_MAPS;
via->reg = bus_alloc_resource(dev, SYS_RES_IOPORT, &via->regid, 0, ~0, 1, RF_ACTIVE);
@@ -503,7 +515,8 @@ via_attach(device_t dev)
if (!via->codec)
goto bad;
- mixer_init(dev, ac97_getmixerclass(), via->codec);
+ if (mixer_init(dev, ac97_getmixerclass(), via->codec))
+ goto bad;
via->codec_caps = ac97_getextcaps(via->codec);
ac97_setextmode(via->codec,
OpenPOWER on IntegriCloud