also, there's a bit of extra copying from auich(4). in auich, adj_rate is the rate after adjusting for the base rate not being 48kHz. there is not such adjustment in auglx.
I do not have an auglx(4), so testing is appreciated. -- jake...@sdf.lonestar.org SDF Public Access UNIX System - http://sdf.lonestar.org Index: auglx.c =================================================================== RCS file: /cvs/src/sys/dev/pci/auglx.c,v retrieving revision 1.6 diff -u -p auglx.c --- auglx.c 7 Sep 2010 16:21:44 -0000 1.6 +++ auglx.c 12 Sep 2010 05:34:12 -0000 @@ -197,9 +197,6 @@ struct auglx_softc { struct ac97_codec_if *codec_if; struct ac97_host_if host_if; - /* power mgmt */ - u_int16_t sc_ext_ctrl; - int sc_dmamap_flags; }; @@ -551,7 +548,6 @@ auglx_set_params(void *v, int setmode, int usemode, st struct auglx_softc *sc = v; int error; u_int orate; - u_int adj_rate; if (setmode & AUMODE_PLAY) { play->factor = 1; @@ -726,28 +722,25 @@ auglx_set_params(void *v, int setmode, int usemode, st play->bps = AUDIO_BPS(play->precision); play->msb = 1; - orate = adj_rate = play->sample_rate; + orate = play->sample_rate; - play->sample_rate = adj_rate; + play->sample_rate = orate; error = ac97_set_rate(sc->codec_if, AC97_REG_PCM_LFE_DAC_RATE, &play->sample_rate); if (error) return error; - play->sample_rate = adj_rate; + play->sample_rate = orate; error = ac97_set_rate(sc->codec_if, AC97_REG_PCM_SURR_DAC_RATE, &play->sample_rate); if (error) return error; - play->sample_rate = adj_rate; + play->sample_rate = orate; error = ac97_set_rate(sc->codec_if, AC97_REG_PCM_FRONT_DAC_RATE, &play->sample_rate); if (error) return error; - - if (play->sample_rate == adj_rate) - play->sample_rate = orate; } if (setmode & AUMODE_RECORD) { @@ -903,12 +896,10 @@ auglx_set_params(void *v, int setmode, int usemode, st rec->bps = AUDIO_BPS(rec->precision); rec->msb = 1; - orate = rec->sample_rate; error = ac97_set_rate(sc->codec_if, AC97_REG_PCM_LR_ADC_RATE, &rec->sample_rate); if (error) return error; - rec->sample_rate = orate; } return 0; @@ -1343,17 +1334,22 @@ int auglx_activate(struct device *self, int act) { struct auglx_softc *sc = (struct auglx_softc *)self; + int rv = 0; switch (act) { + case DVACT_ACTIVATE: + break; + case DVACT_QUIESCE: + rv = config_activate_children(self, act); + break; case DVACT_SUSPEND: - auglx_read_codec(sc, AC97_REG_EXT_AUDIO_CTRL, &sc->sc_ext_ctrl); break; case DVACT_RESUME: - auglx_reset_codec(sc); - delay(1000); - (sc->codec_if->vtbl->restore_ports)(sc->codec_if); - auglx_write_codec(sc, AC97_REG_EXT_AUDIO_CTRL, sc->sc_ext_ctrl); + ac97_resume(&sc->host_if, sc->codec_if); + rv = config_activate_children(self, act); break; + case DVACT_DEACTIVATE: + break; } - return 0; + return (rv); }