Index: sys/dev/audio.c
===================================================================
RCS file: /home/repos/netbsd-current/src/sys/dev/audio.c,v
retrieving revision 1.243
diff -u -r1.243 audio.c
--- sys/dev/audio.c	10 Jun 2008 22:53:08 -0000	1.243
+++ sys/dev/audio.c	16 Jan 2009 23:40:54 -0000
@@ -285,16 +285,35 @@
 	struct audio_attach_args *sa;
 	const struct audio_hw_if *hwp;
 	void *hdlp;
-	int error;
-	mixer_devinfo_t mi;
-	int iclass, mclass, oclass, rclass, props;
-	int record_master_found, record_source_found;
 
 	sc = device_private(self);
 	sc->dev = self;
+
 	sa = aux;
 	hwp = sa->hwif;
 	hdlp = sa->hdl;
+
+	sc->hw_if = hwp;
+	sc->hw_hdl = hdlp;
+	sc->sc_dev = parent;
+
+	audio_attach(sc);
+}
+
+void
+audio_attach(struct audio_softc *sc)
+{
+	const struct audio_hw_if *hwp;
+	void *hdlp;
+
+	int error;
+	mixer_devinfo_t mi;
+	int iclass, mclass, oclass, rclass, props;
+	int record_master_found, record_source_found;
+
+	hwp = sc->hw_if;
+	hdlp = sc->hw_hdl;
+
 #ifdef DIAGNOSTIC
 	if (hwp == 0 ||
 	    hwp->query_encoding == 0 ||
@@ -330,9 +349,6 @@
 
 	aprint_normal("\n");
 
-	sc->hw_if = hwp;
-	sc->hw_hdl = hdlp;
-	sc->sc_dev = parent;
 	sc->sc_opencnt = 0;
 	sc->sc_writing = sc->sc_waitcomp = 0;
 	sc->sc_lastinfovalid = false;
@@ -495,25 +511,25 @@
 
 #ifdef AUDIO_PM_IDLE
 	callout_init(&sc->sc_idle_counter, 0);
-	callout_setfunc(&sc->sc_idle_counter, audio_idle, self);
+	callout_setfunc(&sc->sc_idle_counter, audio_idle, sc->dev);
 #endif
 
-	if (!pmf_device_register(self, audio_suspend, audio_resume))
-		aprint_error_dev(self, "couldn't establish power handler\n");
+	if (!pmf_device_register(sc->dev, audio_suspend, audio_resume))
+		aprint_error_dev(sc->dev, "couldn't establish power handler\n");
 #ifdef AUDIO_PM_IDLE
-	if (!device_active_register(self, audio_activity))
-		aprint_error_dev(self, "couldn't register activity handler\n");
+	if (!device_active_register(sc->dev, audio_activity))
+		aprint_error_dev(sc->dev, "couldn't register activity handler\n");
 #endif
 
-	if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_DOWN,
+	if (!pmf_event_register(sc->dev, PMFE_AUDIO_VOLUME_DOWN,
 	    audio_volume_down, true))
-		aprint_error_dev(self, "couldn't add volume down handler\n");
-	if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_UP,
+		aprint_error_dev(sc->dev, "couldn't add volume down handler\n");
+	if (!pmf_event_register(sc->dev, PMFE_AUDIO_VOLUME_UP,
 	    audio_volume_up, true))
-		aprint_error_dev(self, "couldn't add volume up handler\n");
-	if (!pmf_event_register(self, PMFE_AUDIO_VOLUME_TOGGLE,
+		aprint_error_dev(sc->dev, "couldn't add volume up handler\n");
+	if (!pmf_event_register(sc->dev, PMFE_AUDIO_VOLUME_TOGGLE,
 	    audio_volume_toggle, true))
-		aprint_error_dev(self, "couldn't add volume toggle handler\n");
+		aprint_error_dev(sc->dev, "couldn't add volume toggle handler\n");
 
 #ifdef AUDIO_PM_IDLE
 	callout_schedule(&sc->sc_idle_counter, audio_idle_timeout * hz);
@@ -3583,6 +3599,10 @@
 		s = splaudio();
 		init_error = audio_initbufs(sc);
 		if (init_error) goto err;
+		if (sc->sc_pustream == NULL ||
+		    sc->sc_rustream == NULL) {
+			goto err;
+		}
 		if (sc->sc_pr.blksize != oldpblksize ||
 		    sc->sc_rr.blksize != oldrblksize ||
 		    sc->sc_pustream != oldpus ||
Index: sys/dev/audio_if.h
===================================================================
RCS file: /home/repos/netbsd-current/src/sys/dev/audio_if.h,v
retrieving revision 1.65
diff -u -r1.65 audio_if.h
--- sys/dev/audio_if.h	4 Mar 2008 18:23:44 -0000	1.65
+++ sys/dev/audio_if.h	14 Jan 2009 23:16:49 -0000
@@ -254,6 +254,10 @@
 
 /* Attach the MI driver(s) to the MD driver. */
 device_t audio_attach_mi(const struct audio_hw_if *, void *, device_t);
+
+/* Generic audio(9) attach routine */
+void audio_attach(struct audio_softc *);
+
 int	audioprint(void *, const char *);
 
 /* Device identity flags */
Index: sys/dev/audiovar.h
===================================================================
RCS file: /home/repos/netbsd-current/src/sys/dev/audiovar.h,v
retrieving revision 1.45
diff -u -r1.45 audiovar.h
--- sys/dev/audiovar.h	28 Apr 2008 20:23:46 -0000	1.45
+++ sys/dev/audiovar.h	14 Jan 2009 23:16:49 -0000
@@ -65,6 +65,9 @@
  */
 #ifndef _SYS_DEV_AUDIOVAR_H_
 #define _SYS_DEV_AUDIOVAR_H_
+
+#include <sys/select.h>
+
 #include <dev/audio_if.h>
 
 /*
