[PATCH] ALSA patch for 2.5.5

- added support for KERN_ prefixes for snd_printk
- verbose printk (file:number) is now optional
- fixed devfs OSS device names in soundcore
- added XRUN ioctl for PCM API
- improved support for Sound Blaster Audigy
- fixed AC3 forwarding for Sound Blaster Live!
- more fixes in dependencies in Makefiles
- llseek locking fixes for sound/core/info.c
- fixed ISA DMA allocation
- added wait() callback for ac97_codec.c and VIA686 driver
- CMIPCI driver updates
- added AMD-8111 support for Intel8x0
diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h
index 5701028..70dc293 100644
--- a/include/sound/ac97_codec.h
+++ b/include/sound/ac97_codec.h
@@ -135,6 +135,7 @@
 struct _snd_ac97 {
 	void (*write) (ac97_t *ac97, unsigned short reg, unsigned short val);
 	unsigned short (*read) (ac97_t *ac97, unsigned short reg);
+	void (*wait) (ac97_t *ac97);
 	void (*init) (ac97_t *ac97);
 	snd_info_entry_t *proc_entry;
 	snd_info_entry_t *proc_regs_entry;
diff --git a/include/sound/asound.h b/include/sound/asound.h
index 013e59f..3c7df6d 100644
--- a/include/sound/asound.h
+++ b/include/sound/asound.h
@@ -127,7 +127,7 @@
  *                                                                           *
  *****************************************************************************/
 
-#define SNDRV_PCM_VERSION			SNDRV_PROTOCOL_VERSION(2, 0, 0)
+#define SNDRV_PCM_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 1)
 
 typedef unsigned long sndrv_pcm_uframes_t;
 typedef long sndrv_pcm_sframes_t;
@@ -411,6 +411,7 @@
 	SNDRV_PCM_IOCTL_PAUSE = _IOW('A', 0x45, int),
 	SNDRV_PCM_IOCTL_REWIND = _IOW('A', 0x46, sndrv_pcm_uframes_t),
 	SNDRV_PCM_IOCTL_RESUME = _IO('A', 0x47),
+	SNDRV_PCM_IOCTL_XRUN = _IO('A', 0x48),
 	SNDRV_PCM_IOCTL_WRITEI_FRAMES = _IOW('A', 0x50, struct sndrv_xferi),
 	SNDRV_PCM_IOCTL_READI_FRAMES = _IOR('A', 0x51, struct sndrv_xferi),
 	SNDRV_PCM_IOCTL_WRITEN_FRAMES = _IOW('A', 0x52, struct sndrv_xfern),
@@ -578,7 +579,7 @@
  *                                                                          *
  ****************************************************************************/
 
-#define SNDRV_CTL_VERSION			SNDRV_PROTOCOL_VERSION(2, 0, 0)
+#define SNDRV_CTL_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 0)
 
 struct sndrv_ctl_card_info {
 	int card;			/* card number */
diff --git a/include/sound/core.h b/include/sound/core.h
index ebd845c..5744cdd 100644
--- a/include/sound/core.h
+++ b/include/sound/core.h
@@ -292,13 +292,21 @@
 /* misc.c */
 
 int snd_task_name(struct task_struct *task, char *name, size_t size);
+#ifdef CONFIG_SND_VERBOSE_PRINTK
+int snd_verbose_printk(const char *file, int line, const char *format);
+#endif
 
 /* --- */
 
+#ifdef CONFIG_SND_VERBOSE_PRINTK
 #define snd_printk(format, args...) do { \
-	printk("ALSA %s:%d: ", __FILE__, __LINE__); \
+	printk(snd_verbose_printk(__FILE__, __LINE__, format) ? format + 3 : format, ##args); \
+} while (0)
+#else
+#define snd_printk(format, args...) do { \
 	printk(format, ##args); \
 } while (0)
+#endif
 
 #ifdef CONFIG_SND_DEBUG
 
diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
index 4705a92..3f03bec 100644
--- a/include/sound/emu10k1.h
+++ b/include/sound/emu10k1.h
@@ -588,7 +588,7 @@
 #define REG53			0x53		/* DO NOT PROGRAM THIS REGISTER!!! MAY DESTROY CHIP */
 
 #define A_DBG			 0x53
-#define A_DBG_SINGLE_STEP_ADDR	 0x00020000	/* Set to zero to start dsp */
+#define A_DBG_SINGLE_STEP	 0x00020000	/* Set to zero to start dsp */
 #define A_DBG_ZC		 0x40000000	/* zero tram counter */
 #define A_DBG_STEP_ADDR		 0x000003ff
 #define A_DBG_SATURATION_OCCURED 0x20000000
@@ -657,6 +657,11 @@
 #define SRCS_RATELOCKED		0x01000000	/* Sample rate locked				*/
 #define SRCS_ESTSAMPLERATE	0x0007ffff	/* Do not modify this field.			*/
 
+/* Note that these values can vary +/- by a small amount                                        */
+#define SRCS_SPDIFRATE_44	0x0003acd9
+#define SRCS_SPDIFRATE_48	0x00040000
+#define SRCS_SPDIFRATE_96	0x00080000
+
 #define MICIDX                  0x63            /* Microphone recording buffer index register   */
 #define MICIDX_MASK             0x0000ffff      /* 16-bit value                                 */
 #define MICIDX_IDX		0x10000063
@@ -683,15 +688,15 @@
 #define A_MUSTAT2		A_MUCMD2	
 
 #define A_SPDIF_SAMPLERATE	0x76		/* Set the sample rate of SPDIF output		*/
-#define A_SPDIF_48000		0x00000000
-#define A_SPDIF_44100		0x00000040
-#define A_SPDIF_96000		0x00000080
+#define A_SPDIF_48000		0x00000080
+#define A_SPDIF_44100		0x00000000
+#define A_SPDIF_96000		0x00000040
 
 #define A_FXRT2			0x7c
-#define A_FXRT_CHANNELE		0x0000003f	/* Effects send bus number for channel's effects send A	*/
-#define A_FXRT_CHANNELF		0x00003f00	/* Effects send bus number for channel's effects send B	*/
-#define A_FXRT_CHANNELG		0x003f0000	/* Effects send bus number for channel's effects send C	*/
-#define A_FXRT_CHANNELH		0x3f000000	/* Effects send bus number for channel's effects send D	*/
+#define A_FXRT_CHANNELE		0x0000003f	/* Effects send bus number for channel's effects send E	*/
+#define A_FXRT_CHANNELF		0x00003f00	/* Effects send bus number for channel's effects send F	*/
+#define A_FXRT_CHANNELG		0x003f0000	/* Effects send bus number for channel's effects send G	*/
+#define A_FXRT_CHANNELH		0x3f000000	/* Effects send bus number for channel's effects send H	*/
 
 #define A_SENDAMOUNTS		0x7d
 #define A_FXSENDAMOUNT_E_MASK	0xFF000000
@@ -797,8 +802,8 @@
 };
 
 typedef struct {
-	unsigned long send_routing[3];
-	unsigned char send_volume[3][4];
+	unsigned char send_routing[3][8];
+	unsigned char send_volume[3][8];
 	unsigned short attn[3];
 	snd_kcontrol_t *ctl_send_routing;
 	snd_kcontrol_t *ctl_send_volume;
@@ -806,6 +811,15 @@
 	emu10k1_pcm_t *epcm;
 } emu10k1_pcm_mixer_t;
 
+#define snd_emu10k1_compose_send_routing(route) \
+((route[0] | (route[1] << 4) | (route[2] << 8) | (route[3] << 12)) << 16)
+
+#define snd_emu10k1_compose_audigy_fxrt1(route) \
+(((unsigned int)route[0] | ((unsigned int)route[1] << 8) | ((unsigned int)route[2] << 16) | ((unsigned int)route[3] << 12)) << 24)
+
+#define snd_emu10k1_compose_audigy_fxrt2(route) \
+(((unsigned int)route[4] | ((unsigned int)route[5] << 8) | ((unsigned int)route[6] << 16) | ((unsigned int)route[7] << 12)) << 24)
+
 typedef struct snd_emu10k1_memblk {
 	snd_util_memblk_t mem;
 	/* private part */
@@ -1102,11 +1116,11 @@
 #define GPR_NOISE1	0x59		/* noise source */
 #define GPR_IRQ		0x5a		/* IRQ register */
 #define GPR_DBAC	0x5b		/* TRAM Delay Base Address Counter */
-#define GPR(x)		(FXGPREGBASE + (x))	/* free GPRs: x = 0x00 - 0xff */
-#define ITRAM_DATA(x)	(TANKMEMDATAREGBASE + (x))	/* x = 0x00 - 0x7f */
-#define ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 80 + (x))	/* x = 0x00 - 0x1f */
-#define ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + (x))	/* x = 0x00 - 0x7f */
-#define ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 80 + (x))	/* x = 0x00 - 0x1f */
+#define GPR(x)		(FXGPREGBASE + (x)) /* free GPRs: x = 0x00 - 0xff */
+#define ITRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
+#define ETRAM_DATA(x)	(TANKMEMDATAREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
+#define ITRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x00 + (x)) /* x = 0x00 - 0x7f */
+#define ETRAM_ADDR(x)	(TANKMEMADDRREGBASE + 0x80 + (x)) /* x = 0x00 - 0x1f */
 
 #define A_FXBUS(x)	(0x00 + (x))	/* x = 0x00 - 0x3f? */
 #define A_EXTIN(x)	(0x40 + (x))	/* x = 0x00 - 0x1f? */
@@ -1171,6 +1185,10 @@
 #define A_EXTIN_AC97_R		0x01	/* AC'97 capture channel - right */
 #define A_EXTIN_SPDIF_CD_L	0x02	/* digital CD left */
 #define A_EXTIN_SPDIF_CD_R	0x03	/* digital CD left */
+#define A_EXTIN_LINE2_L		0x08	/* audigy drive line2/mic2 - left */
+#define A_EXTIN_LINE2_R		0x09	/*                           right */
+#define A_EXTIN_AUX2_L		0x0c	/* audigy drive aux2 - left */
+#define A_EXTIN_AUX2_R		0x0d	/*                   - right */
 
 /* Audigiy Outputs */
 #define A_EXTOUT_FRONT_L	0x00	/* digital front left */
@@ -1189,9 +1207,38 @@
 /* 0x0d ?? */
 #define A_EXTOUT_AREAR_L	0x0e	/* analog rear left */
 #define A_EXTOUT_AREAR_R	0x0f	/*             right */
-/* 0x10-0x15 ?? */
-#define A_EXTOUT_ADC_CAP_L	0x16	/* ADC capture buffer left */
-#define A_EXTOUT_ADC_CAP_R	0x17	/*                    right */
+#define A_EXTOUT_AC97_L		0x10	/* AC97 left (front) */
+#define A_EXTOUT_AC97_R		0x11	/*      right */
+#define A_EXTOUT_ADC_CAP_L	0x12	/* ADC capture buffer left */
+#define A_EXTOUT_ADC_CAP_R	0x13	/*                    right */
+
+/* Audigy constants */
+#define A_C_00000000	0xc0
+#define A_C_00000001	0xc1
+#define A_C_00000002	0xc2
+#define A_C_00000003	0xc3
+#define A_C_00000004	0xc4
+#define A_C_00000008	0xc5
+#define A_C_00000010	0xc6
+#define A_C_00000020	0xc7
+#define A_C_00000100	0xc8
+#define A_C_00010000	0xc9
+#define A_C_00000800	0xca
+#define A_C_10000000	0xcb
+#define A_C_20000000	0xcc
+#define A_C_40000000	0xcd
+#define A_C_80000000	0xce
+#define A_C_7fffffff	0xcf
+#define A_C_ffffffff	0xd0
+#define A_C_fffffffe	0xd1
+#define A_C_c0000000	0xd2
+#define A_C_4f1bbcdc	0xd3
+#define A_C_5a7ef9db	0xd4
+#define A_C_00100000	0xd5
+/* 0xd6 = 0x7fffffff  (?) ACCUM? */
+/* 0xd7 = 0x0000000   CCR */
+/* 0xd8 = noise1 */
+/* 0xd9 = noise2 */
 
 /* definitions for debug register */
 #define EMU10K1_DBG_ZC			0x80000000	/* zero tram counter */
diff --git a/include/sound/version.h b/include/sound/version.h
index eac7e72..50a7e6f 100644
--- a/include/sound/version.h
+++ b/include/sound/version.h
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated automatically by configure.  */
-#define CONFIG_SND_VERSION "0.9.0beta11"
-#define CONFIG_SND_DATE " (Tue Feb 19 08:14:59 2002 UTC)"
+#define CONFIG_SND_VERSION "0.9.0beta12"
+#define CONFIG_SND_DATE " (Tue Feb 26 09:34:24 2002 UTC)"
diff --git a/sound/Makefile b/sound/Makefile
index 5f8ab02..2d056ab 100644
--- a/sound/Makefile
+++ b/sound/Makefile
@@ -10,6 +10,7 @@
 subdir-$(CONFIG_SOUND_PRIME) += oss
 
 ifeq ($(CONFIG_SOUND_PRIME),y)
+  subdir-m += oss
   obj-y += oss/sounddrivers.o
 endif
 
diff --git a/sound/core/Config.in b/sound/core/Config.in
index bd5bf6c..5e9b5a1 100644
--- a/sound/core/Config.in
+++ b/sound/core/Config.in
@@ -1,6 +1,5 @@
 # ALSA soundcard-configuration
 
-dep_tristate '  RTC Timer support' CONFIG_SND_RTCTIMER $CONFIG_SND
 dep_tristate '  Sequencer support' CONFIG_SND_SEQUENCER $CONFIG_SND
 if [ "$CONFIG_SND_SEQUENCER" != "n" ]; then
   dep_tristate '  Sequencer dummy client' CONFIG_SND_SEQ_DUMMY $CONFIG_SND_SEQUENCER
@@ -13,9 +12,10 @@
     dep_tristate '    OSS Sequencer API' CONFIG_SND_SEQUENCER_OSS $CONFIG_SND_SEQUENCER
   fi
 fi
+dep_tristate '  RTC Timer support' CONFIG_SND_RTCTIMER $CONFIG_SND
+bool '  Verbose printk' CONFIG_SND_VERBOSE_PRINTK
 bool '  Debug' CONFIG_SND_DEBUG
 if [ "$CONFIG_SND_DEBUG" = "y" ]; then
   bool '    Debug memory' CONFIG_SND_DEBUG_MEMORY
-  bool '    Debug full' CONFIG_SND_DEBUG_FULL
   bool '    Debug detection' CONFIG_SND_DEBUG_DETECT
 fi
diff --git a/sound/core/Makefile b/sound/core/Makefile
index 3168272a3..50dd397 100644
--- a/sound/core/Makefile
+++ b/sound/core/Makefile
@@ -33,16 +33,18 @@
 subdir-$(CONFIG_SND_MIXER_OSS) += oss
 subdir-$(CONFIG_SND_PCM_OSS) += oss
 ifeq ($(filter $(subdir-y),oss),oss)
+  subdir-m += oss
   obj-y += oss/oss.o
 endif
 
 subdir-$(CONFIG_SND_SEQUENCER) += seq
 ifeq ($(CONFIG_SND_SEQUENCER),y)
-  ifeq ($(CONFIG_SND),y)
-     obj-y += seq/sq.o
-  endif
+  subdir-m += seq
+  obj-y += seq/sq.o
 endif
 
+obj-$(CONFIG_SND_SEQUENCER) += snd-timer.o
+
 # Toplevel Module Dependency
 obj-$(CONFIG_SND_DUMMY) += snd-pcm.o snd-timer.o snd.o
 obj-$(CONFIG_SND_VIRMIDI) += snd-rawmidi.o snd.o snd-timer.o
@@ -69,7 +71,7 @@
 obj-$(CONFIG_SND_OPTI92X_AD1848) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
 obj-$(CONFIG_SND_OPTI92X_CS4231) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
 obj-$(CONFIG_SND_OPTI93X) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
-obj-$(CONFIG_SND_SB) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
+obj-$(CONFIG_SND_SB8) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
 obj-$(CONFIG_SND_SB16) += snd-pcm.o snd-timer.o snd.o snd-hwdep.o snd-rawmidi.o
 obj-$(CONFIG_SND_SBAWE) += snd-pcm.o snd-timer.o snd.o snd-hwdep.o snd-rawmidi.o
 obj-$(CONFIG_SND_ES968) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o
@@ -79,7 +81,7 @@
 obj-$(CONFIG_SND_CS4281) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
 obj-$(CONFIG_SND_ENS1370) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o
 obj-$(CONFIG_SND_ENS1371) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o
-obj-$(CONFIG_SND_ES1938) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
+obj-$(CONFIG_SND_ES1938) += snd-pcm.o snd-timer.o snd.o snd-hwdep.o snd-rawmidi.o
 obj-$(CONFIG_SND_ES1968) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o
 obj-$(CONFIG_SND_FM801) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o snd-hwdep.o
 obj-$(CONFIG_SND_ICE1712) += snd-pcm.o snd-timer.o snd.o snd-rawmidi.o
diff --git a/sound/core/control.c b/sound/core/control.c
index 840b563..b809c17 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -166,7 +166,7 @@
 			ev->mask = mask;
 			list_add_tail(&ev->list, &ctl->events);
 		} else {
-			snd_printk("No memory available to allocate event\n");
+			snd_printk(KERN_ERR "No memory available to allocate event\n");
 		}
 	_found:
 		wake_up(&ctl->change_sleep);
diff --git a/sound/core/device.c b/sound/core/device.c
index a5d8efa..39ee157 100644
--- a/sound/core/device.c
+++ b/sound/core/device.c
@@ -58,11 +58,11 @@
 		list_del(&dev->list);
 		if (dev->state == SNDRV_DEV_REGISTERED && dev->ops->dev_unregister) {
 			if (dev->ops->dev_unregister(dev))
-				snd_printk("device unregister failure\n");
+				snd_printk(KERN_ERR "device unregister failure\n");
 		} else {
 			if (dev->ops->dev_free) {
 				if (dev->ops->dev_free(dev))
-					snd_printk("device free failure\n");
+					snd_printk(KERN_ERR "device free failure\n");
 			}
 		}
 		snd_magic_kfree(dev);
diff --git a/sound/core/hwdep.c b/sound/core/hwdep.c
index 5a860ea..1714df1 100644
--- a/sound/core/hwdep.c
+++ b/sound/core/hwdep.c
@@ -321,7 +321,7 @@
 	if ((err = snd_register_device(SNDRV_DEVICE_TYPE_HWDEP,
 				       hwdep->card, hwdep->device,
 				       &snd_hwdep_reg, name)) < 0) {
-		snd_printk("unable to register hardware dependant device %i:%i\n",
+		snd_printk(KERN_ERR "unable to register hardware dependant device %i:%i\n",
 			   hwdep->card->number, hwdep->device);
 		snd_hwdep_devices[idx] = NULL;
 		up(&register_mutex);
@@ -331,12 +331,12 @@
 	hwdep->ossreg = 0;
 	if (hwdep->oss_type >= 0) {
 		if ((hwdep->oss_type == SNDRV_OSS_DEVICE_TYPE_DMFM) && (hwdep->device != 0)) {
-			snd_printk ("only hwdep device 0 can be registered as OSS direct FM device!\n");
+			snd_printk (KERN_WARNING "only hwdep device 0 can be registered as OSS direct FM device!\n");
 		} else {
 			if (snd_register_oss_device(hwdep->oss_type,
 						    hwdep->card, hwdep->device,
 						    &snd_hwdep_reg, hwdep->oss_dev) < 0) {
-				snd_printk("unable to register OSS compatibility device %i:%i\n",
+				snd_printk(KERN_ERR "unable to register OSS compatibility device %i:%i\n",
 					   hwdep->card->number, hwdep->device);
 			} else {
 				snd_oss_info_register(SNDRV_OSS_INFO_DEV_SYNTH, hwdep->card->number, hwdep->name);
diff --git a/sound/core/info.c b/sound/core/info.c
index 3faa42e04..5e6eb49 100644
--- a/sound/core/info.c
+++ b/sound/core/info.c
@@ -430,7 +430,7 @@
 			if (entry->c.text.write) {
 				entry->c.text.write(entry, data->wbuffer);
 				if (data->wbuffer->error) {
-					snd_printk("data write error to %s (%i)\n",
+					snd_printk(KERN_WARNING "data write error to %s (%i)\n",
 						entry->name,
 						data->wbuffer->error);
 				}
diff --git a/sound/core/init.c b/sound/core/init.c
index 6d35d52..80286c7 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -74,7 +74,7 @@
 	if (idx < 0 || idx >= snd_ecards_limit) {
 		write_unlock(&snd_card_rwlock);
 		if (idx >= snd_ecards_limit)
-			snd_printk("card %i is out of range (0-%i)\n", idx, snd_ecards_limit-1);
+			snd_printk(KERN_ERR "card %i is out of range (0-%i)\n", idx, snd_ecards_limit-1);
 		goto __error;
 	}
 	snd_cards_lock |= 1 << idx;		/* lock it */
@@ -140,26 +140,26 @@
 		snd_mixer_oss_notify_callback(card, 1);
 #endif
 	if (snd_device_free_all(card, SNDRV_DEV_CMD_PRE) < 0) {
-		snd_printk("unable to free all devices (pre)\n");
+		snd_printk(KERN_ERR "unable to free all devices (pre)\n");
 		/* Fatal, but this situation should never occur */
 	}
 	if (snd_device_free_all(card, SNDRV_DEV_CMD_NORMAL) < 0) {
-		snd_printk("unable to free all devices (normal)\n");
+		snd_printk(KERN_ERR "unable to free all devices (normal)\n");
 		/* Fatal, but this situation should never occur */
 	}
 	if (snd_ctl_unregister(card) < 0) {
-		snd_printk("unable to unregister control minors\n");
+		snd_printk(KERN_ERR "unable to unregister control minors\n");
 		/* Not fatal error */
 	}
 	if (snd_device_free_all(card, SNDRV_DEV_CMD_POST) < 0) {
-		snd_printk("unable to free all devices (post)\n");
+		snd_printk(KERN_ERR "unable to free all devices (post)\n");
 		/* Fatal, but this situation should never occur */
 	}
 	if (card->private_free)
 		card->private_free(card);
 	snd_info_free_entry(card->proc_id);
 	if (snd_info_card_unregister(card) < 0) {
-		snd_printk("unable to unregister card info\n");
+		snd_printk(KERN_WARNING "unable to unregister card info\n");
 		/* Not fatal error */
 	}
 	write_lock(&snd_card_rwlock);
diff --git a/sound/core/memory.c b/sound/core/memory.c
index 0f051ef..25664f8 100644
--- a/sound/core/memory.c
+++ b/sound/core/memory.c
@@ -68,28 +68,28 @@
 	struct list_head *head;
 	struct snd_alloc_track *t;
 	if (snd_alloc_pages > 0)
-		snd_printk("Not freed snd_alloc_pages = %li\n", snd_alloc_pages);
+		snd_printk(KERN_ERR "Not freed snd_alloc_pages = %li\n", snd_alloc_pages);
 	if (snd_alloc_kmalloc > 0)
-		snd_printk("Not freed snd_alloc_kmalloc = %li\n", snd_alloc_kmalloc);
+		snd_printk(KERN_ERR "Not freed snd_alloc_kmalloc = %li\n", snd_alloc_kmalloc);
 	if (snd_alloc_vmalloc > 0)
-		snd_printk("Not freed snd_alloc_vmalloc = %li\n", snd_alloc_vmalloc);
+		snd_printk(KERN_ERR "Not freed snd_alloc_vmalloc = %li\n", snd_alloc_vmalloc);
 	for (head = snd_alloc_kmalloc_list.prev;
 	     head != &snd_alloc_kmalloc_list; head = head->prev) {
 		t = list_entry(head, struct snd_alloc_track, list);
 		if (t->magic != KMALLOC_MAGIC) {
-			snd_printk("Corrupted kmalloc\n");
+			snd_printk(KERN_ERR "Corrupted kmalloc\n");
 			break;
 		}
-		snd_printk("kmalloc(%ld) from %p not freed\n", (long) t->size, t->caller);
+		snd_printk(KERN_ERR "kmalloc(%ld) from %p not freed\n", (long) t->size, t->caller);
 	}
 	for (head = snd_alloc_vmalloc_list.prev;
 	     head != &snd_alloc_vmalloc_list; head = head->prev) {
 		t = list_entry(head, struct snd_alloc_track, list);
 		if (t->magic != VMALLOC_MAGIC) {
-			snd_printk("Corrupted vmalloc\n");
+			snd_printk(KERN_ERR "Corrupted vmalloc\n");
 			break;
 		}
-		snd_printk("vmalloc(%ld) from %p not freed\n", (long) t->size, t->caller);
+		snd_printk(KERN_ERR "vmalloc(%ld) from %p not freed\n", (long) t->size, t->caller);
 	}
 }
 
@@ -125,12 +125,12 @@
 	unsigned long flags;
 	struct snd_alloc_track *t;
 	if (obj == NULL) {
-		snd_printk("null kfree (called from %p)\n", __builtin_return_address(0));
+		snd_printk(KERN_WARNING "null kfree (called from %p)\n", __builtin_return_address(0));
 		return;
 	}
 	t = snd_alloc_track_entry(obj);
 	if (t->magic != KMALLOC_MAGIC) {
-		snd_printk("bad kfree (called from %p)\n", __builtin_return_address(0));
+		snd_printk(KERN_WARNING "bad kfree (called from %p)\n", __builtin_return_address(0));
 		return;
 	}
 	spin_lock_irqsave(&snd_alloc_kmalloc_lock, flags);
@@ -166,7 +166,7 @@
 {
 	unsigned long *ptr = _ptr;
 	if (ptr == NULL) {
-		snd_printk("null snd_magic_kfree (called from %p)\n", __builtin_return_address(0));
+		snd_printk(KERN_WARNING "null snd_magic_kfree (called from %p)\n", __builtin_return_address(0));
 		return;
 	}
 	*--ptr = 0;
@@ -174,7 +174,7 @@
 		struct snd_alloc_track *t;
 		t = snd_alloc_track_entry(ptr);
 		if (t->magic != KMALLOC_MAGIC) {
-			snd_printk("bad snd_magic_kfree (called from %p)\n", __builtin_return_address(0));
+			snd_printk(KERN_ERR "bad snd_magic_kfree (called from %p)\n", __builtin_return_address(0));
 			return;
 		}
 	}
@@ -204,12 +204,12 @@
 {
 	struct snd_alloc_track *t;
 	if (obj == NULL) {
-		snd_printk("null vfree (called from %p)\n", __builtin_return_address(0));
+		snd_printk(KERN_WARNING "null vfree (called from %p)\n", __builtin_return_address(0));
 		return;
 	}
 	t = snd_alloc_track_entry(obj);
 	if (t->magic != VMALLOC_MAGIC) {
-		snd_printk("bad vfree (called from %p)\n", __builtin_return_address(0));
+		snd_printk(KERN_ERR "bad vfree (called from %p)\n", __builtin_return_address(0));
 		return;
 	}
 	spin_lock(&snd_alloc_vmalloc_lock);
@@ -516,29 +516,36 @@
 /*
  * A dirty hack... when the kernel code is fixed this should be removed.
  *
- * since pci_alloc_consistent always tries GFP_ATOMIC when the requested
+ * since pci_alloc_consistent always tries GFP_DMA when the requested
  * pci memory region is below 32bit, it happens quite often that even
  * 2 order or pages cannot be allocated.
  *
- * so in the following, GFP_ATOMIC is used only when the first allocation
+ * so in the following, GFP_DMA is used only when the first allocation
  * doesn't match the requested region.
  */
+#ifdef __i386__
+#define get_phys_addr(x) virt_to_phys(x)
+#else /* ppc */
+#define get_phys_addr(x) virt_to_bus(x)
+#endif
 void *snd_pci_hack_alloc_consistent(struct pci_dev *hwdev, size_t size,
 				    dma_addr_t *dma_handle)
 {
 	void *ret;
 	int gfp = GFP_ATOMIC;
 
+	if (hwdev == NULL)
+		gfp |= GFP_DMA;
 	ret = (void *)__get_free_pages(gfp, get_order(size));
 	if (ret) {
-		if (hwdev && ((virt_to_phys(ret) + size - 1) & ~hwdev->dma_mask)) {
+		if (hwdev && ((get_phys_addr(ret) + size - 1) & ~hwdev->dma_mask)) {
 			free_pages((unsigned long)ret, get_order(size));
 			ret = (void *)__get_free_pages(gfp | GFP_DMA, get_order(size));
 		}
 	}
 	if (ret) {
 		memset(ret, 0, size);
-		*dma_handle = virt_to_phys(ret);
+		*dma_handle = get_phys_addr(ret);
 	}
 	return ret;
 }
diff --git a/sound/core/misc.c b/sound/core/misc.c
index 195552a..2e39398 100644
--- a/sound/core/misc.c
+++ b/sound/core/misc.c
@@ -36,3 +36,18 @@
 	name[idx] = '\0';
 	return 0;
 }
+
+#ifdef CONFIG_SND_VERBOSE_PRINTK
+int snd_verbose_printk(const char *file, int line, const char *format)
+{
+	if (format[0] == '<' && format[1] >= '0' && format[1] <= '9' && format[2] == '>') {
+		char tmp[] = "<0>ALSA %s:%d: ";
+		tmp[1] = format[1];
+		printk("%sALSA %s:%d: ", tmp, file, line);
+		return 1;
+	} else {
+		printk("ALSA %s:%d: ", file, line);
+		return 0;
+	}
+}
+#endif
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 3bedabf..0519851 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -104,7 +104,7 @@
 		snd_timestamp_now((snd_timestamp_t*)&runtime->status->tstamp);
 #ifdef CONFIG_SND_DEBUG
 	if (pos > runtime->buffer_size) {
-		snd_printk("BUG: stream = %i, pos = 0x%lx, buffer size = 0x%lx, period size = 0x%lx\n", substream->stream, pos, runtime->buffer_size, runtime->period_size);
+		snd_printk(KERN_ERR  "BUG: stream = %i, pos = 0x%lx, buffer size = 0x%lx, period size = 0x%lx\n", substream->stream, pos, runtime->buffer_size, runtime->period_size);
 	} else
 #endif
 	snd_runtime_check(pos <= runtime->buffer_size, return 0);
@@ -170,7 +170,7 @@
 		snd_timestamp_now((snd_timestamp_t*)&runtime->status->tstamp);
 #ifdef CONFIG_SND_DEBUG
 	if (pos > runtime->buffer_size) {
-		snd_printk("BUG: stream = %i, pos = 0x%lx, buffer size = 0x%lx, period size = 0x%lx\n", substream->stream, pos, runtime->buffer_size, runtime->period_size);
+		snd_printk(KERN_ERR "BUG: stream = %i, pos = 0x%lx, buffer size = 0x%lx, period size = 0x%lx\n", substream->stream, pos, runtime->buffer_size, runtime->period_size);
 	} else
 #endif
 	snd_runtime_check(pos <= runtime->buffer_size, return 0);
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 3cacd998..88381f81 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -837,6 +837,42 @@
 
 #endif /* CONFIG_PM */
 
+static int snd_pcm_xrun(snd_pcm_substream_t *substream)
+{
+	snd_card_t *card = substream->pcm->card;
+	snd_pcm_runtime_t *runtime = substream->runtime;
+	int result;
+
+	snd_power_lock(card);
+	spin_lock_irq(&runtime->lock);
+       _xrun_recovery:
+	switch (runtime->status->state) {
+	case SNDRV_PCM_STATE_XRUN:
+		result = 0;	/* already there */
+		break;
+	case SNDRV_PCM_STATE_RUNNING:
+		result = snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
+		break;
+	case SNDRV_PCM_STATE_SUSPENDED:
+		while (snd_power_get_state(card) != SNDRV_CTL_POWER_D0) {
+			if (substream->ffile->f_flags & O_NONBLOCK) {
+				result = -EAGAIN;
+				goto _end;
+			}
+			spin_unlock_irq(&runtime->lock);
+			snd_power_wait(card);
+			spin_lock_irq(&runtime->lock);
+		}
+		goto _xrun_recovery;
+	default:
+		result = -EBADFD;
+	}
+       _end:
+	spin_unlock_irq(&runtime->lock);
+	snd_power_unlock(card);
+	return result;
+}
+
 static inline int snd_pcm_pre_reset(snd_pcm_substream_t * substream, int state)
 {
 	snd_pcm_runtime_t *runtime = substream->runtime;
@@ -1999,6 +2035,10 @@
 		return snd_pcm_link(substream, (long) arg);
 	case SNDRV_PCM_IOCTL_UNLINK:
 		return snd_pcm_unlink(substream);
+	case SNDRV_PCM_IOCTL_RESUME:
+		return snd_pcm_resume(substream);
+	case SNDRV_PCM_IOCTL_XRUN:
+		return snd_pcm_xrun(substream);
 	}
 	snd_printd("unknown ioctl = 0x%x\n", cmd);
 	return -ENOTTY;
@@ -2071,8 +2111,6 @@
 		return snd_pcm_playback_drop(substream);
 	case SNDRV_PCM_IOCTL_DELAY:
 		return snd_pcm_playback_delay(substream, (snd_pcm_sframes_t*) arg);
-	case SNDRV_PCM_IOCTL_RESUME:
-		return snd_pcm_resume(substream);
 	}
 	return snd_pcm_common_ioctl1(substream, cmd, arg);
 }
@@ -2136,8 +2174,6 @@
 		return snd_pcm_capture_drop(substream);
 	case SNDRV_PCM_IOCTL_DELAY:
 		return snd_pcm_capture_delay(substream, (snd_pcm_sframes_t*) arg);
-	case SNDRV_PCM_IOCTL_RESUME:
-		return snd_pcm_resume(substream);
 	}
 	return snd_pcm_common_ioctl1(substream, cmd, arg);
 }
diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c
index 18f6815..9c6a7c0 100644
--- a/sound/core/rawmidi.c
+++ b/sound/core/rawmidi.c
@@ -769,7 +769,7 @@
 	}
 #ifdef CONFIG_SND_DEBUG
 	default:
-		snd_printk("rawmidi: unknown command = 0x%x\n", cmd);
+		snd_printk(KERN_WARNING "rawmidi: unknown command = 0x%x\n", cmd);
 #endif
 	}
 	return -ENOTTY;
@@ -1408,7 +1408,7 @@
 	if ((err = snd_register_device(SNDRV_DEVICE_TYPE_RAWMIDI,
 				       rmidi->card, rmidi->device,
 				       &snd_rawmidi_reg, name)) < 0) {
-		snd_printk("unable to register rawmidi device %i:%i\n", rmidi->card->number, rmidi->device);
+		snd_printk(KERN_ERR "unable to register rawmidi device %i:%i\n", rmidi->card->number, rmidi->device);
 		snd_rawmidi_devices[idx] = NULL;
 		up(&register_mutex);
 		return err;
@@ -1425,7 +1425,7 @@
 	if (rmidi->device == snd_midi_map[rmidi->card->number]) {
 		if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
 					    rmidi->card, 0, &snd_rawmidi_reg, name) < 0) {
-			snd_printk("unable to register OSS rawmidi device %i:%i\n", rmidi->card->number, 0);
+			snd_printk(KERN_ERR "unable to register OSS rawmidi device %i:%i\n", rmidi->card->number, 0);
 		} else {
 			rmidi->ossreg++;
 			snd_oss_info_register(SNDRV_OSS_INFO_DEV_MIDI, rmidi->card->number, rmidi->name);
@@ -1434,7 +1434,7 @@
 	if (rmidi->device == snd_amidi_map[rmidi->card->number]) {
 		if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
 					    rmidi->card, 1, &snd_rawmidi_reg, name) < 0) {
-			snd_printk("unable to register OSS rawmidi device %i:%i\n", rmidi->card->number, 1);
+			snd_printk(KERN_ERR "unable to register OSS rawmidi device %i:%i\n", rmidi->card->number, 1);
 		} else {
 			rmidi->ossreg++;
 		}
@@ -1532,11 +1532,11 @@
 	/* check device map table */
 	for (i = 0; i < SNDRV_CARDS; i++) {
 		if (snd_midi_map[i] < 0 || snd_midi_map[i] >= SNDRV_RAWMIDI_DEVICES) {
-			snd_printk("invalid midi_map[%d] = %d\n", i, snd_midi_map[i]);
+			snd_printk(KERN_ERR "invalid midi_map[%d] = %d\n", i, snd_midi_map[i]);
 			snd_midi_map[i] = 0;
 		}
 		if (snd_amidi_map[i] < 0 || snd_amidi_map[i] >= SNDRV_RAWMIDI_DEVICES) {
-			snd_printk("invalid amidi_map[%d] = %d\n", i, snd_amidi_map[i]);
+			snd_printk(KERN_ERR "invalid amidi_map[%d] = %d\n", i, snd_amidi_map[i]);
 			snd_amidi_map[i] = 1;
 		}
 	}
diff --git a/sound/core/rtctimer.c b/sound/core/rtctimer.c
index db1452c..51005b6 100644
--- a/sound/core/rtctimer.c
+++ b/sound/core/rtctimer.c
@@ -156,13 +156,13 @@
 	snd_timer_t *timer;
 
 	if (rtctimer_freq < 2 || rtctimer_freq > 8192) {
-		snd_printk("rtctimer: invalid frequency %d\n", rtctimer_freq);
+		snd_printk(KERN_ERR "rtctimer: invalid frequency %d\n", rtctimer_freq);
 		return -EINVAL;
 	}
 	for (order = 1; rtctimer_freq > order; order <<= 1)
 		;
 	if (rtctimer_freq != order) {
-		snd_printk("rtctimer: invalid frequency %d\n", rtctimer_freq);
+		snd_printk(KERN_ERR "rtctimer: invalid frequency %d\n", rtctimer_freq);
 		return -EINVAL;
 	}
 
diff --git a/sound/core/seq/Makefile b/sound/core/seq/Makefile
index 6e1c83b..ef7fc7a 100644
--- a/sound/core/seq/Makefile
+++ b/sound/core/seq/Makefile
@@ -32,6 +32,8 @@
 snd-seq-dummy-objs := seq_dummy.o
 snd-seq-virmidi-objs := seq_virmidi.o
 
+obj-$(CONFIG_SND_SEQUENCER) += snd-seq.o snd-seq-device.o
+obj-$(CONFIG_SND_SEQUENCER_OSS) += snd-seq-midi-event.o
 obj-$(CONFIG_SND_SEQ_DUMMY) += snd-seq-dummy.o
 
 # Toplevel Module Dependency
@@ -56,7 +58,7 @@
 obj-$(CONFIG_SND_OPTI92X_AD1848) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 obj-$(CONFIG_SND_OPTI92X_CS4231) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 obj-$(CONFIG_SND_OPTI93X) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
-obj-$(CONFIG_SND_SB) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
+obj-$(CONFIG_SND_SB8) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 obj-$(CONFIG_SND_SB16) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 obj-$(CONFIG_SND_SBAWE) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o snd-seq-virmidi.o
 obj-$(CONFIG_SND_ES968) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
@@ -66,7 +68,7 @@
 obj-$(CONFIG_SND_CS4281) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 obj-$(CONFIG_SND_ENS1370) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
 obj-$(CONFIG_SND_ENS1371) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
-obj-$(CONFIG_SND_ES1938) += snd-seq-device.o snd-seq-midi-emul.o snd-seq.o snd-seq-instr.o
+obj-$(CONFIG_SND_ES1938) += snd-seq-device.o snd-seq-midi-emul.o snd-seq.o snd-seq-instr.o snd-seq-midi.o snd-seq-midi-event.o
 obj-$(CONFIG_SND_ES1968) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
 obj-$(CONFIG_SND_FM801) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 obj-$(CONFIG_SND_ICE1712) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
@@ -76,7 +78,7 @@
 obj-$(CONFIG_SND_CS46XX) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
 obj-$(CONFIG_SND_EMU10K1) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-virmidi.o
 obj-$(CONFIG_SND_TRIDENT) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
-obj-$(CONFIG_SND_YMFPCI) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o
+obj-$(CONFIG_SND_YMFPCI) += snd-seq-midi.o snd-seq.o snd-seq-device.o snd-seq-midi-event.o snd-seq-midi-emul.o snd-seq-instr.o
 
 include $(TOPDIR)/Rules.make
 
diff --git a/sound/core/seq/instr/Makefile b/sound/core/seq/instr/Makefile
index 526f484..936a32e 100644
--- a/sound/core/seq/instr/Makefile
+++ b/sound/core/seq/instr/Makefile
@@ -33,7 +33,7 @@
 obj-$(CONFIG_SND_OPTI92X_AD1848) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_OPTI92X_CS4231) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_OPTI93X) += snd-ainstr-fm.o
-obj-$(CONFIG_SND_SB) += snd-ainstr-fm.o
+obj-$(CONFIG_SND_SB8) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_SB16) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_SBAWE) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_WAVEFRONT) += snd-ainstr-fm.o
@@ -44,6 +44,7 @@
 obj-$(CONFIG_SND_FM801) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_SONICVIBES) += snd-ainstr-fm.o
 obj-$(CONFIG_SND_TRIDENT) += snd-ainstr-simple.o
+obj-$(CONFIG_SND_YMFPCI) += snd-ainstr-fm.o
 
 include $(TOPDIR)/Rules.make
 
diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c
index 8980458..da211db 100644
--- a/sound/core/seq/oss/seq_oss.c
+++ b/sound/core/seq/oss/seq_oss.c
@@ -222,7 +222,7 @@
 					  NULL, 0,
 					  &seq_oss_reg,
 					  SNDRV_SEQ_OSS_DEVNAME)) < 0) {
-		snd_printk("can't register device seq\n");
+		snd_printk(KERN_ERR "can't register device seq\n");
 		up(&register_mutex);
 		return rc;
 	}
@@ -230,7 +230,7 @@
 					  NULL, 0,
 					  &seq_oss_reg,
 					  SNDRV_SEQ_OSS_DEVNAME)) < 0) {
-		snd_printk("can't register device music\n");
+		snd_printk(KERN_ERR "can't register device music\n");
 		snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0);
 		up(&register_mutex);
 		return rc;
@@ -245,11 +245,10 @@
 {
 	down(&register_mutex);
 	debug_printk(("device unregistered\n"));
-	if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0) < 0)
-		
-		snd_printk("error unregister device music\n");
+	if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0) < 0)		
+		snd_printk(KERN_ERR "error unregister device music\n");
 	if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0) < 0)
-		snd_printk("error unregister device seq\n");
+		snd_printk(KERN_ERR "error unregister device seq\n");
 	up(&register_mutex);
 }
 
diff --git a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c
index 374d698..0026ff2 100644
--- a/sound/core/seq/oss/seq_oss_init.c
+++ b/sound/core/seq/oss/seq_oss_init.c
@@ -184,7 +184,7 @@
 	seq_oss_devinfo_t *dp;
 
 	if ((dp = snd_kcalloc(sizeof(*dp), GFP_KERNEL)) == NULL) {
-		snd_printk("can't malloc device info\n");
+		snd_printk(KERN_ERR "can't malloc device info\n");
 		return -ENOMEM;
 	}
 
@@ -193,7 +193,7 @@
 			break;
 	}
 	if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) {
-		snd_printk("too many applications\n");
+		snd_printk(KERN_ERR "too many applications\n");
 		return -ENOMEM;
 	}
 
@@ -209,14 +209,14 @@
 	snd_seq_oss_midi_setup(dp);
 
 	if (dp->synth_opened == 0 && dp->max_mididev == 0) {
-		snd_printk("no device found\n");
+		snd_printk(KERN_ERR "no device found\n");
 		kfree(dp);
 		return -ENODEV;
 	}
 
 	/* create port */
 	if ((rc = create_port(dp)) < 0) {
-		snd_printk("can't create port\n");
+		snd_printk(KERN_ERR "can't create port\n");
 		free_devinfo(dp);
 		return rc;
 	}
@@ -259,7 +259,7 @@
 
 	/* initialize timer */
 	if ((dp->timer = snd_seq_oss_timer_new(dp)) == NULL) {
-		snd_printk("can't alloc timer\n");
+		snd_printk(KERN_ERR "can't alloc timer\n");
 		delete_seq_queue(dp);
 		delete_port(dp);
 		return -ENOMEM;
diff --git a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c
index 416f1f1..fe3bfff 100644
--- a/sound/core/seq/oss/seq_oss_midi.c
+++ b/sound/core/seq/oss/seq_oss_midi.c
@@ -173,7 +173,7 @@
 	 * allocate midi info record
 	 */
 	if ((mdev = snd_kcalloc(sizeof(*mdev), GFP_KERNEL)) == NULL) {
-		snd_printk("can't malloc midi info\n");
+		snd_printk(KERN_ERR "can't malloc midi info\n");
 		return -ENOMEM;
 	}
 
@@ -190,7 +190,7 @@
 
 	/* create MIDI coder */
 	if (snd_midi_event_new(MAX_MIDI_EVENT_BUF, &mdev->coder) < 0) {
-		snd_printk("can't malloc midi coder\n");
+		snd_printk(KERN_ERR "can't malloc midi coder\n");
 		kfree(mdev);
 		return -ENOMEM;
 	}
diff --git a/sound/core/seq/oss/seq_oss_readq.c b/sound/core/seq/oss/seq_oss_readq.c
index 6005c65..3bb907d 100644
--- a/sound/core/seq/oss/seq_oss_readq.c
+++ b/sound/core/seq/oss/seq_oss_readq.c
@@ -47,12 +47,12 @@
 	seq_oss_readq_t *q;
 
 	if ((q = snd_kcalloc(sizeof(*q), GFP_KERNEL)) == NULL) {
-		snd_printk("can't malloc read queue\n");
+		snd_printk(KERN_ERR "can't malloc read queue\n");
 		return NULL;
 	}
 
 	if ((q->q = snd_kcalloc(sizeof(evrec_t) * maxlen, GFP_KERNEL)) == NULL) {
-		snd_printk("can't malloc read queue buffer\n");
+		snd_printk(KERN_ERR "can't malloc read queue buffer\n");
 		kfree(q);
 		return NULL;
 	}
diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c
index e017f2a..26a6924 100644
--- a/sound/core/seq/oss/seq_oss_synth.c
+++ b/sound/core/seq/oss/seq_oss_synth.c
@@ -111,7 +111,7 @@
 	unsigned long flags;
 
 	if ((rec = snd_kcalloc(sizeof(*rec), GFP_KERNEL)) == NULL) {
-		snd_printk("can't malloc synth info\n");
+		snd_printk(KERN_ERR "can't malloc synth info\n");
 		return -ENOMEM;
 	}
 	rec->seq_device = -1;
@@ -136,7 +136,7 @@
 	if (i >= max_synth_devs) {
 		if (max_synth_devs >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS) {
 			spin_unlock_irqrestore(&register_lock, flags);
-			snd_printk("no more synth slot\n");
+			snd_printk(KERN_ERR "no more synth slot\n");
 			kfree(rec);
 			return -ENOMEM;
 		}
@@ -165,7 +165,7 @@
 	}
 	if (index >= max_synth_devs) {
 		spin_unlock_irqrestore(&register_lock, flags);
-		snd_printk("can't unregister synth\n");
+		snd_printk(KERN_ERR "can't unregister synth\n");
 		return -EINVAL;
 	}
 	synth_devs[index] = NULL;
diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
index 88be3ab..880398d 100644
--- a/sound/core/seq/seq_clientmgr.c
+++ b/sound/core/seq/seq_clientmgr.c
@@ -265,7 +265,7 @@
 	down(&register_mutex);
 	switch (client->type) {
 	case NO_CLIENT:
-		snd_printk("Seq: Trying to free unused client %d\n", client->number);
+		snd_printk(KERN_WARNING "Seq: Trying to free unused client %d\n", client->number);
 		break;
 	case USER_CLIENT:
 	case KERNEL_CLIENT:
@@ -274,7 +274,7 @@
 		break;
 
 	default:
-		snd_printk("Seq: Trying to free client %d with undefined type = %d\n", client->number, client->type);
+		snd_printk(KERN_ERR "Seq: Trying to free client %d with undefined type = %d\n", client->number, client->type);
 	}
 	up(&register_mutex);
 
diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c
index 793bc16..1798f2a 100644
--- a/sound/core/seq/seq_device.c
+++ b/sound/core/seq/seq_device.c
@@ -295,7 +295,7 @@
 	if (ops == NULL)
 		return -ENOMEM;
 	if (ops->driver & DRIVER_LOADED) {
-		snd_printk("driver_register: driver '%s' already exists\n", id);
+		snd_printk(KERN_WARNING "driver_register: driver '%s' already exists\n", id);
 		unlock_driver(ops);
 		return -EBUSY;
 	}
@@ -363,7 +363,7 @@
 		return -ENXIO;
 	if (! (ops->driver & DRIVER_LOADED) ||
 	    (ops->driver & DRIVER_LOCKED)) {
-		snd_printk("driver_unregister: cannot unload driver '%s': status=%x\n", id, ops->driver);
+		snd_printk(KERN_ERR "driver_unregister: cannot unload driver '%s': status=%x\n", id, ops->driver);
 		unlock_driver(ops);
 		return -EBUSY;
 	}
@@ -378,7 +378,7 @@
 
 	ops->driver = 0;
 	if (ops->num_init_devices > 0)
-		snd_printk("free_driver: init_devices > 0!! (%d)\n", ops->num_init_devices);
+		snd_printk(KERN_ERR "free_driver: init_devices > 0!! (%d)\n", ops->num_init_devices);
 	up(&ops->reg_mutex);
 
 	unlock_driver(ops);
@@ -423,15 +423,14 @@
 	if (dev->status != SNDRV_SEQ_DEVICE_FREE)
 		return 0; /* already initialized */
 	if (ops->argsize != dev->argsize) {
-		snd_printk("incompatible device '%s' for plug-in '%s'\n", dev->name, ops->id);
-printk(" %d %d\n", ops->argsize, dev->argsize);
+		snd_printk(KERN_ERR "incompatible device '%s' for plug-in '%s' (%d %d)\n", dev->name, ops->id, ops->argsize, dev->argsize);
 		return -EINVAL;
 	}
 	if (ops->ops.init_device(dev) >= 0) {
 		dev->status = SNDRV_SEQ_DEVICE_REGISTERED;
 		ops->num_init_devices++;
 	} else {
-		snd_printk("init_device failed: %s: %s\n", dev->name, dev->id);
+		snd_printk(KERN_ERR "init_device failed: %s: %s\n", dev->name, dev->id);
 	}
 
 	return 0;
@@ -449,7 +448,7 @@
 	if (dev->status != SNDRV_SEQ_DEVICE_REGISTERED)
 		return 0; /* not registered */
 	if (ops->argsize != dev->argsize) {
-		snd_printk("incompatible device '%s' for plug-in '%s'\n", dev->name, ops->id);
+		snd_printk(KERN_ERR "incompatible device '%s' for plug-in '%s' (%d %d)\n", dev->name, ops->id, ops->argsize, dev->argsize);
 		return -EINVAL;
 	}
 	if ((result = ops->ops.free_device(dev)) >= 0 || result == -ENXIO) {
@@ -457,7 +456,7 @@
 		dev->driver_data = NULL;
 		ops->num_init_devices--;
 	} else {
-		snd_printk("free_device failed: %s: %s\n", dev->name, dev->id);
+		snd_printk(KERN_ERR "free_device failed: %s: %s\n", dev->name, dev->id);
 	}
 
 	return 0;
@@ -517,7 +516,7 @@
 	remove_drivers();
 	snd_info_unregister(info_entry);
 	if (num_ops)
-		snd_printk("drivers not released (%d)\n", num_ops);
+		snd_printk(KERN_ERR "drivers not released (%d)\n", num_ops);
 }
 
 module_init(alsa_seq_device_init)
diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c
index ccd0296..fe259ff 100644
--- a/sound/core/seq/seq_dummy.c
+++ b/sound/core/seq/seq_dummy.c
@@ -206,7 +206,7 @@
 	int i;
 
 	if (ports < 1) {
-		snd_printk("invalid number of ports %d\n", ports);
+		snd_printk(KERN_ERR "invalid number of ports %d\n", ports);
 		return -EINVAL;
 	}
 
diff --git a/sound/core/seq/seq_instr.c b/sound/core/seq/seq_instr.c
index c7bb683..891aec5 100644
--- a/sound/core/seq/seq_instr.c
+++ b/sound/core/seq/seq_instr.c
@@ -132,7 +132,7 @@
 			}				
 			spin_unlock_irqrestore(&list->lock, flags);
 			if (snd_seq_instr_free(instr, 0)<0)
-				snd_printk("instrument free problem\n");
+				snd_printk(KERN_WARNING "instrument free problem\n");
 		}
 		while ((cluster = list->chash[idx]) != NULL) {
 			list->chash[idx] = cluster->next;
@@ -221,7 +221,7 @@
 				schedule_timeout(1);
 			}				
 			if (snd_seq_instr_free(instr, atomic)<0)
-				snd_printk("instrument free problem\n");
+				snd_printk(KERN_WARNING "instrument free problem\n");
 			instr = next;
 		}
 	}
@@ -324,7 +324,7 @@
 		return;
 	spin_lock_irqsave(&list->lock, flags);
 	if (instr->use <= 0) {
-		snd_printk("free_use: fatal!!! use = %i, name = '%s'\n", instr->use, instr->name);
+		snd_printk(KERN_ERR "free_use: fatal!!! use = %i, name = '%s'\n", instr->use, instr->name);
 	} else {
 		instr->use--;
 	}
diff --git a/sound/core/seq/seq_lock.c b/sound/core/seq/seq_lock.c
index d5802b7..7490bd8 100644
--- a/sound/core/seq/seq_lock.c
+++ b/sound/core/seq/seq_lock.c
@@ -68,12 +68,12 @@
 	int max_count = 5 * HZ;
 
 	if (atomic_read(lockp) < 0) {
-		printk("seq_lock: lock trouble [counter = %d] in %s:%d\n", atomic_read(lockp), file, line);
+		printk(KERN_WARNING "seq_lock: lock trouble [counter = %d] in %s:%d\n", atomic_read(lockp), file, line);
 		return;
 	}
 	while (atomic_read(lockp) > 0) {
 		if (max_count == 0) {
-			snd_printk("seq_lock: timeout [%d left] in %s:%d\n", atomic_read(lockp), file, line);
+			snd_printk(KERN_WARNING "seq_lock: timeout [%d left] in %s:%d\n", atomic_read(lockp), file, line);
 			break;
 		}
 		set_current_state(TASK_UNINTERRUPTIBLE);
diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c
index 5a6e21d..5da040e 100644
--- a/sound/core/seq/seq_memory.c
+++ b/sound/core/seq/seq_memory.c
@@ -423,7 +423,7 @@
 
 	while (atomic_read(&pool->counter) > 0) {
 		if (max_count == 0) {
-			snd_printk("snd_seq_pool_done timeout: %d cells remain\n", atomic_read(&pool->counter));
+			snd_printk(KERN_WARNING "snd_seq_pool_done timeout: %d cells remain\n", atomic_read(&pool->counter));
 			break;
 		}
 		set_current_state(TASK_UNINTERRUPTIBLE);
diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c
index 9452ae2..223385c 100644
--- a/sound/core/seq/seq_ports.c
+++ b/sound/core/seq/seq_ports.c
@@ -143,7 +143,7 @@
 	snd_assert(client, return NULL);
 
 	if (client->num_ports >= SNDRV_SEQ_MAX_PORTS - 1) {
-		snd_printk("too many ports for client %d\n", client->number);
+		snd_printk(KERN_WARNING "too many ports for client %d\n", client->number);
 		return NULL;
 	}
 
diff --git a/sound/core/seq/seq_timer.c b/sound/core/seq/seq_timer.c
index 8c712d3..f9bae3a 100644
--- a/sound/core/seq/seq_timer.c
+++ b/sound/core/seq/seq_timer.c
@@ -285,7 +285,7 @@
 				t = snd_timer_open(str, &tid, q->queue);
 			}
 			if (t == NULL) {
-				snd_printk("fatal error: cannot create timer\n");
+				snd_printk(KERN_ERR "fatal error: cannot create timer\n");
 				return -ENODEV;
 			}
 		}
diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c
index 55b0068..df7d693 100644
--- a/sound/core/seq/seq_virmidi.c
+++ b/sound/core/seq/seq_virmidi.c
@@ -431,7 +431,7 @@
 		/* should check presence of port more strictly.. */
 		break;
 	default:
-		snd_printk("seq_mode is not set: %d\n", rdev->seq_mode);
+		snd_printk(KERN_ERR "seq_mode is not set: %d\n", rdev->seq_mode);
 		return -EINVAL;
 	}
 	return 0;
diff --git a/sound/core/sound.c b/sound/core/sound.c
index 583266f..ea2c3af 100644
--- a/sound/core/sound.c
+++ b/sound/core/sound.c
@@ -319,7 +319,7 @@
 #else
 	if (register_chrdev(snd_major, "alsa", &snd_fops)) {
 #endif
-		snd_printk("unable to register native major device number %d\n", snd_major);
+		snd_printk(KERN_ERR "unable to register native major device number %d\n", snd_major);
 #ifdef CONFIG_SND_OSSEMUL
 		snd_oss_cleanup_module();
 #endif
@@ -349,7 +349,7 @@
 	}
 #endif
 #ifndef MODULE
-	printk("Advanced Linux Sound Architecture Driver Version " CONFIG_SND_VERSION CONFIG_SND_DATE ".\n");
+	printk(KERN_INFO "Advanced Linux Sound Architecture Driver Version " CONFIG_SND_VERSION CONFIG_SND_DATE ".\n");
 #endif
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) && defined(CONFIG_APM)
 	pm_init();
@@ -391,7 +391,7 @@
 #else
 	if (unregister_chrdev(snd_major, "alsa") != 0)
 #endif
-		snd_printk("unable to unregister major device number %d\n", snd_major);
+		snd_printk(KERN_ERR "unable to unregister major device number %d\n", snd_major);
 #ifdef CONFIG_DEVFS_FS
 	devfs_unregister(devfs_handle);
 #endif
@@ -455,7 +455,7 @@
 EXPORT_SYMBOL(snd_device_register);
 EXPORT_SYMBOL(snd_device_free);
 EXPORT_SYMBOL(snd_device_free_all);
-  /* misc.c */
+  /* isadma.c */
 #ifdef CONFIG_ISA
 EXPORT_SYMBOL(snd_dma_program);
 EXPORT_SYMBOL(snd_dma_disable);
@@ -494,38 +494,10 @@
 EXPORT_SYMBOL(snd_ctl_unregister_ioctl);
   /* misc.c */
 EXPORT_SYMBOL(snd_task_name);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-EXPORT_SYMBOL(try_inc_mod_count);
-EXPORT_SYMBOL(snd_compat_mem_region);
-EXPORT_SYMBOL(snd_compat_request_region);
-EXPORT_SYMBOL(snd_compat_release_resource);
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) && defined(CONFIG_PCI)
-EXPORT_SYMBOL(snd_pci_compat_match_device);
-EXPORT_SYMBOL(snd_pci_compat_register_driver);
-EXPORT_SYMBOL(snd_pci_compat_unregister_driver);
-EXPORT_SYMBOL(snd_pci_compat_get_size);
-EXPORT_SYMBOL(snd_pci_compat_get_flags);
-EXPORT_SYMBOL(snd_pci_compat_set_power_state);
-EXPORT_SYMBOL(snd_pci_compat_enable_device);
-EXPORT_SYMBOL(snd_pci_compat_find_capability);
-EXPORT_SYMBOL(snd_pci_compat_alloc_consistent);
-EXPORT_SYMBOL(snd_pci_compat_free_consistent);
-EXPORT_SYMBOL(snd_pci_compat_dma_supported);
-EXPORT_SYMBOL(snd_pci_compat_get_dma_mask);
-EXPORT_SYMBOL(snd_pci_compat_set_dma_mask);
-EXPORT_SYMBOL(snd_pci_compat_get_driver_data);
-EXPORT_SYMBOL(snd_pci_compat_set_driver_data);
-#endif
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) && defined(CONFIG_PM)
-EXPORT_SYMBOL(pm_register);
-EXPORT_SYMBOL(pm_unregister);
-EXPORT_SYMBOL(pm_send);
+#ifdef CONFIG_SND_VERBOSE_PRINTK
+EXPORT_SYMBOL(snd_verbose_printk);
 #endif
   /* wrappers */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
-EXPORT_SYMBOL(snd_wrapper_kill_fasync);
-#endif
 #ifdef CONFIG_SND_DEBUG_MEMORY
 EXPORT_SYMBOL(snd_wrapper_kmalloc);
 EXPORT_SYMBOL(snd_wrapper_kfree);
diff --git a/sound/core/timer.c b/sound/core/timer.c
index 0c63397..61ae676 100644
--- a/sound/core/timer.c
+++ b/sound/core/timer.c
@@ -681,7 +681,7 @@
 	snd_assert(timer != NULL, return -ENXIO);
 	down(&register_mutex);
 	if (! list_empty(&timer->open_list_head)) {
-		snd_printk("timer 0x%lx is busy?\n", (long)timer);
+		snd_printk(KERN_WARNING "timer 0x%lx is busy?\n", (long)timer);
 		list_for_each_safe(p, n, &timer->open_list_head) {
 			list_del_init(p);
 			ti = (snd_timer_instance_t *)list_entry(p, snd_timer_instance_t, open_list);
@@ -1318,10 +1318,10 @@
 	}
 	snd_timer_proc_entry = entry;
 	if ((err = snd_timer_register_system()) < 0)
-		snd_printk("unable to register system timer (%i)\n", err);
+		snd_printk(KERN_ERR "unable to register system timer (%i)\n", err);
 	if ((err = snd_register_device(SNDRV_DEVICE_TYPE_TIMER,
 					NULL, 0, &snd_timer_reg, "timer"))<0)
-		snd_printk("unable to register timer device (%i)\n", err);
+		snd_printk(KERN_ERR "unable to register timer device (%i)\n", err);
 	return 0;
 }
 
diff --git a/sound/drivers/dummy.c b/sound/drivers/dummy.c
index 6a6d8fe..1fb03cf 100644
--- a/sound/drivers/dummy.c
+++ b/sound/drivers/dummy.c
@@ -562,7 +562,7 @@
 	for (dev = cards = 0; dev < SNDRV_CARDS && snd_enable[dev]; dev++) {
 		if (snd_card_dummy_probe(dev) < 0) {
 #ifdef MODULE
-			snd_printk("Dummy soundcard #%i not found or device busy\n", dev + 1);
+			printk(KERN_ERR "Dummy soundcard #%i not found or device busy\n", dev + 1);
 #endif
 			break;
 		}
@@ -570,7 +570,7 @@
 	}
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("Dummy soundcard not found or device busy\n");
+		printk(KERN_ERR "Dummy soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/drivers/mpu401/mpu401.c b/sound/drivers/mpu401/mpu401.c
index 37deb36..96de16f 100644
--- a/sound/drivers/mpu401/mpu401.c
+++ b/sound/drivers/mpu401/mpu401.c
@@ -81,7 +81,7 @@
 	if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
 				snd_port[dev], 0,
 				snd_irq[dev], snd_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0) {
-		snd_printk("MPU401 not detected at 0x%lx\n", snd_port[dev]);
+		printk(KERN_ERR "MPU401 not detected at 0x%lx\n", snd_port[dev]);
 		snd_card_free(card);
 		return -ENODEV;
 	}
@@ -113,7 +113,7 @@
 	}
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("MPU-401 device not found or device busy\n");
+		printk(KERN_ERR "MPU-401 device not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c
index 48ceaf1..64913d5 100644
--- a/sound/drivers/mtpav.c
+++ b/sound/drivers/mtpav.c
@@ -761,7 +761,7 @@
 
 	snd_mtpav_portscan(mtp_card);
 
-	snd_printk("Motu MidiTimePiece on parallel port irq: %d ioport: 0x%lx\n", snd_irq, snd_port);
+	printk(KERN_INFO "Motu MidiTimePiece on parallel port irq: %d ioport: 0x%lx\n", snd_irq, snd_port);
 
 	return 0;
 
diff --git a/sound/drivers/serial-u16550.c b/sound/drivers/serial-u16550.c
index 4801f7b..5166811 100644
--- a/sound/drivers/serial-u16550.c
+++ b/sound/drivers/serial-u16550.c
@@ -891,7 +891,7 @@
 
 	if ((err = snd_uart16550_detect(snd_port[dev])) <= 0) {
 		snd_card_free(card);
-		snd_printk("no UART detected at 0x%lx\n", (long)snd_port[dev]);
+		printk(KERN_ERR "no UART detected at 0x%lx\n", (long)snd_port[dev]);
 		return err;
 	}
 
@@ -940,7 +940,7 @@
 
 	if (cards == 0) {
 #ifdef MODULE
-		snd_printk("serial midi soundcard not found or device busy\n");
+		printk(KERN_ERR "serial midi soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/drivers/virmidi.c b/sound/drivers/virmidi.c
index 06d1f71..fa1fc68 100644
--- a/sound/drivers/virmidi.c
+++ b/sound/drivers/virmidi.c
@@ -136,7 +136,7 @@
 	for (dev = cards = 0; dev < SNDRV_CARDS && snd_enable[dev]; dev++) {
 		if (snd_card_virmidi_probe(dev) < 0) {
 #ifdef MODULE
-			snd_printk("Card-VirMIDI #%i not found or device busy\n", dev + 1);
+			printk(KERN_ERR "Card-VirMIDI #%i not found or device busy\n", dev + 1);
 #endif
 			break;
 		}
@@ -144,7 +144,7 @@
 	}
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("Card-VirMIDI soundcard not found or device busy\n");
+		printk(KERN_ERR "Card-VirMIDI soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/Config.in b/sound/isa/Config.in
index 9fc46d6..fc7bbc2 100644
--- a/sound/isa/Config.in
+++ b/sound/isa/Config.in
@@ -3,13 +3,13 @@
 mainmenu_option next_comment
 comment 'ISA devices'
 
-dep_tristate 'Analog Devices SoundPort AD1816A' CONFIG_SND_AD1816A $CONFIG_SND
+dep_tristate 'Analog Devices SoundPort AD1816A' CONFIG_SND_AD1816A $CONFIG_SND $CONFIG_ISAPNP
 dep_tristate 'Generic AD1848/CS4248 driver' CONFIG_SND_AD1848 $CONFIG_SND
 dep_tristate 'Generic Cirrus Logic CS4231 driver' CONFIG_SND_CS4231 $CONFIG_SND
 dep_tristate 'Generic Cirrus Logic CS4232 driver' CONFIG_SND_CS4232 $CONFIG_SND
 dep_tristate 'Generic Cirrus Logic CS4236+ driver' CONFIG_SND_CS4236 $CONFIG_SND
-dep_tristate 'Generic ESS ES968 driver' CONFIG_SND_ES968 $CONFIG_SND
-dep_tristate 'Generic ESS ES1688 driver' CONFIG_SND_ES1688 $CONFIG_SND
+dep_tristate 'Generic ESS ES968 driver' CONFIG_SND_ES968 $CONFIG_SND $CONFIG_ISAPNP
+dep_tristate 'Generic ESS ES688/ES1688 driver' CONFIG_SND_ES1688 $CONFIG_SND
 dep_tristate 'Generic ESS ES18xx driver' CONFIG_SND_ES18XX $CONFIG_SND
 dep_tristate 'Gravis UltraSound Classic' CONFIG_SND_GUSCLASSIC $CONFIG_SND
 dep_tristate 'Gravis UltraSound Extreme' CONFIG_SND_GUSEXTREME $CONFIG_SND
@@ -26,10 +26,10 @@
   bool '  Sound Blaster 16/AWE CSP support' CONFIG_SND_SB16_CSP
 fi
 dep_tristate 'Turtle Beach Maui,Tropez,Tropez+ (Wavefront)' CONFIG_SND_WAVEFRONT $CONFIG_SND
-dep_tristate 'Avance Logic ALS100/ALS120' CONFIG_SND_ALS100 $CONFIG_SND
-dep_tristate 'Aztech Systems AZT2320' CONFIG_SND_AZT2320 $CONFIG_SND
+dep_tristate 'Avance Logic ALS100/ALS120' CONFIG_SND_ALS100 $CONFIG_SND $CONFIG_ISAPNP
+dep_tristate 'Aztech Systems AZT2320' CONFIG_SND_AZT2320 $CONFIG_SND $CONFIG_ISAPNP
 dep_tristate 'C-Media CMI8330' CONFIG_SND_CMI8330 $CONFIG_SND
-dep_tristate 'Diamond Technologies DT-0197H' CONFIG_SND_DT0197H $CONFIG_SND
+dep_tristate 'Diamond Technologies DT-0197H' CONFIG_SND_DT0197H $CONFIG_SND $CONFIG_ISAPNP
 dep_tristate 'Yamaha OPL3-SA2/SA3' CONFIG_SND_OPL3SA2 $CONFIG_SND
 dep_tristate 'Aztech Sound Galaxy' CONFIG_SND_SGALAXY $CONFIG_SND
 
diff --git a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c
index d3fb937..29a62ca 100644
--- a/sound/isa/ad1816a/ad1816a.c
+++ b/sound/isa/ad1816a/ad1816a.c
@@ -36,6 +36,8 @@
 
 #define chip_t ad1816a_t
 
+#define PFX "ad1816a: "
+
 EXPORT_NO_SYMBOLS;
 MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
 MODULE_DESCRIPTION("AD1816A, AD1815");
@@ -176,7 +178,7 @@
 		isapnp_resource_change(&pdev->irq_resource[0], snd_irq[dev], 1);
 
 	if (pdev->activate(pdev) < 0) {
-		snd_printk("AUDIO isapnp configure failure\n");
+		printk(KERN_ERR PFX "AUDIO isapnp configure failure\n");
 		return -EBUSY;
 	}
 
@@ -202,7 +204,7 @@
 
 	if (pdev->activate(pdev) < 0) {
 		/* not fatal error */
-		snd_printk("MPU-401 isapnp configure failure\n");
+		printk(KERN_ERR PFX "MPU-401 isapnp configure failure\n");
 		snd_mpu_port[dev] = -1;
 		acard->devmpu = NULL;
 	} else {
@@ -257,7 +259,7 @@
 		return error;
 	}
 #else
-	snd_printk("you have to enable ISA PnP support.\n");
+	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
 	return -ENOSYS;
 #endif	/* __ISAPNP__ */
 
@@ -284,14 +286,14 @@
 		if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
 					snd_mpu_port[dev], 0, snd_mpu_irq[dev], SA_INTERRUPT,
 					NULL) < 0)
-			snd_printk("no MPU-401 device at 0x%lx.\n", snd_mpu_port[dev]);
+			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx.\n", snd_mpu_port[dev]);
 	}
 
 	if (snd_fm_port[dev] > 0) {
 		if (snd_opl3_create(card,
 				    snd_fm_port[dev], snd_fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			snd_printk("no OPL device at 0x%lx-0x%lx.\n", snd_fm_port[dev], snd_fm_port[dev] + 2);
+			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx.\n", snd_fm_port[dev], snd_fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 1, 2)) < 0) {
 				snd_card_free(card);
@@ -346,11 +348,11 @@
 #ifdef __ISAPNP__
 	cards += isapnp_probe_cards(snd_ad1816a_pnpids, snd_ad1816a_isapnp_detect);
 #else
-	snd_printk("you have to enable ISA PnP support.\n");
+	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
 #endif
 #ifdef MODULE
 	if (!cards)
-		snd_printk("no AD1816A based soundcards found.\n");
+		printk(KERN_ERR "no AD1816A based soundcards found.\n");
 #endif	/* MODULE */
 	return cards ? 0 : -ENODEV;
 }
diff --git a/sound/isa/ad1848/ad1848.c b/sound/isa/ad1848/ad1848.c
index 6ec594a..730338f 100644
--- a/sound/isa/ad1848/ad1848.c
+++ b/sound/isa/ad1848/ad1848.c
@@ -135,7 +135,7 @@
 
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("AD1848 soundcard not found or device busy\n");
+		printk(KERN_ERR "AD1848 soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/als100.c b/sound/isa/als100.c
index 920209f..72e5288 100644
--- a/sound/isa/als100.c
+++ b/sound/isa/als100.c
@@ -39,6 +39,8 @@
 
 #define chip_t sb_t
 
+#define PFX "als100: "
+
 EXPORT_NO_SYMBOLS;
 
 MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
@@ -178,7 +180,7 @@
 		isapnp_resource_change(&pdev->irq_resource[0], snd_irq[dev], 1);
 
 	if (pdev->activate(pdev)<0) {
-		snd_printk("AUDIO isapnp configure failure\n");
+		printk(KERN_ERR PFX "AUDIO isapnp configure failure\n");
 		return -EBUSY;
 	}
 
@@ -201,7 +203,7 @@
 			1);
 
 	if (pdev->activate(pdev)<0) {
-		snd_printk("MPU-401 isapnp configure failure\n");
+		printk(KERN_ERR PFX "MPU-401 isapnp configure failure\n");
 		snd_mpu_port[dev] = -1;
 		acard->devmpu = NULL;
 	} else {
@@ -219,7 +221,7 @@
 		isapnp_resource_change(&pdev->resource[0], snd_fm_port[dev], 4);
 
 	if (pdev->activate(pdev)<0) {
-		snd_printk("OPL isapnp configure failure\n");
+		printk(KERN_ERR PFX "OPL isapnp configure failure\n");
 		snd_fm_port[dev] = -1;
 		acard->devopl = NULL;
 	} else {
@@ -277,7 +279,7 @@
 		return error;
 	}
 #else
-	snd_printk("you have to enable PnP support ...\n");
+	printk(KERN_ERR PFX "you have to enable PnP support ...\n");
 	snd_card_free(card);
 	return -ENOSYS;
 #endif	/* __ISAPNP__ */
@@ -307,14 +309,14 @@
 					snd_mpu_port[dev], 0, 
 					snd_mpu_irq[dev], SA_INTERRUPT,
 					NULL) < 0)
-			snd_printk("no MPU-401 device at 0x%lx\n", snd_mpu_port[dev]);
+			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", snd_mpu_port[dev]);
 	}
 
 	if (snd_fm_port[dev] > 0) {
 		if (snd_opl3_create(card,
 				    snd_fm_port[dev], snd_fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			snd_printk("no OPL device at 0x%lx-0x%lx\n",
+			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
 				snd_fm_port[dev], snd_fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
@@ -370,11 +372,11 @@
 #ifdef __ISAPNP__
 	cards += isapnp_probe_cards(snd_als100_pnpids, snd_als100_isapnp_detect);
 #else
-	snd_printk("you have to enable ISA PnP support.\n");
+	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
 #endif
 #ifdef MODULE
 	if (!cards)
-		snd_printk("no ALS100 based soundcards found\n");
+		printk(KERN_ERR "no ALS100 based soundcards found\n");
 #endif
 	return cards ? 0 : -ENODEV;
 }
diff --git a/sound/isa/azt2320.c b/sound/isa/azt2320.c
index 98c2d41..fa55a9f 100644
--- a/sound/isa/azt2320.c
+++ b/sound/isa/azt2320.c
@@ -50,6 +50,8 @@
 
 #define chip_t cs4231_t
 
+#define PFX "azt2320: "
+
 EXPORT_NO_SYMBOLS;
 
 MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
@@ -191,7 +193,7 @@
 		isapnp_resource_change(&pdev->irq_resource[0], snd_irq[dev], 1);
 
 	if (pdev->activate(pdev) < 0) {
-		snd_printk("AUDIO isapnp configure failure\n");
+		printk(KERN_ERR PFX "AUDIO isapnp configure failure\n");
 		return -EBUSY;
 	}
 
@@ -217,7 +219,7 @@
 
 	if (pdev->activate(pdev) < 0) {
 		/* not fatal error */
-		snd_printk("MPU-401 isapnp configure failure\n");
+		printk(KERN_ERR PFX "MPU-401 isapnp configure failure\n");
 		snd_mpu_port[dev] = -1;
 		acard->devmpu = NULL;
 	} else {
@@ -329,7 +331,7 @@
 				snd_mpu_port[dev], 0,
 				snd_mpu_irq[dev], SA_INTERRUPT,
 				NULL) < 0)
-			snd_printk("no MPU-401 device at 0x%lx\n",
+			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n",
 				snd_mpu_port[dev]);
 	}
 
@@ -337,7 +339,7 @@
 		if (snd_opl3_create(card,
 				    snd_fm_port[dev], snd_fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			snd_printk("no OPL device at 0x%lx-0x%lx\n",
+			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
 				snd_fm_port[dev], snd_fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 1, 2)) < 0) {
@@ -393,11 +395,11 @@
 #ifdef __ISAPNP__
 	cards += isapnp_probe_cards(snd_azt2320_pnpids, snd_azt2320_isapnp_detect);
 #else
-	snd_printk("you have to enable ISA PnP support.\n");
+	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
 #endif
 #ifdef MODULE
 	if (!cards)
-		snd_printk("no AZT2320 based soundcards found\n");
+		printk(KERN_ERR "no AZT2320 based soundcards found\n");
 #endif
 	return cards ? 0 : -ENODEV;
 }
diff --git a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
index c9ed3cb..d49c82e 100644
--- a/sound/isa/cmi8330.c
+++ b/sound/isa/cmi8330.c
@@ -488,7 +488,7 @@
 
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("CMI8330 not found or device busy\n");
+		printk(KERN_ERR "CMI8330 not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/cs423x/cs4231.c b/sound/isa/cs423x/cs4231.c
index 75ec75c..30bbc2e 100644
--- a/sound/isa/cs423x/cs4231.c
+++ b/sound/isa/cs423x/cs4231.c
@@ -135,7 +135,7 @@
 					snd_mpu_port[dev], 0,
 					snd_mpu_irq[dev], SA_INTERRUPT,
 					NULL) < 0)
-			snd_printk("MPU401 not detected\n");
+			printk(KERN_ERR "cs4231: MPU401 not detected\n");
 	}
 	strcpy(card->driver, "CS4231");
 	strcpy(card->shortname, pcm->name);
@@ -161,7 +161,7 @@
 	}
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("CS4231 soundcard not found or device busy\n");
+		printk(KERN_ERR "CS4231 soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/cs423x/cs4231_lib.c b/sound/isa/cs423x/cs4231_lib.c
index 659a549..23236e5 100644
--- a/sound/isa/cs423x/cs4231_lib.c
+++ b/sound/isa/cs423x/cs4231_lib.c
@@ -1335,7 +1335,7 @@
 	}
 	if (chip->res_cport) {
 		release_resource(chip->res_cport);
-		kfree_nocheck(chip->res_port);
+		kfree_nocheck(chip->res_cport);
 	}
 	if (chip->irq >= 0) {
 		disable_irq(chip->irq);
diff --git a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
index 5f3f80b..3e155d8 100644
--- a/sound/isa/cs423x/cs4236.c
+++ b/sound/isa/cs423x/cs4236.c
@@ -309,7 +309,7 @@
 	if (snd_dma2[dev] != SNDRV_AUTO_DMA)
 		isapnp_resource_change(&pdev->dma_resource[1], snd_dma2[dev] < 0 ? 4 : snd_dma2[dev], 1);
 	if (pdev->activate(pdev)<0) {
-		snd_printk(IDENT " isapnp configure failed for WSS (out of resources?)\n");
+		printk(KERN_ERR IDENT " isapnp configure failed for WSS (out of resources?)\n");
 		return -EBUSY;
 	}
 	snd_port[dev] = pdev->resource[0].start;
@@ -331,7 +331,7 @@
 	if (snd_cport[dev] != SNDRV_AUTO_PORT)
 		isapnp_resource_change(&pdev->resource[0], snd_cport[dev], 8);
 	if (pdev->activate(pdev)<0) {
-		snd_printk(IDENT " isapnp configure failed for control (out of resources?)\n");
+		printk(KERN_ERR IDENT " isapnp configure failed for control (out of resources?)\n");
 		acard->wss->deactivate(acard->wss);
 		return -EBUSY;
 	}
@@ -352,7 +352,7 @@
 		if (pdev->activate(pdev)<0) {
 			snd_mpu_port[dev] = SNDRV_AUTO_PORT;
 			snd_mpu_irq[dev] = SNDRV_AUTO_IRQ;
-			snd_printk(IDENT " isapnp configure failed for MPU (out of resources?)\n");
+			printk(KERN_ERR IDENT " isapnp configure failed for MPU (out of resources?)\n");
 		} else {
 			snd_mpu_port[dev] = pdev->resource[0].start;
 			if (pdev->irq_resource[0].flags & IORESOURCE_IRQ) {
@@ -429,7 +429,7 @@
 	card->private_free = snd_card_cs4236_free;
 #ifdef __ISAPNP__
 	if (snd_isapnp[dev] && (err = snd_card_cs4236_isapnp(dev, acard))<0) {
-		snd_printk("isapnp detection failed and probing for " IDENT " is not supported\n");
+		printk(KERN_ERR "isapnp detection failed and probing for " IDENT " is not supported\n");
 		snd_card_free(card);
 		return -ENXIO;
 	}
@@ -442,7 +442,7 @@
 		snd_sb_port[dev] = SNDRV_AUTO_PORT;
 	if (snd_sb_port[dev] != SNDRV_AUTO_PORT)
 		if ((acard->res_sb_port = request_region(snd_sb_port[dev], 16, IDENT " SB")) == NULL) {
-			snd_printk("unable to register SB port at 0x%lx\n", snd_sb_port[dev]);
+			printk(KERN_ERR IDENT ": unable to register SB port at 0x%lx\n", snd_sb_port[dev]);
 			snd_card_free(card);
 			return -ENOMEM;
 		}
@@ -501,7 +501,7 @@
 		if (snd_opl3_create(card,
 				    snd_fm_port[dev], snd_fm_port[dev] + 2,
 				    OPL3_HW_OPL3_CS, 0, &opl3) < 0) {
-			snd_printk(IDENT ": OPL3 not detected\n");
+			printk(KERN_ERR IDENT ": OPL3 not detected\n");
 		} else {
 			if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
 				snd_card_free(card);
@@ -515,7 +515,7 @@
 					snd_mpu_port[dev], 0,
 					snd_mpu_irq[dev],
 					snd_mpu_irq[dev] >= 0 ? SA_INTERRUPT : 0, NULL) < 0)
-			snd_printk(IDENT ": MPU401 not detected\n");
+			printk(KERN_ERR IDENT ": MPU401 not detected\n");
 	}
 	strcpy(card->driver, pcm->name);
 	strcpy(card->shortname, pcm->name);
@@ -575,7 +575,7 @@
 #endif
 	if (!cards) {
 #ifdef MODULE
-		snd_printk(IDENT " soundcard not found or device busy\n");
+		printk(KERN_ERR IDENT " soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/dt0197h.c b/sound/isa/dt0197h.c
index 93d23d0..e3c3076 100644
--- a/sound/isa/dt0197h.c
+++ b/sound/isa/dt0197h.c
@@ -36,6 +36,8 @@
 
 #define chip_t sb_t
 
+#define PFX "dt0197h: "
+
 EXPORT_NO_SYMBOLS;
 
 MODULE_AUTHOR("Massimo Piccioni <dafastidio@libero.it>");
@@ -150,7 +152,7 @@
 		isapnp_resource_change(&pdev->irq_resource[0], snd_irq[dev], 1);
 
 	if (pdev->activate(pdev)<0) {
-		snd_printk("AUDIO isapnp configure failure\n");
+		printk(KERN_ERR PFX "AUDIO isapnp configure failure\n");
 		return -EBUSY;
 	}
 
@@ -170,7 +172,7 @@
 			1);
 
 	if (pdev->activate(pdev)<0) {
-		snd_printk("MPU-401 isapnp configure failure\n");
+		printk(KERN_ERR PFX "MPU-401 isapnp configure failure\n");
 		snd_mpu_port[dev] = -1;
 		acard->devmpu = NULL;
 	} else {
@@ -186,7 +188,7 @@
 		isapnp_resource_change(&pdev->resource[0], snd_fm_port[dev], 4);
 
 	if (pdev->activate(pdev)<0) {
-		snd_printk("OPL isapnp configure failure\n");
+		printk(KERN_ERR PFX "OPL isapnp configure failure\n");
 		snd_fm_port[dev] = -1;
 		acard->devopl = NULL;
 	} else {
@@ -244,7 +246,7 @@
 		return error;
 	}
 #else
-	snd_printk("you have to enable PnP support ...\n");
+	printk(KERN_ERR PFX "you have to enable PnP support ...\n");
 	snd_card_free(card);
 	return -ENOSYS;
 #endif	/* __ISAPNP__ */
@@ -276,7 +278,7 @@
 					snd_mpu_irq[dev],
 					SA_INTERRUPT,
 					NULL) < 0)
-			snd_printk("no MPU-401 device at 0x%lx ?\n",
+			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx ?\n",
 				snd_mpu_port[dev]);
 	}
 
@@ -285,7 +287,7 @@
 				    snd_fm_port[dev],
 				    snd_fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			snd_printk("no OPL device at 0x%lx-0x%lx ?\n",
+			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx ?\n",
 				snd_fm_port[dev], snd_fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
@@ -341,11 +343,11 @@
 #ifdef __ISAPNP__
 	cards += isapnp_probe_cards(snd_dt0197h_pnpids, snd_dt0197h_isapnp_detect);
 #else
-	snd_printk("you have to enable ISA PnP support.\n");
+	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
 #endif
 #ifdef MODULE
 	if (!cards)
-		snd_printk("no DT-0197H based soundcards found\n");
+		printk(KERN_ERR "no DT-0197H based soundcards found\n");
 #endif
 	return cards ? 0 : -ENODEV;
 }
diff --git a/sound/isa/es1688/es1688.c b/sound/isa/es1688/es1688.c
index 40b2aa3..8f2d23e 100644
--- a/sound/isa/es1688/es1688.c
+++ b/sound/isa/es1688/es1688.c
@@ -133,7 +133,7 @@
 	}
 
 	if ((snd_opl3_create(card, chip->port, chip->port + 2, OPL3_HW_OPL3, 0, &opl3)) < 0) {
-		snd_printk("opl3 not detected at 0x%lx\n", chip->port);
+		printk(KERN_ERR "es1688: opl3 not detected at 0x%lx\n", chip->port);
 	} else {
 		if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
 			snd_card_free(card);
@@ -194,7 +194,7 @@
 	cards += snd_legacy_auto_probe(possible_ports, snd_audiodrive_legacy_auto_probe);
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("ESS AudioDrive ES1688 soundcard not found or device busy\n");
+		printk(KERN_ERR "ESS AudioDrive ES1688 soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c
index 61f4aba..f547355 100644
--- a/sound/isa/es18xx.c
+++ b/sound/isa/es18xx.c
@@ -86,6 +86,8 @@
 #define SNDRV_GET_ID
 #include <sound/initval.h>
 
+#define PFX "es18xx: "
+
 struct _snd_es18xx {
 	unsigned long port;		/* port of ESS chip */
 	unsigned long mpu_port;		/* MPU-401 port of ESS chip */
@@ -1510,7 +1512,7 @@
 static int __init snd_es18xx_probe(es18xx_t *chip)
 {
 	if (snd_es18xx_identify(chip) < 0) {
-                snd_printk("[0x%lx] ESS chip not found\n", chip->port);
+		printk(KERN_ERR PFX "[0x%lx] ESS chip not found\n", chip->port);
                 return -ENODEV;
 	}
 
@@ -1752,27 +1754,27 @@
 
 	if ((chip->res_port = request_region(port, 16, "ES18xx")) == NULL) {
 		snd_es18xx_free(chip);
-		snd_printk("unable to grap ports 0x%lx-0x%lx\n", port, port + 16 - 1);
+		printk(KERN_ERR PFX "unable to grap ports 0x%lx-0x%lx\n", port, port + 16 - 1);
 		return -EBUSY;
 	}
 
 	if (request_irq(irq, snd_es18xx_interrupt, SA_INTERRUPT, "ES18xx", (void *) chip)) {
 		snd_es18xx_free(chip);
-		snd_printk("unable to grap IRQ %d\n", irq);
+		printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq);
 		return -EBUSY;
 	}
 	chip->irq = irq;
 
 	if (request_dma(dma1, "ES18xx DMA 1")) {
 		snd_es18xx_free(chip);
-		snd_printk("unable to grap DMA1 %d\n", dma1);
+		printk(KERN_ERR PFX "unable to grap DMA1 %d\n", dma1);
 		return -EBUSY;
 	}
 	chip->dma1 = dma1;
 
 	if (request_dma(dma2, "ES18xx DMA 2")) {
 		snd_es18xx_free(chip);
-		snd_printk("unable to grap DMA2 %d\n", dma2);
+		printk(KERN_ERR PFX "unable to grap DMA2 %d\n", dma2);
 		return -EBUSY;
 	}
 	chip->dma2 = dma2;
@@ -2008,7 +2010,7 @@
 	if (acard->devc->prepare(acard->devc)<0)
 		return -EAGAIN;
 	if (acard->devc->activate(acard->devc)<0) {
-		snd_printk("isapnp control configure failure (out of resources?)\n");
+		printk(KERN_ERR PFX "isapnp control configure failure (out of resources?)\n");
 		return -EAGAIN;
 	}
 	snd_printdd("isapnp: port=0x%lx\n", acard->devc->resource[0].start);
@@ -2031,7 +2033,7 @@
 	if (snd_irq[dev] != SNDRV_AUTO_IRQ)
 		isapnp_resource_change(&pdev->irq_resource[0], snd_irq[dev], 1);
 	if (pdev->activate(pdev)<0) {
-		snd_printk("isapnp configure failure (out of resources?)\n");
+		printk(KERN_ERR PFX "isapnp configure failure (out of resources?)\n");
 		acard->devc->deactivate(acard->devc);
 		return -EBUSY;
 	}
@@ -2147,7 +2149,7 @@
 	}
 
 	if (snd_opl3_create(card, chip->fm_port, chip->fm_port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) {
-		snd_printk("opl3 not detected at 0x%lx\n", chip->port);
+		printk(KERN_ERR PFX "opl3 not detected at 0x%lx\n", chip->port);
 	} else {
 		if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
 			snd_card_free(card);
@@ -2259,7 +2261,7 @@
 #endif
 	if(!cards) {
 #ifdef MODULE
-		snd_printk("ESS AudioDrive ES18xx soundcard not found or device busy\n");
+		printk(KERN_ERR "ESS AudioDrive ES18xx soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/gus/gusclassic.c b/sound/isa/gus/gusclassic.c
index 701a321..2c161f9 100644
--- a/sound/isa/gus/gusclassic.c
+++ b/sound/isa/gus/gusclassic.c
@@ -251,7 +251,7 @@
 	cards += snd_legacy_auto_probe(possible_ports, snd_gusclassic_legacy_auto_probe);
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("GUS Classic soundcard not found or device busy\n");
+		printk(KERN_ERR "GUS Classic soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/gus/gusextreme.c b/sound/isa/gus/gusextreme.c
index 37ea104..3d6593e8 100644
--- a/sound/isa/gus/gusextreme.c
+++ b/sound/isa/gus/gusextreme.c
@@ -316,7 +316,7 @@
 
 	if (snd_opl3_create(card, es1688->port, es1688->port + 2,
 			    OPL3_HW_OPL3, 0, &opl3) < 0) {
-		snd_printk("opl3 not detected at 0x%lx\n", es1688->port);
+		printk(KERN_ERR "gusextreme: opl3 not detected at 0x%lx\n", es1688->port);
 	} else {
 		if ((err = snd_opl3_hwdep_new(opl3, 0, 2, NULL)) < 0) {
 			snd_card_free(card);
@@ -376,7 +376,7 @@
 	cards += snd_legacy_auto_probe(possible_ports, snd_gusextreme_legacy_auto_probe);
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("GUS Extreme soundcard not found or device busy\n");
+		printk(KERN_ERR "GUS Extreme soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/gus/gusmax.c b/sound/isa/gus/gusmax.c
index 1553e12..eadc412 100644
--- a/sound/isa/gus/gusmax.c
+++ b/sound/isa/gus/gusmax.c
@@ -292,13 +292,13 @@
 	}
 	if (!gus->max_flag) {
 		snd_card_free(card);
-		snd_printk("GUS MAX soundcard was not detected at 0x%lx\n", gus->gf1.port);
+		printk(KERN_ERR "GUS MAX soundcard was not detected at 0x%lx\n", gus->gf1.port);
 		return -ENODEV;
 	}
 
 	if (request_irq(irq, snd_gusmax_interrupt, SA_INTERRUPT, "GUS MAX", (void *)maxcard)) {
 		snd_card_free(card);
-		snd_printk("unable to grab IRQ %d\n", irq);
+		printk(KERN_ERR "gusmax: unable to grab IRQ %d\n", irq);
 		return -EBUSY;
 	}
 	maxcard->irq = irq;
@@ -387,7 +387,7 @@
 	cards += snd_legacy_auto_probe(possible_ports, snd_gusmax_legacy_auto_probe);
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("GUS MAX soundcard not found or device busy\n");
+		printk(KERN_ERR "GUS MAX soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c
index 68d54e1e..a28db1c 100644
--- a/sound/isa/gus/interwave.c
+++ b/sound/isa/gus/interwave.c
@@ -948,7 +948,7 @@
 			continue;
 		}
 #ifdef MODULE
-		snd_printk("InterWave soundcard #%i not found at 0x%lx or device busy\n", dev, snd_port[dev]);
+		printk(KERN_ERR "InterWave soundcard #%i not found at 0x%lx or device busy\n", dev, snd_port[dev]);
 #endif
 	}
 	/* legacy auto configured cards */
@@ -960,7 +960,7 @@
 
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("InterWave soundcard not found or device busy\n");
+		printk(KERN_ERR "InterWave soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c
index c92701db..a389a65 100644
--- a/sound/isa/opl3sa2.c
+++ b/sound/isa/opl3sa2.c
@@ -893,7 +893,7 @@
 #endif
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("Yamaha OPL3-SA soundcard not found or device busy\n");
+		printk(KERN_ERR "Yamaha OPL3-SA soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
index ea99fc5..b6771fb 100644
--- a/sound/isa/opti9xx/opti92x-ad1848.c
+++ b/sound/isa/opti9xx/opti92x-ad1848.c
@@ -2154,9 +2154,9 @@
 	if ((error = snd_card_opti9xx_probe())) {
 #ifdef MODULE
 #ifdef OPTi93X
-		snd_printk("no OPTi 82C93x soundcard found\n");
+		printk(KERN_ERR "no OPTi 82C93x soundcard found\n");
 #else
-		snd_printk("no OPTi 82C92x soundcard found\n");
+		printk(KERN_ERR "no OPTi 82C92x soundcard found\n");
 #endif	/* OPTi93X */
 #endif
 		return error;
diff --git a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c
index b57b0bd..30f5c3d 100644
--- a/sound/isa/sb/sb16.c
+++ b/sound/isa/sb/sb16.c
@@ -43,6 +43,12 @@
 
 #define chip_t sb_t
 
+#ifdef SNDRV_SBAWE
+#define PFX "sbawe: "
+#else
+#define PFX "sb16: "
+#endif
+
 #ifndef SNDRV_SBAWE
 EXPORT_NO_SYMBOLS;
 #endif
@@ -296,7 +302,7 @@
 	if (snd_irq[dev] != SNDRV_AUTO_IRQ)
 		isapnp_resource_change(&pdev->irq_resource[0], snd_irq[dev], 1);
 	if (pdev->activate(pdev) < 0) {
-		snd_printk("isapnp configure failure (out of resources?)\n");
+		printk(KERN_ERR PFX "isapnp configure failure (out of resources?)\n");
 		return -EBUSY;
 	}
 	snd_port[dev] = pdev->resource[0].start;
@@ -322,7 +328,7 @@
 		isapnp_resource_change(&pdev->resource[2], snd_awe_port[dev] + 0x800, 4);
 	}
 	if (pdev->activate(pdev)<0) {
-		snd_printk("WaveTable isapnp configure failure (out of resources?)\n");
+		printk(KERN_ERR PFX "WaveTable isapnp configure failure (out of resources?)\n");
 		acard->dev->deactivate(acard->dev);		
 		return -EBUSY;
 	}
@@ -402,21 +408,21 @@
 	if (irq == SNDRV_AUTO_IRQ) {
 		if ((irq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
 			snd_card_free(card);
-			snd_printk("unable to find a free IRQ\n");
+			printk(KERN_ERR PFX "unable to find a free IRQ\n");
 			return -EBUSY;
 		}
 	}
 	if (dma8 == SNDRV_AUTO_DMA) {
 		if ((dma8 = snd_legacy_find_free_dma(possible_dmas8)) < 0) {
 			snd_card_free(card);
-			snd_printk("unable to find a free 8-bit DMA\n");
+			printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n");
 			return -EBUSY;
 		}
 	}
 	if (dma16 == SNDRV_AUTO_DMA) {
 		if ((dma16 = snd_legacy_find_free_dma(possible_dmas16)) < 0) {
 			snd_card_free(card);
-			snd_printk("unable to find a free 16-bit DMA\n");
+			printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n");
 			return -EBUSY;
 		}
 	}
@@ -475,7 +481,7 @@
 		if (snd_opl3_create(card, snd_fm_port[dev], snd_fm_port[dev] + 2,
 				    OPL3_HW_OPL3, snd_fm_port[dev] == snd_port[dev],
 				    &opl3) < 0) {
-			snd_printk("no OPL device at 0x%lx-0x%lx\n",
+			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
 				   snd_fm_port[dev], snd_fm_port[dev] + 2);
 		} else {
 #ifdef SNDRV_SBAWE_EMU8000
@@ -503,7 +509,7 @@
 			chip->csp = csp->private_data;
 			chip->hardware = SB_HW_16CSP;
 		} else {
-			snd_printk("warning - CSP chip not detected on soundcard #%i\n", dev + 1);
+			printk(KERN_INFO PFX "warning - CSP chip not detected on soundcard #%i\n", dev + 1);
 		}
 	}
 #endif
@@ -511,7 +517,7 @@
 	if (snd_awe_port[dev] > 0) {
 		if (snd_emu8000_new(card, 1, snd_awe_port[dev],
 				    snd_seq_ports[dev], NULL) < 0) {
-			snd_printk("fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", snd_awe_port[dev]);
+			printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", snd_awe_port[dev]);
 			snd_card_free(card);
 			return -ENXIO;
 		}
@@ -612,7 +618,7 @@
 			continue;
 		}
 #ifdef MODULE
-		snd_printk("Sound Blaster 16+ soundcard #%i not found at 0x%lx or device busy\n", dev, snd_port[dev]);
+		printk(KERN_ERR "Sound Blaster 16+ soundcard #%i not found at 0x%lx or device busy\n", dev, snd_port[dev]);
 #endif			
 	}
 	/* legacy auto configured cards */
@@ -624,11 +630,11 @@
 
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("Sound Blaster 16 soundcard not found or device busy\n");
+		printk(KERN_ERR "Sound Blaster 16 soundcard not found or device busy\n");
 #ifdef SNDRV_SBAWE_EMU8000
-		snd_printk("In case, if you have non-AWE card, try snd-card-sb16 module\n");
+		printk(KERN_ERR "In case, if you have non-AWE card, try snd-card-sb16 module\n");
 #else
-		snd_printk("In case, if you have AWE card, try snd-card-sbawe module\n");
+		printk(KERN_ERR "In case, if you have AWE card, try snd-card-sbawe module\n");
 #endif
 #endif
 		return -ENODEV;
diff --git a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c
index 320b9fa..d668a17 100644
--- a/sound/isa/sb/sb8.c
+++ b/sound/isa/sb/sb8.c
@@ -144,13 +144,13 @@
 		if ((err = snd_opl3_create(card, chip->port + 8, 0,
 					   OPL3_HW_AUTO, 1,
 					   &opl3)) < 0) {
-			snd_printk("no OPL device at 0x%lx\n", chip->port + 8);
+			printk(KERN_ERR "sb8: no OPL device at 0x%lx\n", chip->port + 8);
 		}
 	} else {
 		if ((err = snd_opl3_create(card, chip->port, chip->port + 2,
 					   OPL3_HW_AUTO, 1,
 					   &opl3)) < 0) {
-			snd_printk("no OPL device at 0x%lx-0x%lx\n",
+			printk(KERN_ERR "sb8: no OPL device at 0x%lx-0x%lx\n",
 				   chip->port, chip->port + 2);
 		}
 	}
@@ -211,7 +211,7 @@
 	cards += snd_legacy_auto_probe(possible_ports, snd_card_sb8_legacy_auto_probe);
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("Sound Blaster soundcard not found or device busy\n");
+		printk(KERN_ERR "Sound Blaster soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c
index 09ddf37..10f4fdf 100644
--- a/sound/isa/sgalaxy.c
+++ b/sound/isa/sgalaxy.c
@@ -305,7 +305,7 @@
 	}
 	if (!cards) {
 #ifdef MODULE
-		snd_printk("Sound Galaxy soundcard not found or device busy\n");
+		printk(KERN_ERR "Sound Galaxy soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c
index 59164bf..0e0ae3c 100644
--- a/sound/isa/wavefront/wavefront.c
+++ b/sound/isa/wavefront/wavefront.c
@@ -740,7 +740,7 @@
 #endif
 	if (!cards) {
 #ifdef MODULE
-		snd_printk ("No cards found or devices busy\n");
+		printk (KERN_ERR "No WaveFront cards found or devices busy\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/last.c b/sound/last.c
index ec5416a..5e2c8d5 100644
--- a/sound/last.c
+++ b/sound/last.c
@@ -27,14 +27,14 @@
 {
 	int idx, ok = 0;
 	
-	printk("ALSA device list:\n");
+	printk(KERN_INFO "ALSA device list:\n");
 	for (idx = 0; idx < SNDRV_CARDS; idx++)
 		if (snd_cards[idx] != NULL) {
-			printk("  #%i: %s\n", idx, snd_cards[idx]->longname);
+			printk(KERN_INFO "  #%i: %s\n", idx, snd_cards[idx]->longname);
 			ok++;
 		}
 	if (ok == 0)
-		printk("  No soundcards found.\n");
+		printk(KERN_INFO "  No soundcards found.\n");
 	return 0;
 }
 
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
index b8a2bf11..e722c3c1f 100644
--- a/sound/pci/ac97/ac97_codec.c
+++ b/sound/pci/ac97/ac97_codec.c
@@ -115,7 +115,7 @@
 { 0x43525960, 0xfffffff8, "CS4291",		NULL },
 { 0x48525300, 0xffffff00, "HMP9701",		NULL },
 { 0x49434501, 0xffffffff, "ICE1230",		NULL },
-{ 0x49434511, 0xffffffff, "ICE1232",		NULL }, // only guess --jk
+{ 0x49434511, 0xffffffff, "ICE1232",		NULL }, // alias VIA VT1611A?
 { 0x4e534300, 0xffffffff, "LM4540/43/45/46/48",	NULL }, // only guess --jk
 { 0x4e534331, 0xffffffff, "LM4549",		NULL },
 { 0x53494c22, 0xffffffff, "Si3036",		NULL },
@@ -1393,28 +1393,31 @@
 	ac97->card = card;
 	spin_lock_init(&ac97->reg_lock);
 	snd_ac97_write(ac97, AC97_RESET, 0);	/* reset to defaults */
-	udelay(50);
+	if (ac97->wait)
+		ac97->wait(ac97);
+	else {
+		udelay(50);
 
-	/* it's necessary to wait awhile until registers are accessible after RESET */
-	/* because the PCM or MASTER volume registers can be modified, */
-	/* the REC_GAIN register is used for tests */
-	end_time = jiffies + (HZ / 2);
-	do {
-		/* use preliminary reads to settle the communication */
-		snd_ac97_read(ac97, AC97_RESET);
-		snd_ac97_read(ac97, AC97_VENDOR_ID1);
-		snd_ac97_read(ac97, AC97_VENDOR_ID2);
-		/* test if we can write to the PCM volume register */
-		snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a05);
-		if ((err = snd_ac97_read(ac97, AC97_REC_GAIN)) == 0x8a05)
-			goto __access_ok;
-		set_current_state(TASK_UNINTERRUPTIBLE);
-		schedule_timeout(HZ/100);
-	} while (end_time - (signed long)jiffies >= 0);
-	snd_printd("AC'97 %d:%d does not respond - RESET [REC_GAIN = 0x%x]\n", ac97->num, ac97->addr, err);
-	snd_ac97_free(ac97);
-	return -ENXIO;
-
+		/* it's necessary to wait awhile until registers are accessible after RESET */
+		/* because the PCM or MASTER volume registers can be modified, */
+		/* the REC_GAIN register is used for tests */
+		end_time = jiffies + HZ;
+		do {
+			/* use preliminary reads to settle the communication */
+			snd_ac97_read(ac97, AC97_RESET);
+			snd_ac97_read(ac97, AC97_VENDOR_ID1);
+			snd_ac97_read(ac97, AC97_VENDOR_ID2);
+			/* test if we can write to the PCM volume register */
+			snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a05);
+			if ((err = snd_ac97_read(ac97, AC97_REC_GAIN)) == 0x8a05)
+				goto __access_ok;
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout(HZ/100);
+		} while (end_time - (signed long)jiffies >= 0);
+		snd_printd("AC'97 %d:%d does not respond - RESET [REC_GAIN = 0x%x]\n", ac97->num, ac97->addr, err);
+		snd_ac97_free(ac97);
+		return -ENXIO;
+	}
       __access_ok:
 	ac97->caps = snd_ac97_read(ac97, AC97_RESET);
 	ac97->id = snd_ac97_read(ac97, AC97_VENDOR_ID1) << 16;
diff --git a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
index 200e61a..224d39d 100644
--- a/sound/pci/ali5451/ali5451.c
+++ b/sound/pci/ali5451/ali5451.c
@@ -2253,7 +2253,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("ALi pci audio not found or device busy.\n");
+		printk(KERN_ERR "ALi pci audio not found or device busy.\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/als4000.c b/sound/pci/als4000.c
index 8732200..0e93702 100644
--- a/sound/pci/als4000.c
+++ b/sound/pci/als4000.c
@@ -635,7 +635,7 @@
 				        gcr+0x30, 1, pci->irq, 0,
 				        &chip->rmidi)) < 0) {
 		snd_card_free(card);
-		snd_printk("no MPU-401device at 0x%lx ?\n", gcr+0x30);
+		printk(KERN_ERR "als4000: no MPU-401device at 0x%lx ?\n", gcr+0x30);
 		return err;
 	}
 
@@ -650,7 +650,7 @@
 
 	if (snd_opl3_create(card, gcr+0x10, gcr+0x12,
 			    OPL3_HW_AUTO, 1, &opl3) < 0) {
-		snd_printk("no OPL device at 0x%lx-0x%lx ?\n",
+		printk(KERN_ERR "als4000: no OPL device at 0x%lx-0x%lx ?\n",
 			   gcr+0x10, gcr+0x12 );
 	} else {
 		if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
@@ -692,7 +692,7 @@
 	
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("no ALS4000 based soundcards found or device busy\n");
+		printk(KERN_ERR "no ALS4000 based soundcards found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/cmipci.c b/sound/pci/cmipci.c
index f60ca9a..926b570 100644
--- a/sound/pci/cmipci.c
+++ b/sound/pci/cmipci.c
@@ -113,6 +113,7 @@
 
 #define CM_AC3EN1		0x00100000	/* enable AC3: model 037 */
 #define CM_SPD24SEL		0x00020000	/* 24bit spdif: model 037 */
+#define CM_SPDIF_INVERSE	0x00010000
 
 #define CM_ADCBITLEN_MASK	0x0000C000	
 #define CM_ADCBITLEN_16		0x00000000
@@ -131,6 +132,8 @@
 #define CM_CH0_SRATE_176K	0x00000200
 #define CM_CH0_SRATE_88K	0x00000100
 
+#define CM_SPDIF_INVERSE2	0x00000080	/* model 055? */
+
 #define CM_CH1FMT_MASK		0x0000000C
 #define CM_CH1FMT_SHIFT		2
 #define CM_CH0FMT_MASK		0x00000003
@@ -201,6 +204,7 @@
 #define CM_VIDWPPRT		0x00002000
 #define CM_SFILENB		0x00001000
 #define CM_MMODE_MASK		0x00000E00
+#define CM_SPDIF_SELECT		0x00000100	/* for model > 039 ? */
 #define CM_ENCENTER		0x00000080	/* shared with FLINKON? */
 #define CM_FLINKON		0x00000080
 #define CM_FLINKOFF		0x00000040
@@ -347,7 +351,7 @@
 	unsigned int offset;	/* physical address of the buffer */
 	unsigned int fmt;	/* format bits */
 	int ch;			/* channel (0/1) */
-	int is_dac;		/* is dac? */
+	unsigned int is_dac;		/* is dac? */
 	int bytes_per_frame;
 	int shift;
 	int ac3_shift;	/* extra shift: 1 on soft ac3 mode */
@@ -388,6 +392,9 @@
 	unsigned int can_ac3_sw: 1;
 	unsigned int can_ac3_hw: 1;
 	unsigned int can_multi_ch: 1;
+
+	unsigned int spdif_playback_avail: 1;	/* spdif ready? */
+	unsigned int spdif_playback_enabled: 1;	/* spdif switch enabled? */
 	int spdif_counter;	/* for software AC3 */
 
 	unsigned int dig_status;
@@ -1133,11 +1140,13 @@
 		save_mixer_state(cm);
 
 	spin_lock_irqsave(&cm->reg_lock, flags);
+	cm->spdif_playback_avail = up;
 	if (up) {
 		/* they are controlled via "IEC958 Output Switch" */
 		/* snd_cmipci_set_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); */
 		/* snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_SPDO2DAC); */
-		snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF);
+		if (cm->spdif_playback_enabled)
+			snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF);
 		setup_ac3(cm, do_ac3, rate);
 
 		if (rate == 48000)
@@ -2020,7 +2029,7 @@
 	CMIPCI_DOUBLE("Mic Capture Switch", SB_DSP4_INPUT_LEFT, SB_DSP4_INPUT_RIGHT, 0, 0, 1, 0, 0),
 	CMIPCI_SB_VOL_MONO("PC Speaker Playback Volume", SB_DSP4_SPEAKER_DEV, 6, 3),
 	CMIPCI_MIXER_VOL_STEREO("Aux Playback Volume", CM_REG_AUX_VOL, 4, 0, 15),
-	CMIPCI_MIXER_SW_STEREO("Aux Playback Switch", CM_REG_MIXER2, CM_VAUXLM_SHIFT, CM_VAUXRM_SHIFT, 0),
+	CMIPCI_MIXER_SW_STEREO("Aux Playback Switch", CM_REG_MIXER2, CM_VAUXLM_SHIFT, CM_VAUXRM_SHIFT, 1),
 	CMIPCI_MIXER_SW_STEREO("Aux Capture Switch", CM_REG_MIXER2, CM_RAUXLEN_SHIFT, CM_RAUXREN_SHIFT, 0),
 	CMIPCI_MIXER_SW_MONO("Mic Boost", CM_REG_MIXER2, CM_MICGAINZ_SHIFT, 1),
 	CMIPCI_MIXER_VOL_MONO("Mic Capture Volume", CM_REG_MIXER2, CM_VADMIC_SHIFT, 7),
@@ -2132,6 +2141,7 @@
 DEFINE_BIT_SWITCH_ARG(spdif_0, CM_REG_FUNCTRL1, CM_SPDF_0, 0);
 DEFINE_BIT_SWITCH_ARG(spdo_48k, CM_REG_MISC_CTRL, CM_SPDF_AC97|CM_SPDIF48K, 0);
 #endif
+DEFINE_BIT_SWITCH_ARG(spdif_in_1_2, CM_REG_MISC_CTRL, CM_SPDIF_SELECT, 0, 0);
 DEFINE_BIT_SWITCH_ARG(spdif_enable, CM_REG_LEGACY_CTRL, CM_ENSPDOUT, 0, 0);
 DEFINE_BIT_SWITCH_ARG(spdo2dac, CM_REG_FUNCTRL1, CM_SPDO2DAC, 0, 1);
 DEFINE_BIT_SWITCH_ARG(spdi_valid, CM_REG_MISC, CM_SPDVALID, 1, 0);
@@ -2140,7 +2150,8 @@
 DEFINE_SWITCH_ARG(spdo_5v, CM_REG_MISC_CTRL, CM_SPDO5V, 0, 0, 0); /* inverse: 0 = 5V */
 DEFINE_BIT_SWITCH_ARG(spdif_loop, CM_REG_FUNCTRL1, CM_SPDFLOOP, 0, 1);
 DEFINE_BIT_SWITCH_ARG(spdi_monitor, CM_REG_MIXER1, CM_CDPLAY, 1, 0);
-DEFINE_BIT_SWITCH_ARG(spdi_phase, CM_REG_MISC, 0x04, 0, 0);
+DEFINE_BIT_SWITCH_ARG(spdi_phase, CM_REG_CHFORMAT, CM_SPDIF_INVERSE, 0, 0);
+DEFINE_BIT_SWITCH_ARG(spdi_phase2, CM_REG_CHFORMAT, CM_SPDIF_INVERSE2, 0, 0);
 #if CM_CH_PLAY == 1
 DEFINE_SWITCH_ARG(exchange_dac, CM_REG_MISC_CTRL, CM_XCHGDAC, 0, 0, 0); /* reversed */
 #else
@@ -2179,9 +2190,20 @@
 
 static int snd_cmipci_spdout_enable_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
 {
+	cmipci_t *chip = snd_kcontrol_chip(kcontrol);
 	int changed;
 	changed = _snd_cmipci_uswitch_put(kcontrol, ucontrol, &cmipci_switch_arg_spdif_enable);
 	changed |= _snd_cmipci_uswitch_put(kcontrol, ucontrol, &cmipci_switch_arg_spdo2dac);
+	if (changed) {
+		if (ucontrol->value.integer.value[0]) {
+			if (chip->spdif_playback_avail)
+				snd_cmipci_set_bit(chip, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF);
+		} else {
+			if (chip->spdif_playback_avail)
+				snd_cmipci_clear_bit(chip, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF);
+		}
+	}
+	chip->spdif_playback_enabled = ucontrol->value.integer.value[0];
 	return changed;
 }
 
@@ -2213,17 +2235,19 @@
 	DEFINE_MIXER_SWITCH("IEC958 5V", spdo_5v),
 	DEFINE_MIXER_SWITCH("IEC958 Loop", spdif_loop),
 	DEFINE_MIXER_SWITCH("IEC958 In Monitor", spdi_monitor),
-	DEFINE_MIXER_SWITCH("IEC958 In Phase Inverse", spdi_phase),
 };
 
 /* only for model 033/037 */
 static snd_kcontrol_new_t snd_cmipci_old_mixer_switches[] __devinitdata = {
 	DEFINE_MIXER_SWITCH("IEC958 Mix Analog", spdif_dac_out),
+	DEFINE_MIXER_SWITCH("IEC958 In Phase Inverse", spdi_phase),
 };
 
-/* only for model 039 */
+/* only for model 039 or later */
 static snd_kcontrol_new_t snd_cmipci_extra_mixer_switches[] __devinitdata = {
 	DEFINE_MIXER_SWITCH("Line-In As Bass", line_bass),
+	DEFINE_MIXER_SWITCH("IEC958 In Select", spdif_in_1_2),
+	DEFINE_MIXER_SWITCH("IEC958 In Phase Inverse", spdi_phase2),
 };
 
 /* card control switches */
@@ -2283,7 +2307,7 @@
 		cm->spdif_pcm_ctl = kctl;
 		if (cm->chip_version <= 37) {
 			sw = snd_cmipci_old_mixer_switches;
-			for (idx = 0; idx < num_controls(snd_cmipci_extra_mixer_switches); idx++, sw++) {
+			for (idx = 0; idx < num_controls(snd_cmipci_old_mixer_switches); idx++, sw++) {
 				err = snd_ctl_add(cm->card, snd_ctl_new1(sw, cm));
 				if (err < 0)
 					return err;
@@ -2573,10 +2597,10 @@
 
 		if (snd_opl3_create(card, iosynth, iosynth + 2,
 				    OPL3_HW_OPL3, 0, &cm->opl3) < 0) {
-			snd_printk("no OPL device at 0x%lx\n", iosynth);
+			printk(KERN_ERR "cmipci: no OPL device at 0x%lx\n", iosynth);
 		} else {
 			if ((err = snd_opl3_hwdep_new(cm->opl3, 0, 1, &cm->opl3hwdep)) < 0)
-				snd_printk("cannot create OPL3 hwdep\n");
+				printk(KERN_ERR "cmipci: cannot create OPL3 hwdep\n");
 		}
 	}
 
@@ -2609,7 +2633,7 @@
 		if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI,
 					       iomidi, 0,
 					       cm->irq, 0, &cm->rmidi)) < 0) {
-			snd_printk("cmipci: no UART401 device at 0x%lx\n", iomidi);
+			printk(KERN_ERR "cmipci: no UART401 device at 0x%lx\n", iomidi);
 		}
 	}
 
@@ -2711,7 +2735,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("C-Media PCI soundcard not found or device busy\n");
+		printk(KERN_ERR "C-Media PCI soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c
index 5d0e561..5aad9f4f 100644
--- a/sound/pci/cs4281.c
+++ b/sound/pci/cs4281.c
@@ -268,7 +268,7 @@
 #define BA0_SERC1_SO1EN		(1<<0)	/* Primary Output Port Enable */
 
 #define BA0_SERC2		0x042c	/* Serial Port Configuration 2 */
-#define BA0_SERC2_SI1F(x)	(((x)&7)>>1) */ Primary Input Port Format */
+#define BA0_SERC2_SI1F(x)	(((x)&7)>>1) /* Primary Input Port Format */
 #define BA0_SERC2_AC97		(1<<1)
 #define BA0_SERC2_SI1EN		(1<<0)	/* Primary Input Port Enable */
 
@@ -1910,7 +1910,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("CS4281 soundcard not found or device busy\n");
+		printk(KERN_ERR "CS4281 soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c
index 14d4981..61a2120 100644
--- a/sound/pci/cs46xx/cs46xx.c
+++ b/sound/pci/cs46xx/cs46xx.c
@@ -183,7 +183,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("Sound Fusion CS46xx soundcard not found or device busy\n");
+		printk(KERN_ERR "Sound Fusion CS46xx soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c
index e7e501d..84e0f8f 100644
--- a/sound/pci/emu10k1/emu10k1.c
+++ b/sound/pci/emu10k1/emu10k1.c
@@ -210,7 +210,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("EMU10K1/Audigy soundcard not found or device busy\n");
+		printk(KERN_ERR "EMU10K1/Audigy soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
index 241361a..25e0830 100644
--- a/sound/pci/emu10k1/emu10k1_main.c
+++ b/sound/pci/emu10k1/emu10k1_main.c
@@ -218,6 +218,10 @@
 	 */
 	outl(inl(emu->port + HCFG) | HCFG_AUDIOENABLE, emu->port + HCFG);
 
+	/* Enable analog/digital outs on audigy */
+	if (emu->audigy)
+		outl(inl(emu->port + A_IOCFG) & ~0x44, emu->port + A_IOCFG);
+
 #if 0
 	{
 	unsigned int tmp;
@@ -274,7 +278,7 @@
 	snd_emu10k1_ptr_write(emu, TCBS, 0, TCBS_BUFFSIZE_16K);
 	snd_emu10k1_ptr_write(emu, TCB, 0, 0);
 	if (emu->audigy)
-		snd_emu10k1_ptr_write(emu, A_DBG, 0, A_DBG_SINGLE_STEP_ADDR);
+		snd_emu10k1_ptr_write(emu, A_DBG, 0, A_DBG_SINGLE_STEP);
 	else
 		snd_emu10k1_ptr_write(emu, DBG, 0, 0x8000);
 
@@ -625,18 +629,10 @@
 	}
 	
 	emu->fx8010.fxbus_mask = 0x303f;
-	if (extin_mask == 0) {
-		if (emu->audigy)
-			extin_mask = 0x000f;
-		else
-			extin_mask = 0x1fcf;
-	}
-	if (extout_mask == 0) {
-		if (emu->audigy)
-			extout_mask = 0x3fff;
-		else
-			extout_mask = 0x3fff;
-	}
+	if (extin_mask == 0)
+		extin_mask = 0x1fcf;
+	if (extout_mask == 0)
+		extout_mask = 0x3fff;
 	emu->fx8010.extin_mask = extin_mask;
 	emu->fx8010.extout_mask = extout_mask;
 
diff --git a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c
index 96c3a83..7393b02 100644
--- a/sound/pci/emu10k1/emufx.c
+++ b/sound/pci/emu10k1/emufx.c
@@ -95,12 +95,12 @@
 	/* 0x05 */ NULL,
 	/* 0x06 */ NULL,
 	/* 0x07 */ NULL,
-	/* 0x08 */ NULL,
-	/* 0x09 */ NULL,
+	/* 0x08 */ "Line/Mic 2 Left",
+	/* 0x09 */ "Line/Mic 2 Right",
 	/* 0x0a */ NULL,
 	/* 0x0b */ NULL,
-	/* 0x0c */ NULL,
-	/* 0x0d */ NULL,
+	/* 0x0c */ "Aux2 Left",
+	/* 0x0d */ "Aux2 Right",
 	/* 0x0e */ NULL,
 	/* 0x0f */ NULL
 };
@@ -141,14 +141,14 @@
 };
 
 static char *audigy_outs[32] = {
-	/* 0x00 */ NULL,
-	/* 0x01 */ NULL,
-	/* 0x02 */ NULL,
-	/* 0x03 */ NULL,
+	/* 0x00 */ "Digital Front Left",
+	/* 0x01 */ "Digital Front Right",
+	/* 0x02 */ "Digital Center",
+	/* 0x03 */ "Digital LEF",
 	/* 0x04 */ "Headphone Left",
 	/* 0x05 */ "Headphone Right",
-	/* 0x06 */ NULL,
-	/* 0x07 */ NULL,
+	/* 0x06 */ "Digital Rear Left",
+	/* 0x07 */ "Digital Rear Right",
 	/* 0x08 */ "Front Left",
 	/* 0x09 */ "Front Right",
 	/* 0x0a */ "Center",
@@ -157,14 +157,14 @@
 	/* 0x0d */ NULL,
 	/* 0x0e */ "Rear Left",
 	/* 0x0f */ "Rear Right",
-	/* 0x10 */ NULL,
-	/* 0x11 */ NULL,
-	/* 0x12 */ NULL,
-	/* 0x13 */ NULL,
+	/* 0x10 */ "AC97 Front Left",
+	/* 0x11 */ "AC97 Front Right",
+	/* 0x12 */ "ADC Caputre Left",
+	/* 0x13 */ "ADC Capture Right",
 	/* 0x14 */ NULL,
 	/* 0x15 */ NULL,
-	/* 0x16 */ "ADC Capture Left",
-	/* 0x17 */ "ADC Capture Right",
+	/* 0x16 */ NULL,
+	/* 0x17 */ NULL,
 	/* 0x18 */ NULL,
 	/* 0x19 */ NULL,
 	/* 0x1a */ NULL,
@@ -1034,7 +1034,7 @@
 	/* stop FX processor - this may be dangerous, but it's better to miss
 	   some samples than generate wrong ones - [jk] */
 	if (emu->audigy)
-		snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP_ADDR);
+		snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
 	else
 		snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
 	/* ok, do the main job */
@@ -1220,36 +1220,34 @@
 	ptr = 0;
 	nctl = 0;
 	playback = 10;
-	capture = playback + 6; /* 5+1 channels */
-	gpr = capture + 2; /* so far only a stereo capture */
+	capture = playback + 10; /* we reserve 10 voices */
+	gpr = capture + 10;
 	tmp = 0x80;
 	
 	/* stop FX processor */
-	snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP_ADDR);
-
-#define A_C_ZERO	0x0c0
+	snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP);
 
 	/* Wave Playback */
-	A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_ZERO, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
-	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_ZERO, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
 	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100);
 	gpr += 2;
 
 	/* Wave Surround Playback */
-	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_ZERO, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR));
-	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_ZERO, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
 	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Surround Playback Volume", gpr, 0);
 	gpr += 2;
 
 	/* Wave Center Playback */
 	/* Center = sub = Left/2 + Right/2 */
 	A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_FXBUS(FXBUS_PCM_LEFT), 0xcd, A_FXBUS(FXBUS_PCM_RIGHT));
-	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_C_ZERO, A_GPR(gpr), A_GPR(tmp));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_GPR(tmp));
 	snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Center Playback Volume", gpr, 0);
 	gpr++;
 
 	/* Wave LFE Playback */
-	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_C_ZERO, A_GPR(gpr), A_GPR(tmp));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_GPR(tmp));
 	snd_emu10k1_init_mono_control(&controls[nctl++], "Wave LFE Playback Volume", gpr, 0);
 	gpr++;
 
@@ -1260,8 +1258,8 @@
 	gpr += 2;
 
 	/* Wave Capture */
-	A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_C_ZERO, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
-	A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_C_ZERO, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
+	A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
+	A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
 	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Capture Volume", gpr, 0);
 	gpr += 2;
 
@@ -1271,14 +1269,20 @@
 	snd_emu10k1_init_stereo_control(&controls[nctl++], "Music Capture Volume", gpr, 0);
 	gpr += 2;
 
+	/* Surround Playback */
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR));
+	A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR));
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Surround Playback Volume", gpr, 80);
+	gpr += 2;
+
 	/* Center Playback */
 	A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER));
-	snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 0);
+	snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 80);
 	gpr++;
 
 	/* LFE Playback */
 	A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE));
-	snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 0);
+	snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 80);
 	gpr++;
 
 	/*
@@ -1286,54 +1290,70 @@
 	 */
 #define A_ADD_VOLUME_IN(var,vol,input) \
 A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
-	if (emu->fx8010.extin_mask & ((1<<A_EXTIN_AC97_L)|(1<<A_EXTIN_AC97_R))) {
-		/* AC'97 Playback Volume */
-		A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_AC97_L);
-		A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_AC97_R);
-		snd_emu10k1_init_stereo_control(&controls[nctl++], "AC97 Playback Volume", gpr, 0);
-		gpr += 2;
-		/* AC'97 Capture Volume */
-		A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L);
-		A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R);
-		snd_emu10k1_init_stereo_control(&controls[nctl++], "AC97 Capture Volume", gpr, 100);
-		gpr += 2;
-	}
 
-	if (emu->fx8010.extin_mask & ((1<<A_EXTIN_SPDIF_CD_L)|(1<<A_EXTIN_SPDIF_CD_R))) {
-		/* Audigy CD Playback Volume */
-		A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_SPDIF_CD_L);
-		A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_SPDIF_CD_R);
-		snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Playback Volume", gpr, 0);
-		gpr += 2;
-		/* Audigy CD Capture Volume */
-		A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L);
-		A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R);
-		snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Capture Volume", gpr, 100);
-		gpr += 2;
-	}
+	/* AC'97 Playback Volume */
+	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_AC97_L);
+	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_AC97_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "AC97 Playback Volume", gpr, 0);
+	gpr += 2;
+	/* AC'97 Capture Volume */
+	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L);
+	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "AC97 Capture Volume", gpr, 100);
+	gpr += 2;
+
+	/* Audigy CD Playback Volume */
+	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_SPDIF_CD_L);
+	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_SPDIF_CD_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Playback Volume", gpr, 0);
+	gpr += 2;
+	/* Audigy CD Capture Volume */
+	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L);
+	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Audigy CD Capture Volume", gpr, 0);
+	gpr += 2;
+
+	/* Line2 Playback Volume */
+	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_LINE2_L);
+	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_LINE2_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Line2 Playback Volume", gpr, 0);
+	gpr += 2;
+	/* Line2 Capture Volume */
+	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L);
+	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Line2 Capture Volume", gpr, 0);
+	gpr += 2;
+
+	/* Aux2 Playback Volume */
+	A_ADD_VOLUME_IN(playback, gpr, A_EXTIN_AUX2_L);
+	A_ADD_VOLUME_IN(playback+1, gpr+1, A_EXTIN_AUX2_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Aux2 Playback Volume", gpr, 0);
+	gpr += 2;
+	/* Aux2 Capture Volume */
+	A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AUX2_L);
+	A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AUX2_R);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Aux2 Capture Volume", gpr, 0);
+	gpr += 2;
 
 	/*
 	 * outputs
 	 */
-#define A_PUT_OUTPUT(out,src) A_OP(icode, &ptr, iACC3, A_EXTOUT(out), A_C_ZERO, A_C_ZERO, A_GPR(src))
-#define A_PUT_MONO_OUTPUT(out,src) \
-	if (emu->fx8010.extout_mask & (1<<(out))) A_PUT_OUTPUT(out,src)
+#define A_PUT_OUTPUT(out,src) A_OP(icode, &ptr, iACC3, A_EXTOUT(out), A_C_00000000, A_C_00000000, A_GPR(src))
 #define A_PUT_STEREO_OUTPUT(out1,out2,src) \
-	if (emu->fx8010.extout_mask & ((1<<(out1))|(1<<(out2)))) {\
-		A_PUT_OUTPUT(out1,src);\
-		A_PUT_OUTPUT(out2,src+1);}
+	{A_PUT_OUTPUT(out1,src); A_PUT_OUTPUT(out2,src+1);}
 
 	/* digital outputs */
 	A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback);
 	A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2);
-	A_PUT_MONO_OUTPUT(A_EXTOUT_CENTER, playback+4);
-	A_PUT_MONO_OUTPUT(A_EXTOUT_LFE, playback+5);
+	A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4);
+	A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5);
 
 	/* analog speakers */
-	A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback);
+	//A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback);
+	A_PUT_STEREO_OUTPUT(A_EXTOUT_AC97_L, A_EXTOUT_AC97_R, playback);
 	A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2);
-	A_PUT_MONO_OUTPUT(A_EXTOUT_ACENTER, playback+4);
-	A_PUT_MONO_OUTPUT(A_EXTOUT_ALFE, playback+5);
+	A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4);
+	A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5);
 
 	/* headphone */
 	A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback);
@@ -1946,7 +1966,7 @@
 {
 	/* stop processor */
 	if (emu->audigy)
-		snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = A_DBG_SINGLE_STEP_ADDR);
+		snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = A_DBG_SINGLE_STEP);
 	else
 		snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = EMU10K1_DBG_SINGLE_STEP);
 }
@@ -2127,7 +2147,7 @@
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
 		if (emu->audigy)
-			snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP_ADDR);
+			snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP);
 		else
 			snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP);
 		return 0;
@@ -2160,12 +2180,12 @@
 		if (addr > 0x1ff)
 			return -EINVAL;
 		if (emu->audigy)
-			snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP_ADDR | addr);
+			snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | addr);
 		else
 			snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | addr);
 		udelay(10);
 		if (emu->audigy)
-			snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP_ADDR | A_DBG_STEP_ADDR | addr);
+			snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | A_DBG_STEP_ADDR | addr);
 		else
 			snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | EMU10K1_DBG_STEP | addr);
 		return 0;
diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
index 9ff7078..83bbf43 100644
--- a/sound/pci/emu10k1/emumixer.c
+++ b/sound/pci/emu10k1/emumixer.c
@@ -107,12 +107,40 @@
         put:            snd_emu10k1_spdif_put
 };
 
-/* FIXME: audigy has more routing/effects */
+
+static void update_emu10k1_fxrt(emu10k1_t *emu, int voice, unsigned char *route)
+{
+	if (emu->audigy) {
+		snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
+				      snd_emu10k1_compose_audigy_fxrt1(route));
+		snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
+				      snd_emu10k1_compose_audigy_fxrt2(route));
+	} else {
+		snd_emu10k1_ptr_write(emu, FXRT, voice,
+				      snd_emu10k1_compose_send_routing(route));
+	}
+}
+
+static void update_emu10k1_send_volume(emu10k1_t *emu, int voice, unsigned char *volume)
+{
+	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, volume[0]);
+	snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, volume[1]);
+	snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, volume[2]);
+	snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, volume[3]);
+	if (emu->audigy) {
+		unsigned int val = ((unsigned int)volume[4] << 24) |
+			((unsigned int)volume[5] << 16) |
+			((unsigned int)volume[6] << 8) |
+			(unsigned int)volume[7];
+		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, val);
+	}
+}
+
 static int snd_emu10k1_send_routing_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-	uinfo->count = 3*4;
+	uinfo->count = emu->audigy ? 3*8 : 3*4;
 	uinfo->value.integer.min = 0;
 	uinfo->value.integer.max = emu->audigy ? 0x3f : 0x0f;
 	return 0;
@@ -125,13 +153,14 @@
 	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
 	int voice, idx;
+	int num_efx = emu->audigy ? 8 : 4;
+	int mask = emu->audigy ? 0x3f : 0x0f;
 
 	spin_lock_irqsave(&emu->reg_lock, flags);
 	for (voice = 0; voice < 3; voice++)
-		for (idx = 0; idx < 4; idx++)
-			ucontrol->value.integer.value[(voice * 4) + idx] = emu->audigy ?
-				((mix->send_routing[voice] >> (idx * 8)) & 0x3f) :
-				((mix->send_routing[voice] >> (idx * 4)) & 0x0f);
+		for (idx = 0; idx < num_efx; idx++)
+			ucontrol->value.integer.value[(voice * num_efx) + idx] = 
+				mix->send_routing[voice][idx] & mask;
 	spin_unlock_irqrestore(&emu->reg_lock, flags);
         return 0;
 }
@@ -143,44 +172,27 @@
 	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
 	int change = 0, voice, idx, val;
+	int num_efx = emu->audigy ? 8 : 4;
+	int mask = emu->audigy ? 0x3f : 0x0f;
 
 	spin_lock_irqsave(&emu->reg_lock, flags);
 	for (voice = 0; voice < 3; voice++)
-		for (idx = 0; idx < 4; idx++) {
-			val = ucontrol->value.integer.value[(voice * 4) + idx];
-			if (emu->audigy) {
-				int shift = idx * 8;
-				val &= 0x3f;
-				if (((mix->send_routing[voice] >> shift) & 0x3f) != val) {
-					mix->send_routing[voice] &= ~(0x3f << shift);
-					mix->send_routing[voice] |= val << shift;
-					change = 1;
-				}
-			} else {
-				int shift = idx * 4;
-				val = ucontrol->value.integer.value[(voice * 4) + idx] & 15;
-				if (((mix->send_routing[voice] >> shift) & 15) != val) {
-					mix->send_routing[voice] &= ~(15 << shift);
-					mix->send_routing[voice] |= val << shift;
-					change = 1;
-				}
+		for (idx = 0; idx < num_efx; idx++) {
+			val = ucontrol->value.integer.value[(voice * num_efx) + idx] & mask;
+			if (mix->send_routing[voice][idx] != val) {
+				mix->send_routing[voice][idx] = val;
+				change = 1;
 			}
 		}	
 	if (change && mix->epcm) {
 		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
-			if (emu->audigy) {
-				snd_emu10k1_ptr_write(emu, A_FXRT1, mix->epcm->voices[0]->number, mix->send_routing[1]);
-				snd_emu10k1_ptr_write(emu, A_FXRT1, mix->epcm->voices[1]->number, mix->send_routing[2]);
-			} else {
-				snd_emu10k1_ptr_write(emu, FXRT, mix->epcm->voices[0]->number, mix->send_routing[1] << 16);
-				snd_emu10k1_ptr_write(emu, FXRT, mix->epcm->voices[1]->number, mix->send_routing[2] << 16);
-			}
+			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
+					    &mix->send_routing[1][0]);
+			update_emu10k1_fxrt(emu, mix->epcm->voices[1]->number,
+					    &mix->send_routing[2][0]);
 		} else if (mix->epcm->voices[0]) {
-			if (emu->audigy) {
-				snd_emu10k1_ptr_write(emu, A_FXRT1, mix->epcm->voices[0]->number, mix->send_routing[0]);
-			} else {
-				snd_emu10k1_ptr_write(emu, FXRT, mix->epcm->voices[0]->number, mix->send_routing[0] << 16);
-			}
+			update_emu10k1_fxrt(emu, mix->epcm->voices[0]->number,
+					    &mix->send_routing[0][0]);
 		}
 	}
 	spin_unlock_irqrestore(&emu->reg_lock, flags);
@@ -199,8 +211,9 @@
 
 static int snd_emu10k1_send_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
+	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-	uinfo->count = 3*4;
+	uinfo->count = emu->audigy ? 3*8 : 3*4;
 	uinfo->value.integer.min = 0;
 	uinfo->value.integer.max = 255;
 	return 0;
@@ -213,10 +226,11 @@
 	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
 	int idx;
+	int num_efx = emu->audigy ? 8 : 4;
 
 	spin_lock_irqsave(&emu->reg_lock, flags);
-	for (idx = 0; idx < 3*4; idx++)
-		ucontrol->value.integer.value[idx] = mix->send_volume[idx/4][idx%4];
+	for (idx = 0; idx < 3*num_efx; idx++)
+		ucontrol->value.integer.value[idx] = mix->send_volume[idx/num_efx][idx%num_efx];
 	spin_unlock_irqrestore(&emu->reg_lock, flags);
         return 0;
 }
@@ -228,34 +242,25 @@
 	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
 	int change = 0, idx, val;
+	int num_efx = emu->audigy ? 8 : 4;
 
 	spin_lock_irqsave(&emu->reg_lock, flags);
-	for (idx = 0; idx < 3*4; idx++) {
+	for (idx = 0; idx < 3*num_efx; idx++) {
 		val = ucontrol->value.integer.value[idx] & 255;
-		if (mix->send_volume[idx/4][idx%4] != val) {
-			mix->send_volume[idx/4][idx%4] = val;
+		if (mix->send_volume[idx/num_efx][idx%num_efx] != val) {
+			mix->send_volume[idx/num_efx][idx%num_efx] = val;
 			change = 1;
 		}
 	}
 	if (change && mix->epcm) {
-		u32 voice;
 		if (mix->epcm->voices[0] && mix->epcm->voices[1]) {
-			voice = mix->epcm->voices[0]->number;
-			snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, mix->send_volume[1][0]);
-			snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, mix->send_volume[1][1]);
-			snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, mix->send_volume[1][2]);
-			snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, mix->send_volume[1][3]);
-			voice = mix->epcm->voices[1]->number;
-			snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, mix->send_volume[2][0]);
-			snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, mix->send_volume[2][1]);
-			snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, mix->send_volume[2][2]);
-			snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, mix->send_volume[2][3]);
+			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
+						   &mix->send_volume[1][0]);
+			update_emu10k1_send_volume(emu, mix->epcm->voices[1]->number,
+						   &mix->send_volume[2][0]);
 		} else if (mix->epcm->voices[0]) {
-			voice = mix->epcm->voices[0]->number;
-			snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_A, voice, mix->send_volume[0][0]);
-			snd_emu10k1_ptr_write(emu, PTRX_FXSENDAMOUNT_B, voice, mix->send_volume[0][1]);
-			snd_emu10k1_ptr_write(emu, PSST_FXSENDAMOUNT_C, voice, mix->send_volume[0][2]);
-			snd_emu10k1_ptr_write(emu, DSL_FXSENDAMOUNT_D, voice, mix->send_volume[0][3]);
+			update_emu10k1_send_volume(emu, mix->epcm->voices[0]->number,
+						   &mix->send_volume[0][0]);
 		}
 	}
 	spin_unlock_irqrestore(&emu->reg_lock, flags);
@@ -380,6 +385,71 @@
 	put:		snd_emu10k1_shared_spdif_put
 };
 
+#if 0 // XXX: not working yet..
+/*
+ * Audigy analog / digital switches
+ */
+static int audigy_output_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
+	uinfo->count = 1;
+	uinfo->value.integer.min = 0;
+	uinfo->value.integer.max = 1;
+	return 0;
+}
+
+static int audigy_output_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	unsigned int mask = (unsigned int)kcontrol->private_value;
+
+	ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & mask ? 0 : 1;
+        return 0;
+}
+
+static int audigy_output_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
+{
+	unsigned long flags;
+	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	unsigned int mask = (unsigned int)kcontrol->private_value;
+	unsigned int reg, oreg;
+	int change;
+
+	spin_lock_irqsave(&emu->reg_lock, flags);
+	reg = oreg = inl(emu->port + A_IOCFG);
+	reg &= ~mask;
+	reg |= ucontrol->value.integer.value[0] & 1 ? 0 : mask;
+	change = (reg != oreg);
+	if (change)
+		outl(reg, emu->port + A_IOCFG);
+	spin_unlock_irqrestore(&emu->reg_lock, flags);
+        return change;
+}
+
+static snd_kcontrol_new_t audigy_output_analog =
+{
+	iface:		SNDRV_CTL_ELEM_IFACE_MIXER,
+	name:		"Audigy Analog Output Switch",
+	info:		audigy_output_info,
+	get:		audigy_output_get,
+	put:		audigy_output_put,
+	private_value:	0x40,
+};
+
+static snd_kcontrol_new_t audigy_output_digital =
+{
+	iface:		SNDRV_CTL_ELEM_IFACE_MIXER,
+	name:		"Audigy Digital Output Switch",
+	info:		audigy_output_info,
+	get:		audigy_output_get,
+	put:		audigy_output_put,
+	private_value:	0x04,
+};
+#endif // XXX
+
+
+/*
+ */
 static void snd_emu10k1_mixer_free_ac97(ac97_t *ac97)
 {
 	emu10k1_t *emu = snd_magic_cast(emu10k1_t, ac97->private_data, return);
@@ -407,6 +477,7 @@
 
 	for (pcm = 0; pcm < 32; pcm++) {
 		emu10k1_pcm_mixer_t *mix;
+		int v;
 		
 		mix = &emu->pcm_mixer[pcm];
 		mix->epcm = NULL;
@@ -417,11 +488,10 @@
 		kctl->id.index = pcm;
 		if ((err = snd_ctl_add(card, kctl)))
 			return err;
-		if (emu->audigy) {
-			mix->send_routing[0] = mix->send_routing[1] = mix->send_routing[2] = 0x3210;
-		} else {
-			mix->send_routing[0] = mix->send_routing[1] = mix->send_routing[2] = 0x03020100;
-		}
+		for (v = 0; v < 4; v++)
+			mix->send_routing[0][v] = 
+				mix->send_routing[1][v] = 
+				mix->send_routing[2][v] = v;
 		
 		if ((kctl = mix->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
 			return -ENOMEM;
@@ -457,10 +527,23 @@
 			return err;
 	}
 
-	if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
-		return -ENOMEM;
-	if ((err = snd_ctl_add(card, kctl)))
-		return err;
+	if (emu->audigy) {
+#if 0 // XXX
+		if ((kctl = snd_ctl_new1(&audigy_output_analog, emu)) == NULL)
+			return -ENOMEM;
+		if ((err = snd_ctl_add(card, kctl)))
+			return err;
+		if ((kctl = snd_ctl_new1(&audigy_output_digital, emu)) == NULL)
+			return -ENOMEM;
+		if ((err = snd_ctl_add(card, kctl)))
+			return err;
+#endif // XXX
+	} else {
+		if ((kctl = snd_ctl_new1(&snd_emu10k1_shared_spdif, emu)) == NULL)
+			return -ENOMEM;
+		if ((err = snd_ctl_add(card, kctl)))
+			return err;
+	}
 
 	return 0;
 }
diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 44037bb..3e92d39 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -237,8 +237,8 @@
 	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[substream->number];
 	unsigned int silent_page, tmp;
 	int voice, stereo, w_16;
-	unsigned char attn, send_a, send_b, send_c, send_d;
-	unsigned short send_routing;
+	unsigned char attn, send_amount[8];
+	unsigned char send_routing[8];
 	unsigned long flags;
 	unsigned int pitch_target;
 
@@ -260,15 +260,16 @@
 	/* volume parameters */
 	if (extra) {
 		attn = 0;
-		send_routing = emu->audigy ? 0x03020100 : 0x3210;
-		send_a = send_b = send_c = send_d = 0x00;
+		memset(send_routing, 0, sizeof(send_routing));
+		send_routing[0] = 0;
+		send_routing[1] = 1;
+		send_routing[2] = 2;
+		send_routing[3] = 3;
+		memset(send_amount, 0, sizeof(send_amount));
 	} else {
 		tmp = stereo ? (master ? 1 : 2) : 0;
-		send_a = mix->send_volume[tmp][0];
-		send_b = mix->send_volume[tmp][1];
-		send_c = mix->send_volume[tmp][2];
-		send_d = mix->send_volume[tmp][3];
-		send_routing = mix->send_routing[tmp];
+		memcpy(send_routing, &mix->send_routing[tmp][0], 8);
+		memcpy(send_amount, &mix->send_volume[tmp][0], 8);
 	}
 
 	if (master) {
@@ -290,16 +291,29 @@
 
 	// setup routing
 	if (emu->audigy) {
-		snd_emu10k1_ptr_write(emu, A_FXRT1, voice, send_routing);
-		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice, 0); /* no effects */
-		snd_emu10k1_ptr_write(emu, A_FXRT2, voice, 0); /* channels EFGH */
+		snd_emu10k1_ptr_write(emu, A_FXRT1, voice,
+				      ((unsigned int)send_routing[3] << 24) |
+				      ((unsigned int)send_routing[2] << 16) |
+				      ((unsigned int)send_routing[1] << 8) |
+				      (unsigned int)send_routing[0]);
+		snd_emu10k1_ptr_write(emu, A_FXRT2, voice,
+				      ((unsigned int)send_routing[7] << 24) |
+				      ((unsigned int)send_routing[6] << 16) |
+				      ((unsigned int)send_routing[5] << 8) |
+				      (unsigned int)send_routing[4]);
+		snd_emu10k1_ptr_write(emu, A_SENDAMOUNTS, voice,
+				      ((unsigned int)send_amount[4] << 24) |
+				      ((unsigned int)send_amount[5] << 16) |
+				      ((unsigned int)send_amount[6] << 8) |
+				      (unsigned int)send_amount[7]);
 	} else
-		snd_emu10k1_ptr_write(emu, FXRT, voice, send_routing << 16);
+		snd_emu10k1_ptr_write(emu, FXRT, voice,
+				      snd_emu10k1_compose_send_routing(send_routing));
 	// Stop CA
 	// Assumption that PT is already 0 so no harm overwriting
-	snd_emu10k1_ptr_write(emu, PTRX, voice, (send_a << 8) | send_b);
-	snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_d << 24));
-	snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_c << 24));
+	snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
+	snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
+	snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
 	pitch_target = emu10k1_calc_pitch_target(runtime->rate);
 	snd_emu10k1_ptr_write(emu, CCCA, voice, evoice->epcm->ccca_start_addr |
 			      emu10k1_select_interprom(pitch_target) |
@@ -753,7 +767,7 @@
 	emu10k1_pcm_t *epcm;
 	emu10k1_pcm_mixer_t *mix;
 	snd_pcm_runtime_t *runtime = substream->runtime;
-	int err;
+	int i, err;
 
 	epcm = snd_magic_kcalloc(emu10k1_pcm_t, 0, GFP_KERNEL);
 	if (epcm == NULL)
@@ -773,8 +787,8 @@
 		return err;
 	}
 	mix = &emu->pcm_mixer[substream->number];
-	mix->send_routing[0] = mix->send_routing[1] = mix->send_routing[2] =
-		emu->audigy ? 0x03020100 : 0x3210;
+	for (i = 0; i < 4; i++)
+		mix->send_routing[0][i] = mix->send_routing[1][i] = mix->send_routing[2][i] = i;
 	memset(&mix->send_volume, 0, sizeof(mix->send_volume));
 	mix->send_volume[0][0] = mix->send_volume[0][1] =
 	mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
diff --git a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c
index d128b33..a522736 100644
--- a/sound/pci/emu10k1/emuproc.c
+++ b/sound/pci/emu10k1/emuproc.c
@@ -250,6 +250,7 @@
 		}
 	}
 	emu->proc_entry = entry;
+	entry = NULL;
 	if ((entry = snd_info_create_card_entry(emu->card, "fx8010_gpr", emu->card->proc_root)) != NULL) {
 		entry->content = SNDRV_INFO_CONTENT_DATA;
 		entry->private_data = emu;
@@ -262,6 +263,7 @@
 		}
 	}
 	emu->proc_entry_fx8010_gpr = entry;
+	entry = NULL;
 	if (!emu->audigy && (entry = snd_info_create_card_entry(emu->card, "fx8010_tram_data", emu->card->proc_root)) != NULL) {
 		entry->content = SNDRV_INFO_CONTENT_DATA;
 		entry->private_data = emu;
@@ -274,6 +276,7 @@
 		}
 	}
 	emu->proc_entry_fx8010_tram_data = entry;
+	entry = NULL;
 	if (!emu->audigy && (entry = snd_info_create_card_entry(emu->card, "fx8010_tram_addr", emu->card->proc_root)) != NULL) {
 		entry->content = SNDRV_INFO_CONTENT_DATA;
 		entry->private_data = emu;
@@ -286,6 +289,7 @@
 		}
 	}
 	emu->proc_entry_fx8010_tram_addr = entry;
+	entry = NULL;
 	if ((entry = snd_info_create_card_entry(emu->card, "fx8010_code", emu->card->proc_root)) != NULL) {
 		entry->content = SNDRV_INFO_CONTENT_DATA;
 		entry->private_data = emu;
@@ -298,6 +302,7 @@
 		}
 	}
 	emu->proc_entry_fx8010_code = entry;
+	entry = NULL;
 	if ((entry = snd_info_create_card_entry(emu->card, "fx8010_acode", emu->card->proc_root)) != NULL) {
 		entry->content = SNDRV_INFO_CONTENT_TEXT;
 		entry->private_data = emu;
diff --git a/sound/pci/ens1370.c b/sound/pci/ens1370.c
index 9d6df8b..64e94e6 100644
--- a/sound/pci/ens1370.c
+++ b/sound/pci/ens1370.c
@@ -2049,7 +2049,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("Ensoniq AudioPCI soundcard not found or device busy\n");
+		printk(KERN_ERR "Ensoniq AudioPCI soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/es1938.c b/sound/pci/es1938.c
index e8a254a..0aaa38c 100644
--- a/sound/pci/es1938.c
+++ b/sound/pci/es1938.c
@@ -1626,7 +1626,7 @@
 			    SLSB_REG(chip, FMLOWADDR),
 			    SLSB_REG(chip, FMHIGHADDR),
 			    OPL3_HW_OPL3, 1, &opl3) < 0) {
-	        snd_printk("OPL3 not detected at 0x%lx\n",
+		printk(KERN_ERR "es1938: OPL3 not detected at 0x%lx\n",
 			   SLSB_REG(chip, FMLOWADDR));
 	} else {
 	        if ((err = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
@@ -1640,7 +1640,7 @@
 	}
 	if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
 				chip->mpu_port, 1, chip->irq, 0, &chip->rmidi) < 0) {
-		snd_printk("unable to initialize MPU-401\n");
+		printk(KERN_ERR "es1938: unable to initialize MPU-401\n");
 	}
 #ifndef LINUX_2_2
 	chip->gameport.io = chip->game_port;
@@ -1683,7 +1683,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("ESS Solo-1 soundcard not found or device busy\n");
+		printk(KERN_ERR "ESS Solo-1 soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c
index aa0bdc5..905e176 100644
--- a/sound/pci/es1968.c
+++ b/sound/pci/es1968.c
@@ -2720,7 +2720,7 @@
 	if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
 				       chip->io_port + ESM_MPU401_PORT, 1,
 				       chip->irq, 0, &chip->rmidi)) < 0) {
-		printk(KERN_INFO "es1968: skipping MPU-401 MIDI support..\n");
+		printk(KERN_WARNING "es1968: skipping MPU-401 MIDI support..\n");
 	}
 
 	/* card switches */
@@ -2783,7 +2783,7 @@
 
         if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("ESS Maestro soundcard not found or device busy\n");
+		printk(KERN_ERR "ESS Maestro soundcard not found or device busy\n");
 #endif
 		return err;
 	}
@@ -2792,7 +2792,7 @@
 	   leave the speaking emitting an annoying noise, so we catch
 	   shutdown events. */ 
 	if (register_reboot_notifier(&snd_es1968_nb)) {
-		snd_printk("reboot notifier registration failed; may make noise at shutdown.\n");
+		printk(KERN_ERR "reboot notifier registration failed; may make noise at shutdown.\n");
 	}
 #endif
 	return 0;
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c
index 469f537..c8432ef 100644
--- a/sound/pci/fm801.c
+++ b/sound/pci/fm801.c
@@ -1104,7 +1104,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("ForteMedia FM801 soundcard not found or device busy\n");
+		printk(KERN_ERR "ForteMedia FM801 soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/ice1712.c b/sound/pci/ice1712.c
index 71cf791..6cf4a16 100644
--- a/sound/pci/ice1712.c
+++ b/sound/pci/ice1712.c
@@ -1718,7 +1718,7 @@
 	if (rpcm)
 		*rpcm = pcm;
 
-	printk("Consumer PCM code does not work well at the moment --jk\n");
+	printk(KERN_WARNING "Consumer PCM code does not work well at the moment --jk\n");
 
 	return 0;
 }
@@ -2410,7 +2410,7 @@
 		ac97.private_data = ice;
 		ac97.private_free = snd_ice1712_mixer_free_ac97;
 		if ((err = snd_ac97_mixer(ice->card, &ac97, &ice->ac97)) < 0) {
-			snd_printk("ice1712: cannot initialize ac97 for consumer, skipped\n");
+			printk(KERN_WARNING "ice1712: cannot initialize ac97 for consumer, skipped\n");
 			// return err;
 		} else {
 			if ((err = snd_ctl_add(ice->card, snd_ctl_new1(&snd_ice1712_mixer_digmix_route_ac97, ice))) < 0)
@@ -2428,7 +2428,7 @@
 		ac97.private_data = ice;
 		ac97.private_free = snd_ice1712_mixer_free_ac97;
 		if ((err = snd_ac97_mixer(ice->card, &ac97, &ice->ac97)) < 0) {
-			snd_printk("ice1712: cannot initialize pro ac97, skipped\n");
+			printk(KERN_WARNING "ice1712: cannot initialize pro ac97, skipped\n");
 			// return err;
 		}
 		return 0;
@@ -4329,7 +4329,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("ICE1712 soundcard not found or device busy\n");
+		printk(KERN_ERR "ICE1712 soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
index a22598c..26bc53ed 100644
--- a/sound/pci/intel8x0.c
+++ b/sound/pci/intel8x0.c
@@ -35,6 +35,7 @@
 #include <sound/pcm.h>
 #include <sound/ac97_codec.h>
 #include <sound/info.h>
+#include <sound/mpu401.h>
 #define SNDRV_GET_ID
 #include <sound/initval.h>
 
@@ -52,10 +53,24 @@
 		"{SiS,SI7012},"
 		"{NVidia,NForce Audio}}");
 
+#define SUPPORT_JOYSTICK 1
+#define SUPPORT_MIDI 1
+
 static int snd_index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *snd_id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int snd_enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int snd_ac97_clock[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 0};
+#ifdef SUPPORT_JOYSTICK
+static int snd_joystick_port[SNDRV_CARDS] =
+#ifdef CONFIG_ISA
+	{0x200};	/* enable as default */
+#else
+	{0};	/* disabled */
+#endif
+#endif
+#ifdef SUPPORT_MIDI
+static int snd_mpu_port[SNDRV_CARDS]; /* disabled */
+#endif
 
 MODULE_PARM(snd_index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(snd_index, "Index value for Intel i8x0 soundcard.");
@@ -69,6 +84,16 @@
 MODULE_PARM(snd_ac97_clock, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(snd_ac97_clock, "AC'97 codec clock (0 = auto-detect).");
 MODULE_PARM_SYNTAX(snd_ac97_clock, SNDRV_ENABLED ",default:0");
+#ifdef SUPPORT_JOYSTICK
+MODULE_PARM(snd_joystick_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(snd_joystick_port, "Joystick port address for Intel i8x0 soundcard. (0 = disabled)");
+MODULE_PARM_SYNTAX(snd_joystick_port, SNDRV_ENABLED ",allows:{{0},{0x200}},dialog:list");
+#endif
+#ifdef SUPPORT_MIDI
+MODULE_PARM(snd_mpu_port, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(snd_mpu_port, "MPU401 port # for Intel i8x0 driver.");
+MODULE_PARM_SYNTAX(snd_mpu_port, SNDRV_ENABLED ",allows:{{0},{0x330},{0x300}},dialog:list");
+#endif
 
 /*
  *  Direct registers
@@ -231,6 +256,8 @@
 	ac97_t *ac97;
 	ac97_t *ac97sec;
 
+	snd_rawmidi_t *rmidi;
+
 	spinlock_t reg_lock;
 	spinlock_t ac97_lock;
 	snd_info_entry_t *proc_entry;
@@ -256,9 +283,9 @@
 	{ 0x8086, 0x2445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL },	/* 82801BA */
 	{ 0x8086, 0x2485, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL },	/* ICH3 */
 	{ 0x8086, 0x7195, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL },	/* 440MX */
-	{ 0x8086, 0x7195, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL },	/* 440MX */
 	{ 0x1039, 0x7012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_SIS },	/* SI7012 */
 	{ 0x10de, 0x01b1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL },	/* NFORCE */
+	{ 0x764d, 0x1022, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL },	/* AMD8111 */
 	{ 0, }
 };
 
@@ -1087,6 +1114,7 @@
 {
 	snd_card_t *card = chip->card;
 
+	chip->in_suspend = 1;
 	snd_power_lock(card);
 	if (card->power_state == SNDRV_CTL_POWER_D3hot)
 		goto __skip;
@@ -1364,6 +1392,7 @@
 	{ PCI_DEVICE_ID_INTEL_ICH3, "Intel ICH3" },
 	{ PCI_DEVICE_ID_SI_7012, "SiS SI7012" },
 	{ PCI_DEVICE_ID_NVIDIA_MCP_AUDIO, "NVidia NForce" },
+	{ 0x1022, "AMD-8111" },
 	{ 0, 0 },
 };
 
@@ -1416,6 +1445,16 @@
 		}
 	}
 	
+	if (snd_mpu_port[dev] == 0x300 || snd_mpu_port[dev] == 0x330) {
+		if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI,
+					       snd_mpu_port[dev], 0,
+					       -1, 0, &chip->rmidi)) < 0) {
+			printk(KERN_ERR "intel8x0: no UART401 device at 0x%x, skipping.\n", snd_mpu_port[dev]);
+			snd_mpu_port[dev] = 0;
+		}
+	} else
+		snd_mpu_port[dev] = 0;
+
 	sprintf(card->longname, "%s at 0x%lx, irq %i",
 		card->shortname, chip->port, chip->irq);
 
@@ -1450,16 +1489,77 @@
 #endif
 };
 
+
+#if defined(SUPPORT_JOYSTICK) || defined(SUPPORT_MIDI)
+/*
+ * initialize joystick/midi addresses
+ */
+
+static int __devinit snd_intel8x0_joystick_probe(struct pci_dev *pci,
+						 const struct pci_device_id *id)
+{
+	static int dev = 0;
+	if (dev >= SNDRV_CARDS)
+		return -ENODEV;
+	if (!snd_enable[dev]) {
+		dev++;
+		return -ENOENT;
+	}
+
+	if (snd_joystick_port[dev] > 0 || snd_mpu_port[dev] > 0) {
+		u16 val;
+		pci_read_config_word(pci, 0xe6, &val);
+		if (snd_joystick_port[dev] > 0)
+			val |= 0x100;
+		if (snd_mpu_port[dev] == 0x300 || snd_mpu_port[dev] == 0x330)
+			val |= 0x20;
+		pci_write_config_word(pci, 0xe6, val | 0x100);
+
+		if (snd_mpu_port[dev] == 0x300 || snd_mpu_port[dev] == 0x330) {
+			u8 b;
+			pci_read_config_byte(pci, 0xe2, &b);
+			if (snd_mpu_port[dev] == 0x300)
+				b |= 0x08;
+			else
+				b &= ~0x08;
+			pci_write_config_byte(pci, 0xe2, b);
+		}
+	}
+	return 0;
+}
+
+static struct pci_device_id snd_intel8x0_joystick_ids[] __devinitdata = {
+	{ 0x8086, 0x2410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },	/* 82801AA */
+	{ 0x8086, 0x2420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },	/* 82901AB */
+	{ 0x8086, 0x2440, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ICH2 */
+	{ 0x8086, 0x244c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ICH2M */
+	{ 0x8086, 0x248c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },	/* ICH3 */
+	// { 0x8086, 0x7195, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },	/* 440MX */
+	// { 0x1039, 0x7012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },	/* SI7012 */
+	{ 0x10de, 0x01b2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },	/* NFORCE */
+	{ 0, }
+};
+
+static struct pci_driver joystick_driver = {
+	name: "Intel ICH Joystick",
+	id_table: snd_intel8x0_joystick_ids,
+	probe: snd_intel8x0_joystick_probe,
+};
+#endif
+
 static int __init alsa_card_intel8x0_init(void)
 {
 	int err;
 
         if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-                snd_printk("Intel ICH soundcard not found or device busy\n");
+		printk(KERN_ERR "Intel ICH soundcard not found or device busy\n");
 #endif
                 return err;
         }
+#if defined(SUPPORT_JOYSTICK) || defined(SUPPORT_MIDI)
+	pci_module_init(&joystick_driver);
+#endif
         return 0;
 
 }
@@ -1467,6 +1567,9 @@
 static void __exit alsa_card_intel8x0_exit(void)
 {
 	pci_unregister_driver(&driver);
+#if defined(SUPPORT_JOYSTICK) || defined(SUPPORT_MIDI)
+	pci_unregister_driver(&joystick_driver);
+#endif
 }
 
 module_init(alsa_card_intel8x0_init)
diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c
index e7cdc34..655b369 100644
--- a/sound/pci/korg1212/korg1212.c
+++ b/sound/pci/korg1212/korg1212.c
@@ -1953,27 +1953,27 @@
 
         korg1212->res_iomem = request_mem_region(korg1212->iomem, iomem_size, "korg1212");
         if (korg1212->res_iomem == NULL) {
-                PRINTK("unable to grab region 0x%lx-0x%lx\n",
+		snd_printk("unable to grab region 0x%lx-0x%lx\n",
                            korg1212->iomem, korg1212->iomem + iomem_size - 1);
                 return -EBUSY;
         }
 
         korg1212->res_ioport = request_region(korg1212->ioport, ioport_size, "korg1212");
         if (korg1212->res_ioport == NULL) {
-                PRINTK("unable to grab region 0x%lx-0x%lx\n",
+		snd_printk("unable to grab region 0x%lx-0x%lx\n",
                            korg1212->ioport, korg1212->ioport + ioport_size - 1);
                 return -EBUSY;
         }
 
         korg1212->res_iomem2 = request_mem_region(korg1212->iomem2, iomem2_size, "korg1212");
         if (korg1212->res_iomem2 == NULL) {
-                PRINTK("unable to grab region 0x%lx-0x%lx\n",
+		snd_printk("unable to grab region 0x%lx-0x%lx\n",
                            korg1212->iomem2, korg1212->iomem2 + iomem2_size - 1);
                 return -EBUSY;
         }
 
         if ((korg1212->iobase = (unsigned long) ioremap(korg1212->iomem, iomem_size)) == 0) {
-                PRINTK("unable to remap memory region 0x%lx-0x%lx\n", korg1212->iobase,
+		snd_printk("unable to remap memory region 0x%lx-0x%lx\n", korg1212->iobase,
                            korg1212->iobase + iomem_size - 1);
                 return -EBUSY;
         }
@@ -1983,7 +1983,7 @@
                           "korg1212", (void *) korg1212);
 
         if (err) {
-                PRINTK("unable to grab IRQ %d\n", pci->irq);
+		snd_printk("unable to grab IRQ %d\n", pci->irq);
                 return -EBUSY;
         }
 
@@ -2034,7 +2034,7 @@
 	korg1212->sharedBufferPhy = (unsigned long)phys_addr;
 
         if (korg1212->sharedBufferPtr == NULL) {
-                PRINTK("can not allocate shared buffer memory (%d bytes)\n", sizeof(KorgSharedBuffer));
+		snd_printk("can not allocate shared buffer memory (%d bytes)\n", sizeof(KorgSharedBuffer));
                 return -ENOMEM;
         }
 
@@ -2050,7 +2050,7 @@
 	korg1212->PlayDataPhy = (u32)phys_addr;
 
         if (korg1212->playDataBufsPtr == NULL) {
-                PRINTK("can not allocate play data buffer memory (%d bytes)\n", korg1212->DataBufsSize);
+		snd_printk("can not allocate play data buffer memory (%d bytes)\n", korg1212->DataBufsSize);
                 return -ENOMEM;
         }
 
@@ -2063,7 +2063,7 @@
 	korg1212->RecDataPhy = (u32)phys_addr;
 
         if (korg1212->recordDataBufsPtr == NULL) {
-                PRINTK("can not allocate record data buffer memory (%d bytes)\n", korg1212->DataBufsSize);
+		snd_printk("can not allocate record data buffer memory (%d bytes)\n", korg1212->DataBufsSize);
                 return -ENOMEM;
         }
 
@@ -2091,7 +2091,7 @@
 	korg1212->dspMemPhy = (u32)phys_addr;
 
         if (korg1212->dspMemPtr == NULL) {
-                PRINTK("can not allocate dsp code memory (%d bytes)\n", korg1212->dspCodeSize);
+		snd_printk("can not allocate dsp code memory (%d bytes)\n", korg1212->dspCodeSize);
                 return -ENOMEM;
         }
 
@@ -2114,7 +2114,7 @@
         if (snd_korg1212_downloadDSPCode(korg1212))
         	return -EBUSY;
 
-        PRINTK("dspMemPhy       = %08x U[%08x]\n"
+	printk(KERN_INFO "dspMemPhy       = %08x U[%08x]\n"
                "PlayDataPhy     = %08x L[%08x]\n"
                "RecDataPhy      = %08x L[%08x]\n"
                "VolumeTablePhy  = %08x L[%08x]\n"
@@ -2312,7 +2312,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		PRINTK("No Korg 1212IO cards found\n");
+		printk(KERN_ERR "No Korg 1212IO cards found\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c
index c417429..310ec07 100644
--- a/sound/pci/maestro3.c
+++ b/sound/pci/maestro3.c
@@ -2676,7 +2676,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("Maestro3/Allegro soundcard not found or device busy\n");
+		printk(KERN_ERR "Maestro3/Allegro soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/nm256/nm256.c b/sound/pci/nm256/nm256.c
index 7deb659..8912c62 100644
--- a/sound/pci/nm256/nm256.c
+++ b/sound/pci/nm256/nm256.c
@@ -331,7 +331,7 @@
 	offset -= chip->buffer_start;
 #ifdef SNDRV_CONFIG_DEBUG
 	if (offset < 0 || offset >= chip->buffer_size) {
-		printk("nm256: write_buffer invalid offset = %d size = %d\n", offset, size);
+		snd_printk("write_buffer invalid offset = %d size = %d\n", offset, size);
 		return;
 	}
 #endif
@@ -1436,10 +1436,10 @@
 		pval = snd_nm256_readw(chip, NM_MIXER_PRESENCE);
 		if ((pval & NM_PRESENCE_MASK) != NM_PRESENCE_VALUE) {
 			if (! force_load) {
-				printk(KERN_INFO "nm256: no ac97 is found!\n");
-				printk(KERN_INFO "  force the driver to load by passing in the module parameter\n");
-				printk(KERN_INFO "    snd_force_ac97=1\n");
-				printk(KERN_INFO "  or try sb16 or cs423x drivers instead.\n");
+				printk(KERN_ERR "nm256: no ac97 is found!\n");
+				printk(KERN_ERR "  force the driver to load by passing in the module parameter\n");
+				printk(KERN_ERR "    snd_force_ac97=1\n");
+				printk(KERN_ERR "  or try sb16 or cs423x drivers instead.\n");
 				err = -ENXIO;
 				goto __error;
 			}
@@ -1477,8 +1477,8 @@
 	chip->buffer_start = chip->buffer_end - chip->buffer_size;
 	chip->buffer_addr += chip->buffer_start;
 
-	snd_printd("NM256: Mapping port 1 from 0x%x - 0x%x\n",
-		   chip->buffer_start, chip->buffer_end);
+	printk(KERN_INFO "nm256: Mapping port 1 from 0x%x - 0x%x\n",
+	       chip->buffer_start, chip->buffer_end);
 
 	chip->res_buffer = request_mem_region(chip->buffer_addr,
 					      chip->buffer_size,
@@ -1652,7 +1652,7 @@
 	int err;
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("NeoMagic 256 audio soundchip not found or device busy\n");
+		printk(KERN_ERR "NeoMagic 256 audio soundchip not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c
index 31446b1..18891a0 100644
--- a/sound/pci/rme96.c
+++ b/sound/pci/rme96.c
@@ -2486,7 +2486,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("No RME Digi96 cards found\n");
+		printk(KERN_ERR "No RME Digi96 cards found\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c
index 9d8d1ab..c4c7162 100644
--- a/sound/pci/rme9652/rme9652.c
+++ b/sound/pci/rme9652/rme9652.c
@@ -392,7 +392,7 @@
 	if (offset < period_size) {
 		if (offset > rme9652->max_jitter) {
 			if (frag)
-				printk("Unexpected hw_pointer position (bufid == 0): status: %x offset: %d\n", status, offset);
+				printk(KERN_ERR "Unexpected hw_pointer position (bufid == 0): status: %x offset: %d\n", status, offset);
 		} else if (!frag)
 			return 0;
 		offset -= rme9652->max_jitter;
@@ -401,7 +401,7 @@
 	} else {
 		if (offset > period_size + rme9652->max_jitter) {
 			if (!frag)
-				printk("Unexpected hw_pointer position (bufid == 1): status: %x offset: %d\n", status, offset);
+				printk(KERN_ERR "Unexpected hw_pointer position (bufid == 1): status: %x offset: %d\n", status, offset);
 		} else if (frag)
 			return period_size;
 		offset -= rme9652->max_jitter;
@@ -1887,8 +1887,7 @@
 #endif
 		}
 
-		snd_printk("%s: no buffers available\n",
-			   rme9652->card_name);
+		printk(KERN_ERR "%s: no buffers available\n", rme9652->card_name);
 		return -ENOMEM;
 	}
 
@@ -1901,24 +1900,16 @@
 
 	/* Align to bus-space 64K boundary */
 
-	cb_bus = cb_addr;
-	cb_bus = (cb_bus + 0xFFFF) & ~0xFFFFl;
-
-	pb_bus = pb_addr;
-	pb_bus = (pb_bus + 0xFFFF) & ~0xFFFFl;
+	cb_bus = (cb_addr + 0xFFFF) & ~0xFFFFl;
+	pb_bus = (pb_addr + 0xFFFF) & ~0xFFFFl;
 
 	/* Tell the card where it is */
 
 	rme9652_write(rme9652, RME9652_rec_buffer, cb_bus);
 	rme9652_write(rme9652, RME9652_play_buffer, pb_bus);
 
-#if 0 // not all architectures have this macro
-	rme9652->capture_buffer = bus_to_virt(cb_bus);
-	rme9652->playback_buffer = bus_to_virt(pb_bus);
-#else
-	rme9652->capture_buffer += cb_bus - cb_addr;
-	rme9652->playback_buffer += pb_bus - pb_addr;
-#endif
+	rme9652->capture_buffer = cb + (cb_bus - cb_addr);
+	rme9652->playback_buffer = pb + (pb_bus - pb_addr);
 
 	return 0;
 }
@@ -2732,7 +2723,7 @@
 {
 	if (pci_module_init(&driver) < 0) {
 #ifdef MODULE
-		snd_printk("RME Digi9652/Digi9636: no cards found\n");
+		printk(KERN_ERR "RME Digi9652/Digi9636: no cards found\n");
 #endif
 		return -ENODEV;
 	}
diff --git a/sound/pci/sonicvibes.c b/sound/pci/sonicvibes.c
index a3316e7..d204ae0 100644
--- a/sound/pci/sonicvibes.c
+++ b/sound/pci/sonicvibes.c
@@ -1551,7 +1551,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("S3 SonicVibes soundcard not found or device busy\n");
+		printk(KERN_ERR "S3 SonicVibes soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/trident/trident.c b/sound/pci/trident/trident.c
index a352379..127b051 100644
--- a/sound/pci/trident/trident.c
+++ b/sound/pci/trident/trident.c
@@ -223,7 +223,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("Trident 4DWave PCI soundcard not found or device busy\n");
+		printk(KERN_ERR "Trident 4DWave PCI soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/via686.c b/sound/pci/via686.c
index 9378a6a..a0fe9c1 100644
--- a/sound/pci/via686.c
+++ b/sound/pci/via686.c
@@ -246,6 +246,16 @@
 	return -EIO;
 }
  
+static void snd_via686a_codec_wait(ac97_t *ac97)
+{
+	via686a_t *chip = snd_magic_cast(via686a_t, ac97->private_data, return);
+	int err;
+	err = snd_via686a_codec_ready(chip, ac97->num);
+	/* here we need to wait fairly for long time.. */
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ/2);
+}
+
 static void snd_via686a_codec_write(ac97_t *ac97,
 				    unsigned short reg,
 				    unsigned short val)
@@ -811,6 +821,7 @@
 	ac97.write = snd_via686a_codec_write;
 	ac97.read = snd_via686a_codec_read;
 	ac97.init = snd_via686a_codec_init;
+	ac97.wait = snd_via686a_codec_wait;
 	ac97.private_data = chip;
 	ac97.private_free = snd_via686a_mixer_free_ac97;
 	ac97.clock = chip->ac97_clock;
@@ -1178,7 +1189,7 @@
 	pci_write_config_byte(pci, 0x43, legacy_cfg);
 	if (legacy & 0x02) {
 		if (check_region(snd_mpu_port[dev], 2)) {
-			snd_printk("unable to get MPU-401 port at 0x%lx, skipping\n", snd_mpu_port[dev]);
+			printk(KERN_WARNING "unable to get MPU-401 port at 0x%lx, skipping\n", snd_mpu_port[dev]);
 			legacy &= ~0x02;
 			pci_write_config_byte(pci, 0x42, legacy);
 			goto __skip_mpu;
@@ -1187,7 +1198,7 @@
 					snd_mpu_port[dev], 0,
 					pci->irq, 0,
 					&chip->rmidi) < 0) {
-			snd_printk("unable to initialize MPU-401 at 0x%lx, skipping\n", snd_mpu_port[dev]);
+			printk(KERN_WARNING "unable to initialize MPU-401 at 0x%lx, skipping\n", snd_mpu_port[dev]);
 			legacy &= ~0x02;
 			pci_write_config_byte(pci, 0x42, legacy);
 			goto __skip_mpu;
@@ -1239,7 +1250,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("VIA 82C686A soundcard not found or device busy\n");
+		printk(KERN_ERR "VIA 82C686A soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/via8233.c b/sound/pci/via8233.c
index 7ee583a..61409bf 100644
--- a/sound/pci/via8233.c
+++ b/sound/pci/via8233.c
@@ -877,7 +877,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("VIA 8233 soundcard not found or device busy\n");
+		printk(KERN_ERR "VIA 8233 soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c
index 66c2059..1bfa2b6 100644
--- a/sound/pci/ymfpci/ymfpci.c
+++ b/sound/pci/ymfpci/ymfpci.c
@@ -197,7 +197,7 @@
 		if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_YMFPCI,
 					       snd_mpu_port[dev], 0,
 					       pci->irq, 0, &chip->rawmidi)) < 0) {
-			printk(KERN_INFO "ymfpci: cannot initialize MPU401 at 0x%lx, skipping...\n", snd_mpu_port[dev]);
+			printk(KERN_WARNING "ymfpci: cannot initialize MPU401 at 0x%lx, skipping...\n", snd_mpu_port[dev]);
 		} else {
 			legacy_ctrl &= ~0x10; /* disable MPU401 irq */
 			pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);
@@ -208,7 +208,7 @@
 					   snd_fm_port[dev],
 					   snd_fm_port[dev] + 2,
 					   OPL3_HW_OPL3, 0, &opl3)) < 0) {
-			printk(KERN_INFO "ymfpci: cannot initialize FM OPL3 at 0x%lx, skipping...\n", snd_fm_port[dev]);
+			printk(KERN_WARNING "ymfpci: cannot initialize FM OPL3 at 0x%lx, skipping...\n", snd_fm_port[dev]);
 		} else if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
 			snd_card_free(card);
 			snd_printk("cannot create opl3 hwdep\n");
@@ -216,7 +216,7 @@
 		}
 	}
 	if ((err = snd_ymfpci_joystick(chip)) < 0) {
-		printk(KERN_INFO "ymfpci: cannot initialize joystick, skipping...\n");
+		printk(KERN_WARNING "ymfpci: cannot initialize joystick, skipping...\n");
 	}
 	strcpy(card->driver, str);
 	sprintf(card->shortname, "Yamaha DS-XG PCI (%s)", str);
@@ -287,7 +287,7 @@
 
 	if ((err = pci_module_init(&driver)) < 0) {
 #ifdef MODULE
-		snd_printk("Yamaha DS-XG PCI soundcard not found or device busy\n");
+		printk(KERN_ERR "Yamaha DS-XG PCI soundcard not found or device busy\n");
 #endif
 		return err;
 	}
diff --git a/sound/ppc/keywest.c b/sound/ppc/keywest.c
index 0286406..d688606 100644
--- a/sound/ppc/keywest.c
+++ b/sound/ppc/keywest.c
@@ -179,7 +179,7 @@
 	i2c_device = find_compatible_devices("i2c", "keywest");
 	
 	if (i2c_device == 0) {
-		snd_printk("No Keywest i2c devices found.\n");
+		printk(KERN_ERR "pmac: No Keywest i2c devices found.\n");
 		return -ENODEV;
 	}
 	
diff --git a/sound/ppc/powermac.c b/sound/ppc/powermac.c
index 6957e95..06e2c71 100644
--- a/sound/ppc/powermac.c
+++ b/sound/ppc/powermac.c
@@ -150,7 +150,7 @@
 	int err;
 	if ((err = snd_pmac_probe() < 0)) {
 #ifdef MODULE
-		snd_printk("no PMac soundchip found\n");
+		printk(KERN_ERR "no PMac soundchip found\n");
 #endif
 		return err;
 	}
diff --git a/sound/sound_core.c b/sound/sound_core.c
index 9fd5562..45350b7 100644
--- a/sound/sound_core.c
+++ b/sound/sound_core.c
@@ -17,7 +17,7 @@
  *	plug into this. The fact they dont all go via OSS doesn't mean 
  *	they don't have to implement the OSS API. There is a lot of logic
  *	to keeping much of the OSS weight out of the code in a compatibility
- *	module, but its up to the driver to rember to load it...
+ *	module, but it's up to the driver to rember to load it...
  *
  *	The code provides a set of functions for registration of devices
  *	by type. This is done rather than providing a single call so that
@@ -171,10 +171,10 @@
 		return r;
 	}
 	
-	if (r == low)
+	if (r < SOUND_STEP)
 		sprintf (name_buf, "%s", name);
 	else
-		sprintf (name_buf, "%s%d", name, (r - low) / SOUND_STEP);
+		sprintf (name_buf, "%s%d", name, r / SOUND_STEP);
 	s->de = devfs_register (devfs_handle, name_buf,
 				DEVFS_FL_NONE, SOUND_MAJOR, s->unit_minor,
 				S_IFCHR | mode, fops, NULL);
@@ -215,7 +215,7 @@
  *	15	*16		unused
  */
 
-static struct sound_unit *chains[16];
+static struct sound_unit *chains[SOUND_STEP];
 
 /**
  *	register_sound_special - register a special sound node
@@ -229,17 +229,22 @@
  
 int register_sound_special(struct file_operations *fops, int unit)
 {
-	char *name;
+	const int chain = unit % (SOUND_STEP-1);
+	int max_unit = 128 + chain;
+	const char *name;
+	char _name[16];
 
-	switch (unit) {
+	switch (chain) {
 	    case 0:
 		name = "mixer";
 		break;
 	    case 1:
 		name = "sequencer";
-		break;
+		if (unit >= SOUND_STEP)
+			goto __unknown;
+		max_unit = unit + 1;
 	    case 2:
-		name = "midi00";
+		name = "midi";
 		break;
 	    case 3:
 		name = "dsp";
@@ -247,17 +252,11 @@
 	    case 4:
 		name = "audio";
 		break;
-	    case 5:
-		name = "unknown5";
-		break;
-	    case 6:		/* Was once sndstat */
-		name = "unknown6";
-		break;
-	    case 7:
-		name = "unknown7";
-		break;
 	    case 8:
 		name = "sequencer2";
+		if (unit >= SOUND_STEP)
+			goto __unknown;
+		max_unit = unit + 1;
 		break;
 	    case 9:
 		name = "dmmidi";
@@ -265,9 +264,6 @@
 	    case 10:
 		name = "dmfm";
 		break;
-	    case 11:
-		name = "unknown11";
-		break;
 	    case 12:
 		name = "adsp";
 		break;
@@ -278,10 +274,16 @@
 		name = "admmidi";
 		break;
 	    default:
-		name = "unknown";
+	    	{
+		    __unknown:
+			sprintf(_name, "unknown%d", chain);
+		    	if (unit >= SOUND_STEP)
+		    		strcat(_name, "-");
+		    	name = _name;
+		}
 		break;
 	}
-	return sound_insert_unit(&chains[unit&15], fops, -1, unit, unit+1,
+	return sound_insert_unit(&chains[chain], fops, -1, unit, max_unit,
 				 name, S_IRUSR | S_IWUSR);
 }
  
diff --git a/sound/synth/emux/emux_synth.c b/sound/synth/emux/emux_synth.c
index 7c4a972..ee8c327 100644
--- a/sound/synth/emux/emux_synth.c
+++ b/sound/synth/emux/emux_synth.c
@@ -629,6 +629,25 @@
 /*
  * calculate pitch parameter
  */
+static unsigned char pan_volumes[256] = {
+0x00,0x03,0x06,0x09,0x0c,0x0f,0x12,0x14,0x17,0x1a,0x1d,0x20,0x22,0x25,0x28,0x2a,
+0x2d,0x30,0x32,0x35,0x37,0x3a,0x3c,0x3f,0x41,0x44,0x46,0x49,0x4b,0x4d,0x50,0x52,
+0x54,0x57,0x59,0x5b,0x5d,0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6f,0x71,0x73,0x75,
+0x77,0x79,0x7b,0x7c,0x7e,0x80,0x82,0x84,0x86,0x88,0x89,0x8b,0x8d,0x8f,0x90,0x92,
+0x94,0x96,0x97,0x99,0x9a,0x9c,0x9e,0x9f,0xa1,0xa2,0xa4,0xa5,0xa7,0xa8,0xaa,0xab,
+0xad,0xae,0xaf,0xb1,0xb2,0xb3,0xb5,0xb6,0xb7,0xb9,0xba,0xbb,0xbc,0xbe,0xbf,0xc0,
+0xc1,0xc2,0xc3,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,
+0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdc,0xdd,0xde,0xdf,
+0xdf,0xe0,0xe1,0xe2,0xe2,0xe3,0xe4,0xe4,0xe5,0xe6,0xe6,0xe7,0xe8,0xe8,0xe9,0xe9,
+0xea,0xeb,0xeb,0xec,0xec,0xed,0xed,0xee,0xee,0xef,0xef,0xf0,0xf0,0xf1,0xf1,0xf1,
+0xf2,0xf2,0xf3,0xf3,0xf3,0xf4,0xf4,0xf5,0xf5,0xf5,0xf6,0xf6,0xf6,0xf7,0xf7,0xf7,
+0xf7,0xf8,0xf8,0xf8,0xf9,0xf9,0xf9,0xf9,0xf9,0xfa,0xfa,0xfa,0xfa,0xfb,0xfb,0xfb,
+0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
+0xfd,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+};
+
 static int
 calc_pan(snd_emux_voice_t *vp)
 {
@@ -646,6 +665,16 @@
 	}
 	LIMITVALUE(pan, 0, 255);
 
+#if 1
+	/* using volume table */
+	if (vp->apan != (int)pan_volumes[pan]) {
+		vp->apan = pan_volumes[pan];
+		vp->aaux = pan_volumes[255 - pan];
+		return 1;
+	}
+	return 0;
+#else
+	/* assuming linear volume */
 	if (pan != vp->apan) {
 		vp->apan = pan;
 		if (pan == 0)
@@ -655,6 +684,7 @@
 		return 1;
 	} else
 		return 0;
+#endif
 }