--- a/keyboard.c
+++ b/keyboard.c
@@ -21,7 +21,6 @@
 #include "keyboard.h"
 
 #ifdef __sparc__
-#include <asm/kbio.h>
 #include <asm/openpromio.h>
 #include <asm/types.h>
 #endif
@@ -96,7 +95,15 @@
   {0, 0}
 };
 
-#if !defined(__s390__) && !defined(__s390x__)
+#if defined(__sparc__)
+static int termcmp(struct termios *a, struct termios *b) 
+{
+        if (a->c_iflag != b->c_iflag || a->c_oflag != b->c_oflag ||
+            a->c_cflag != b->c_cflag || a->c_lflag != b->c_lflag)
+                return 1;
+        return memcmp(a->c_cc, b->c_cc, sizeof(a->c_cc));
+}
+#elif !defined(__s390__) && !defined(__s390x__)
 static int termcmp(struct termios *a, struct termios *b)
 {
 	if (a->c_iflag != b->c_iflag || a->c_oflag != b->c_oflag ||
@@ -110,150 +117,6 @@
 struct device *keyboardProbe(enum deviceClass probeClass, int probeFlags,
 			struct device *devlist)
 {
-#ifdef __sparc__
-	int fd;
-	char buf[256];
-	struct keyboardDevice *kbddev;
-	
-	if (probeClass & CLASS_KEYBOARD) {
-		static struct {
-		  int layout0, layout1, layout2;
-		  char *symbols;
-		  int use_iso9995_3;
-		} sunkbd_translate[] = {
-		  { 0, 33, 80, "",      0, },
-		  { 1, 34, 81, "",      0, },
-		  { 2, -1, -1, "fr_BE", 0, },
-		  { 3, -1, -1, "ca",    0, },
-		  { 4, 36, 83, "dk",    1, },
-		  { 5, 37, 84, "de",    1, },
-		  { 6, 38, 85, "it",    1, },
-		  { 7, 39, 86, "nl",    0, },
-		  { 8, 40, 87, "no",    1, },
-		  { 9, 41, 88, "pt",    1, },
-		  { 10, 42, 89, "es",   1, },
-		  { 11, 43, 90, "se",   1, },
-		  { 12, 44, 91, "fr_CH",1, },
-		  { 13, 45, 92, "de_CH",1, },
-		  { 14, 46, 93, "gb",   1, },
-		  { 16, 47, 94, "ko",   0, },
-		  { 17, 48, 95, "tw",   0, },
-		  { 32, 49, 96, "jp",   0, },
-		  { 50, 97, -1, "fr_CA",0, },
-		  { 51, -1, -1, "hu",   0, },
-		  { 52, -1, -1, "pl",   0, },
-		  { 53, -1, -1, "cs",   0, },
-		  { 54, -1, -1, "ru",   0, },
-		  { -1, -1, -1, NULL,   0, }
-		};
-
-		char twelve = 12;
-		int fdstd = 0;
-		char buf[4096];
-
-		for (fd = 0; fd <= 2; fd++) {
-		    sprintf (buf, "/proc/self/fd/%d", fd);
-		    if (readlink (buf, buf, 4096) == 12 &&
-			!strncmp (buf, "/dev/console", 12)) {
-			fdstd = 1;
-			break;
-		    }
-		}
-		if (!fdstd) {
-		    fd = open("/dev/console", O_RDWR);
-		    if (fd < 0) return devlist;
-		}
-		
-		kbddev=keyboardNewDevice(NULL);
-		kbddev->type=CLASS_KEYBOARD;
-		if (devlist)
-			kbddev->next = devlist;
-		devlist = (struct device *) kbddev;
-
-		if (ioctl (fd, TIOCLINUX, &twelve) < 0) {
-			/* Serial console */
-			char desc[64];
-			struct serial_struct si;
-			int line = 0;
-
-			if (ioctl (fd, TIOCGSERIAL, &si) >= 0) {
-			    if (si.line & 1)
-				/* ttyb */
-				line = 1;
-			}
-			if (!fdstd) close(fd);
-			sprintf (desc, "Serial console tty%c", line + 'a');
-			fd = open("/dev/openprom", O_RDONLY);
-			if (fd >= 0) {
-				struct openpromio *op = (struct openpromio *)buf;
-				sprintf (op->oprom_array, "tty%c-mode", line + 'a');
-				op->oprom_size = 4096-128-4;
-				if (ioctl (fd, OPROMGETOPT, op) >= 0 &&
-				    op->oprom_size > 0 && op->oprom_size < 40) {
-					strcat (desc, " ");
-					op->oprom_array [op->oprom_size] = 0;
-					strcat (desc, op->oprom_array);
-				}
-				close (fd);
-			}
-			kbddev->desc=strdup(desc);
-			kbddev->device=strdup("console");
-			return devlist;
-		}
-
-		if (!fdstd) close(fd);
-		fd=open("/dev/kbd", O_RDWR);
-		if (fd < 0) {
-			/* PS/2 keyboard */
-			kbddev->desc=strdup("Generic PS/2 Keyboard");
-		} else {
-			/* Sun keyboard */
-			int kbdtype, kbdlayout, i;
-			char *desc, *desclayout = NULL;
-
-			kbddev->device=strdup("kbd");
-			desc = "Sun Type4 ";
-			if (ioctl(fd, KIOCTYPE, &kbdtype) >= 0)
-				switch (kbdtype) {
-				case 2: desc = "Sun Type2 "; break;
-				case 3: desc = "Sun Type3 "; break;
-				case 4: ioctl(fd, KIOCLAYOUT, &kbdlayout);
-					if (kbdlayout < 33)
-						desc = "Sun Type4 ";
-					else switch (kbdlayout) {
-					case 33: case 47: case 48: case 49:
-					case 80: case 94: case 95: case 96:
-						desc = "Sun Type5 "; break;
-					case 34: case 81:
-						desc = "Sun Type5 Unix "; break;
-					default:
-						desc = "Sun Type5 Euro "; break;
-					}
-					for (i = 0; sunkbd_translate[i].layout0 != -1; i++) {
-						if (sunkbd_translate[i].layout0 == kbdlayout ||
-						    sunkbd_translate[i].layout1 == kbdlayout ||
-						    sunkbd_translate[i].layout2 == kbdlayout)
-						break;
-					}
-					if (sunkbd_translate[i].layout0 != -1 &&
-					    sunkbd_translate[i].symbols[0])
-						desclayout = sunkbd_translate[i].symbols;
-					break;
-				}
-			if (desclayout) {
-				kbddev->desc = malloc(strlen(desc) + strlen(desclayout) + 1 + strlen("Keyboard") + 1);
-				strcpy (kbddev->desc, desc);
-				strcat (kbddev->desc, desclayout);
-				strcat (kbddev->desc, " Keyboard");
-			} else {
-				kbddev->desc = malloc(strlen(desc) + strlen("Keyboard") + 1);
-				strcpy (kbddev->desc, desc);
-				strcat (kbddev->desc, "Keyboard");
-			}
-		}
-		close (fd);
-	}
-#else
 	int fd;
 	char twelve = 12;
 	int fdstd = 0;
@@ -311,7 +174,7 @@
 			kbddev->device = strdup("ttySG0");
 		}
 #endif
-#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
+#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) || defined(__sparc__)
 		int cfd;
 		struct termios cmode, mode;
 
@@ -397,7 +260,6 @@
 			kbddev->device=strdup(desc);
 		}
 	}
-#endif
 out:
 	return devlist;
 }
