Index: csa.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/pci/csa.c,v retrieving revision 1.8.2.11 diff -u -r1.8.2.11 csa.c --- csa.c 13 Aug 2002 16:18:33 -0000 1.8.2.11 +++ csa.c 30 Sep 2002 22:00:24 -0000 @@ -363,10 +363,31 @@ static int csa_resume(device_t dev) { - csa_detach(dev); - csa_attach(dev); + sc_p scp = device_get_softc(dev); + csa_res *resp = &scp->res; - return 0; + /* Initialize the chip. */ + if (csa_initialize(scp)) { + device_printf(dev, "re-initialization failed on resume."); + return ENXIO; + } + + /* Reset the Processor. */ + csa_resetdsp(resp); + + /* Download the Processor Image to the processor. */ + if (csa_downloadimage(resp)) { + device_printf(dev, "image download failed on resume."); + return ENXIO; + } + + return bus_generic_resume(dev); +} + +static int +csa_suspend(device_t dev) +{ + return bus_generic_suspend(dev); } static struct resource * @@ -1031,7 +1052,7 @@ DEVMETHOD(device_attach, csa_attach), DEVMETHOD(device_detach, csa_detach), DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), + DEVMETHOD(device_suspend, csa_suspend), DEVMETHOD(device_resume, csa_resume), /* Bus interface */ Index: csapcm.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/pci/csapcm.c,v retrieving revision 1.8.2.7 diff -u -r1.8.2.7 csapcm.c --- csapcm.c 22 Apr 2002 15:49:32 -0000 1.8.2.7 +++ csapcm.c 30 Sep 2002 22:00:24 -0000 @@ -54,7 +54,11 @@ struct snd_dbuf *buffer; int dir; u_int32_t fmt, spd; - int dma; + int dma:1; + + /* Suspend/resume info */ + int running:1; + int was_running:1; }; struct csa_info { @@ -516,6 +520,7 @@ ch->channel = c; ch->buffer = b; ch->dir = dir; + ch->running = ch->was_running = 0; if (sndbuf_alloc(ch->buffer, csa->parent_dmat, CS461x_BUFFSIZE) == -1) return NULL; return ch; } @@ -560,12 +565,14 @@ csa_startplaydma(csa); else csa_startcapturedma(csa); + ch->running = 1; } else { if (ch->dir == PCMDIR_PLAY) csa_stopplaydma(csa); else csa_stopcapturedma(csa); csa_active(csa, -1); + ch->running = 0; } return 0; } @@ -827,12 +834,59 @@ return 0; } +static int +pcmcsa_suspend(device_t dev) +{ + struct csa_info *sc; + + sc = pcm_getdevinfo(dev); + + sc->pch.was_running = sc->pch.running; + if (sc->pch.running) + csachan_trigger(0, &sc->pch, PCMTRIG_ABORT); + + sc->rch.was_running = sc->rch.running; + if (sc->rch.running) + csachan_trigger(0, &sc->rch, PCMTRIG_ABORT); + + return 0; +} + +static int +pcmcsa_resume(device_t dev) +{ + struct csa_info *sc; + int e; + + sc = pcm_getdevinfo(dev); + + if ((e = csa_init(sc)) != 0) { + device_printf(dev, "csa_init failed %d\n", e); + return e; + } + + /* csachan_trigger pushes sample rate and format. Makes life easier */ + if (sc->pch.was_running) + csachan_trigger(0, &sc->pch, PCMTRIG_START); + + if (sc->rch.was_running) + csachan_trigger(0, &sc->rch, PCMTRIG_START); + + if ((e = mixer_reinit(dev)) != 0) { + device_printf(dev, "mixer_reinit failed: %d\n", e); + return e; + } + + return 0; +} + static device_method_t pcmcsa_methods[] = { /* Device interface */ - DEVMETHOD(device_probe , pcmcsa_probe ), - DEVMETHOD(device_attach, pcmcsa_attach), - DEVMETHOD(device_detach, pcmcsa_detach), - + DEVMETHOD(device_probe , pcmcsa_probe ), + DEVMETHOD(device_attach, pcmcsa_attach), + DEVMETHOD(device_detach, pcmcsa_detach), + DEVMETHOD(device_suspend, pcmcsa_suspend), + DEVMETHOD(device_resume, pcmcsa_resume), { 0, 0 }, };