summaryrefslogtreecommitdiff
path: root/sys/dev/pci/cs4281.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2010-08-27 18:50:58 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2010-08-27 18:50:58 +0000
commitc959724ca9542e8025c1fb52716e4ed6b15748a6 (patch)
treee33259cad5104cb869be745813e2f60160a77cc7 /sys/dev/pci/cs4281.c
parentfeef32ec1c77b0779b4ab487d2e91fe77f81571a (diff)
Since the changes in neo(4) work, it is very likely that the exact same
mechnical changes work in these drivers too. Testing can occur after this commit.
Diffstat (limited to 'sys/dev/pci/cs4281.c')
-rw-r--r--sys/dev/pci/cs4281.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/sys/dev/pci/cs4281.c b/sys/dev/pci/cs4281.c
index 43e3147e948..dad225ed926 100644
--- a/sys/dev/pci/cs4281.c
+++ b/sys/dev/pci/cs4281.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cs4281.c,v 1.23 2010/07/15 03:43:11 jakemsr Exp $ */
+/* $OpenBSD: cs4281.c,v 1.24 2010/08/27 18:50:57 deraadt Exp $ */
/* $Tera: cs4281.c,v 1.18 2000/12/27 14:24:45 tacha Exp $ */
/*
@@ -140,7 +140,6 @@ struct cs4281_softc {
struct ac97_host_if host_if;
/* Power Management */
- char sc_suspend;
void *sc_powerhook; /* Power hook */
u_int16_t ac97_reg[CS4281_SAVE_REG_MAX + 1]; /* Save ac97 registers */
};
@@ -158,6 +157,7 @@ struct cs4281_softc {
int cs4281_match(struct device *, void *, void *);
void cs4281_attach(struct device *, struct device *, void *);
+int cs4281_activate(struct device *, int);
int cs4281_intr(void *);
int cs4281_query_encoding(void *, struct audio_encoding *);
int cs4281_set_params(void *, int, int, struct audio_params *,
@@ -183,7 +183,7 @@ int cs4281_read_codec(void *, u_int8_t , u_int16_t *);
int cs4281_write_codec(void *, u_int8_t, u_int16_t);
void cs4281_reset_codec(void *);
-void cs4281_power(int, void *);
+void cs4281_powerhook(int, void *);
int cs4281_mixer_set_port(void *, mixer_ctrl_t *);
int cs4281_mixer_get_port(void *, mixer_ctrl_t *);
@@ -256,7 +256,8 @@ struct midi_hw_if cs4281_midi_hw_if = {
#endif
struct cfattach clct_ca = {
- sizeof(struct cs4281_softc), cs4281_match, cs4281_attach
+ sizeof(struct cs4281_softc), cs4281_match, cs4281_attach, NULL,
+ cs4281_activate
};
struct cfdriver clct_cd = {
@@ -368,8 +369,7 @@ cs4281_attach(parent, self, aux)
midi_attach_mi(&cs4281_midi_hw_if, sc, &sc->sc_dev);
#endif
- sc->sc_suspend = PWR_RESUME;
- sc->sc_powerhook = powerhook_establish(cs4281_power, sc);
+ sc->sc_powerhook = powerhook_establish(cs4281_powerhook, sc);
}
@@ -1131,18 +1131,14 @@ cs4281_init(sc)
return (0);
}
-void
-cs4281_power(why, v)
- int why;
- void *v;
+int
+cs4281_activate(struct device *self, int act)
{
- struct cs4281_softc *sc = (struct cs4281_softc *)v;
+ struct cs4281_softc *sc = (struct cs4281_softc *)self;
int i;
- DPRINTF(("%s: cs4281_power why=%d\n", sc->sc_dev.dv_xname, why));
- if (why != PWR_RESUME) {
- sc->sc_suspend = why;
-
+ switch (act) {
+ case DVACT_SUSPEND:
cs4281_halt_output(sc);
cs4281_halt_input(sc);
/* Save AC97 registers */
@@ -1153,13 +1149,8 @@ cs4281_power(why, v)
}
/* should I powerdown here ? */
cs4281_write_codec(sc, AC97_REG_POWER, CS4281_POWER_DOWN_ALL);
- } else {
- if (sc->sc_suspend == PWR_RESUME) {
- printf("cs4281_power: odd, resume without suspend.\n");
- sc->sc_suspend = why;
- return;
- }
- sc->sc_suspend = why;
+ break;
+ case DVACT_RESUME:
cs4281_init(sc);
cs4281_reset_codec(sc);
@@ -1169,7 +1160,15 @@ cs4281_power(why, v)
continue;
cs4281_write_codec(sc, 2*i, sc->ac97_reg[i>>1]);
}
+ break;
}
+ return 0;
+}
+
+void
+cs4281_powerhook(int why, void *v)
+{
+ cs4281_activate(v, why);
}
void