summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2000-08-29 20:50:42 +0000
committercg <cg@FreeBSD.org>2000-08-29 20:50:42 +0000
commit0ee01daa5cad1504ba1554abf520f1eb9e450faa (patch)
treec1c32bc71a3e773dec3e39913ffd7a2a88f58816
parent6ee80831a1a6513857e9ec4754ebbe5ae50cd141 (diff)
downloadFreeBSD-src-0ee01daa5cad1504ba1554abf520f1eb9e450faa.zip
FreeBSD-src-0ee01daa5cad1504ba1554abf520f1eb9e450faa.tar.gz
suspend/resume for ds1 driver
PR: misc/20891 Submitted by: Ira L. Cooper <ira@mit.edu>
-rw-r--r--sys/dev/sound/pci/ds1.c60
1 files changed, 51 insertions, 9 deletions
diff --git a/sys/dev/sound/pci/ds1.c b/sys/dev/sound/pci/ds1.c
index 1932887..5ea298f 100644
--- a/sys/dev/sound/pci/ds1.c
+++ b/sys/dev/sound/pci/ds1.c
@@ -114,6 +114,7 @@ struct sc_info {
int regid, irqid;
void *ih;
+ void *regbase;
u_int32_t *pbase, pbankbase, pbanksize;
volatile struct pbank *pbank[2 * 64];
volatile struct rbank *rbank;
@@ -215,6 +216,14 @@ static pcm_channel ds_pchantemplate = {
ds1pchan_trigger,
ds1pchan_getptr,
ds1pchan_getcaps,
+ NULL, /* free */
+ NULL, /* nop1 */
+ NULL, /* nop2 */
+ NULL, /* nop3 */
+ NULL, /* nop4 */
+ NULL, /* nop5 */
+ NULL, /* nop6 */
+ NULL, /* nop7 */
};
static pcm_channel ds_rchantemplate = {
@@ -226,6 +235,14 @@ static pcm_channel ds_rchantemplate = {
ds1rchan_trigger,
ds1rchan_getptr,
ds1rchan_getcaps,
+ NULL, /* free */
+ NULL, /* nop1 */
+ NULL, /* nop2 */
+ NULL, /* nop3 */
+ NULL, /* nop4 */
+ NULL, /* nop5 */
+ NULL, /* nop6 */
+ NULL, /* nop7 */
};
/* -------------------------------------------------------------------- */
@@ -819,14 +836,18 @@ ds_init(struct sc_info *sc)
memsz = 64 * 2 * pcs + 2 * 2 * rcs + 5 * 2 * ecs + ws;
memsz += (64 + 1) * 4;
- if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, &map))
- return -1;
- if (bus_dmamap_load(sc->parent_dmat, map, buf, memsz, ds_setmap, sc, 0)
- || !sc->ctrlbase) {
- device_printf(sc->dev, "pcs=%d, rcs=%d, ecs=%d, ws=%d, memsz=%d\n",
- pcs, rcs, ecs, ws, memsz);
- return -1;
- }
+ if (sc->regbase == NULL) {
+ if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, &map))
+ return -1;
+ if (bus_dmamap_load(sc->parent_dmat, map, buf, memsz, ds_setmap, sc, 0)
+ || !sc->ctrlbase) {
+ device_printf(sc->dev, "pcs=%d, rcs=%d, ecs=%d, ws=%d, memsz=%d\n",
+ pcs, rcs, ecs, ws, memsz);
+ return -1;
+ }
+ sc->regbase = buf;
+ } else
+ buf = sc->regbase;
cb = 0;
t = buf;
@@ -938,6 +959,7 @@ ds_pci_attach(device_t dev)
goto bad;
}
+ sc->regbase = NULL;
if (ds_init(sc) == -1) {
device_printf(dev, "unable to initialize the card\n");
goto bad;
@@ -981,11 +1003,31 @@ bad:
return ENXIO;
}
+static int
+ds_pci_resume(device_t dev)
+{
+ snddev_info *d;
+ struct sc_info *sc;
+
+ d = device_get_softc(dev);
+ sc = pcm_getdevinfo(dev);
+
+ if (ds_init(sc) == -1) {
+ device_printf(dev, "unable to reinitialize the card\n");
+ return ENXIO;
+ }
+ if (mixer_reinit(d) == -1) {
+ device_printf(dev, "unable to reinitialize the mixer\n");
+ return ENXIO;
+ }
+ return 0;
+}
+
static device_method_t ds1_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ds_pci_probe),
DEVMETHOD(device_attach, ds_pci_attach),
-
+ DEVMETHOD(device_resume, ds_pci_resume),
{ 0, 0 }
};
OpenPOWER on IntegriCloud