diff -ruP linux-2.4.22.orig/arch/sparc/kernel/sparc_ksyms.c linux-2.4.22/arch/sparc/kernel/sparc_ksyms.c
--- linux-2.4.22.orig/arch/sparc/kernel/sparc_ksyms.c	Fri Jun 13 16:51:32 2003
+++ linux-2.4.22/arch/sparc/kernel/sparc_ksyms.c	Mon Sep  1 08:10:05 2003
@@ -46,6 +46,7 @@
 #include <asm/sbus.h>
 #include <asm/dma.h>
 #endif
+#include <asm/ebus.h>
 #ifdef CONFIG_HIGHMEM
 #include <linux/highmem.h>
 #endif
@@ -198,6 +199,7 @@
 #endif
 #if CONFIG_PCI
 /* Actually, ioremap/iounmap are not PCI specific. But it is ok for drivers. */
+EXPORT_SYMBOL(ebus_chain);
 EXPORT_SYMBOL(ioremap);
 EXPORT_SYMBOL(iounmap);
 
diff -ruP linux-2.4.22.orig/drivers/sbus/audio/cs4231.c linux-2.4.22/drivers/sbus/audio/cs4231.c
--- linux-2.4.22.orig/drivers/sbus/audio/cs4231.c	Sat Aug  3 02:39:44 2002
+++ linux-2.4.22/drivers/sbus/audio/cs4231.c	Mon Sep  1 08:07:14 2003
@@ -35,7 +35,7 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/sbus.h>
-#if defined(CONFIG_PCI) && defined(CONFIG_SPARC64)
+#if defined(CONFIG_PCI) && (defined(CONFIG_SPARC64) || defined(CONFIG_SPARC32))
 #define EB4231_SUPPORT
 #include <asm/ebus.h>
 #include <asm/pbm.h>
@@ -44,8 +44,8 @@
 #include <asm/audioio.h>
 #include "cs4231.h"
 
-#undef __CS4231_DEBUG
-#undef __CS4231_TRACE
+#define __CS4231_DEBUG
+#define __CS4231_TRACE
 #define __CS4231_ERROR
 #ifdef __CS4231_ERROR
 #define eprintk(x) printk x
@@ -2283,17 +2283,32 @@
         }
 
         nregs = len / sizeof(regs[0]);
+
+#ifndef __sparc__
         cs4231_chip->regs = (unsigned long)ioremap(edev->resource[0].start, 0x10);
         cs4231_chip->eb2p = (unsigned long)ioremap(edev->resource[1].start, 0x10);
         cs4231_chip->eb2c = (unsigned long)ioremap(edev->resource[2].start, 0x10);
+#else
+	/* Uh oh... On sparc64 resources aren't mapped, but on sparc they are???
+	   and the eb2p, eb2c is missing from PROM too???
+	 */
+	cs4231_chip->regs = edev->resource[0].start;
+        cs4231_chip->eb2p = (unsigned long)ioremap(0x38800000 + 0x702000, 0x10);
+        cs4231_chip->eb2c = (unsigned long)ioremap(0x38800000 + 0x704000, 0x10);
+#endif
 
-        cs4231_chip->status |= CS_STATUS_IS_EBUS;
+	cs4231_chip->status |= CS_STATUS_IS_EBUS;
 
+#ifndef __sparc__
         /* Attach the interrupt handler to the audio interrupt. */
         cs4231_chip->irq = edev->irqs[0];
         cs4231_chip->irq2 = edev->irqs[1];
+#else
+        cs4231_chip->irq = 5; /* FIXME somewhere in the ebus.c ??*/
+        cs4231_chip->irq2 = 3; /* For some reason no interrupts are generated??? */
+#endif
 
-        if(request_irq(cs4231_chip->irq, eb4231_cinterrupt, SA_SHIRQ, "cs4231", drv) ||
+	if(request_irq(cs4231_chip->irq, eb4231_cinterrupt, SA_SHIRQ, "cs4231", drv) ||
            request_irq(cs4231_chip->irq2, eb4231_pinterrupt, SA_SHIRQ, "cs4231", drv))
                 goto bail;
 
@@ -2354,6 +2369,19 @@
                 compat[15] = '\0';
                 if (!strcmp(compat, "SUNW,CS4231"))
                         return 1;
+        }
+
+        /* Krups. For some reason the audio alias is not found??? */
+        if (!strcmp(edev->prom_name, "sound")) {
+                char compat[16];
+
+                prom_getstring(edev->prom_node, "compatible",
+                               compat, sizeof(compat));
+                compat[15] = '\0';
+                if (!strcmp(compat, "cs4231"))
+                        return 1;
+
+		return 1;
         }
 
         return 0;
