diff -urN oldtree/drivers/input/Kconfig newtree/drivers/input/Kconfig
--- oldtree/drivers/input/Kconfig	2006-09-17 05:38:20.000000000 -0400
+++ newtree/drivers/input/Kconfig	2006-09-17 07:15:40.000000000 -0400
@@ -100,6 +100,21 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called joydev.
 
+config INPUT_JOYDEV_ANALOGTODIGITAL
+	bool "Analog to Digital [fix for the Joy Axis Problem]"
+	depends on INPUT_JOYDEV
+	default "n"
+	---help---
+	  Say Y here if you want the moves of analog axis to be transferred
+	  into digital presses. It it useful when you own an USB
+	  GameConsole->PC converter suffering from the Joy Axis problem. This
+	  is a mainly fix for dancing mats, if they are detected as analogs
+	  the opposite directional buttons cannot be pressed, this fixes
+	  the problem by simulating the digital behaviour aside from the
+	  standard one.
+	  
+	  If unsure, say N.
+
 config INPUT_TSDEV
 	tristate "Touchscreen interface"
 	---help---
diff -urN oldtree/drivers/input/joydev.c newtree/drivers/input/joydev.c
--- oldtree/drivers/input/joydev.c	2006-09-17 05:38:20.000000000 -0400
+++ newtree/drivers/input/joydev.c	2006-09-17 07:15:44.000000000 -0400
@@ -86,6 +86,28 @@
 
 static void joydev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
 {
+#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL
+
+	#define JOYDEV_LOW      0
+	#define JOYDEV_MID      127
+	#define JOYDEV_BOTH     128
+	#define JOYDEV_HIGH     255
+	#define JOYDEV_UP       24
+	#define JOYDEV_RIGHT    25
+	#define JOYDEV_DOWN     26
+	#define JOYDEV_LEFT     27
+
+ 	/* for converters supporting 2 pads at a time */
+	#define JOYDEV2_UP       28
+	#define JOYDEV2_RIGHT    29
+	#define JOYDEV2_DOWN     30
+	#define JOYDEV2_LEFT     31
+
+	static int lastLeftRight = JOYDEV_MID, lastLeftRight2 = JOYDEV_MID;
+	static int lastUpDown = JOYDEV_MID, lastUpDown2 = JOYDEV_MID;
+	struct js_event event2, event3;
+	char omitanalog = 0;
+#endif
 	struct joydev *joydev = handle->private;
 	struct joydev_list *list;
 	struct js_event event;
@@ -99,34 +121,368 @@
 			event.number = joydev->keymap[code - BTN_MISC];
 			event.value = value;
 			break;
-
 		case EV_ABS:
 			event.type = JS_EVENT_AXIS;
 			event.number = joydev->absmap[code];
 			event.value = joydev_correct(value, joydev->corr + event.number);
 			if (event.value == joydev->abs[event.number])
+#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL
+				omitanalog = 1;
+#else
 				return;
+#endif
 			joydev->abs[event.number] = event.value;
-			break;
+#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL
+			event2.type = JS_EVENT_BUTTON;
+			event3.type = JS_EVENT_BUTTON;
+			event3.number = 0;
+
+			event2.number = joydev->absmap[code];
+
+			if(event2.number == 0) { // Left-Right
+				if(value == JOYDEV_LOW) {
+					if(lastLeftRight == JOYDEV_MID) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight == JOYDEV_BOTH) {
+						event2.number = JOYDEV_RIGHT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight == JOYDEV_HIGH) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 1;
+						event3.number = JOYDEV_RIGHT;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_MID) {
+					if(lastLeftRight == JOYDEV_LOW) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight == JOYDEV_HIGH) {
+						event2.number = JOYDEV_RIGHT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight == JOYDEV_BOTH) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 0;
+						event3.number = JOYDEV_RIGHT;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_BOTH) {
+					if(lastLeftRight == JOYDEV_LOW) {						
+						event2.number = JOYDEV_RIGHT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight == JOYDEV_HIGH) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight == JOYDEV_MID) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 1;
+						event3.number = JOYDEV_RIGHT;
+						event3.value = 1;
+					}
+				}
+				else if(value == JOYDEV_HIGH) {
+					if(lastLeftRight == JOYDEV_MID) {
+						event2.number = JOYDEV_RIGHT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight == JOYDEV_BOTH) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight == JOYDEV_LOW) {
+						event2.number = JOYDEV_LEFT;
+						event2.value = 0;
+						event3.number = JOYDEV_RIGHT;
+						event3.value = 1;
+					}
+				}
+				else {
+					printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value);
+				}
+				lastLeftRight = value;
+			}
+			else if(event2.number == 4) { // Left-Right for 2nd pad
+				if(value == JOYDEV_LOW) {
+					if(lastLeftRight2 == JOYDEV_MID) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight2 == JOYDEV_BOTH) {
+						event2.number = JOYDEV2_RIGHT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight2 == JOYDEV_HIGH) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 1;
+						event3.number = JOYDEV2_RIGHT;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_MID) {
+					if(lastLeftRight2 == JOYDEV_LOW) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight2 == JOYDEV_HIGH) {
+						event2.number = JOYDEV2_RIGHT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight2 == JOYDEV_BOTH) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 0;
+						event3.number = JOYDEV2_RIGHT;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_BOTH) {
+					if(lastLeftRight2 == JOYDEV_LOW) {						
+						event2.number = JOYDEV2_RIGHT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight2 == JOYDEV_HIGH) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight2 == JOYDEV_MID) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 1;
+						event3.number = JOYDEV2_RIGHT;
+						event3.value = 1;
+					}
+				}
+				else if(value == JOYDEV_HIGH) {
+					if(lastLeftRight2 == JOYDEV_MID) {
+						event2.number = JOYDEV2_RIGHT;
+						event2.value = 1;
+					}
+					else if(lastLeftRight2 == JOYDEV_BOTH) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 0;
+					}
+					else if(lastLeftRight2 == JOYDEV_LOW) {
+						event2.number = JOYDEV2_LEFT;
+						event2.value = 0;
+						event3.number = JOYDEV2_RIGHT;
+						event3.value = 1;
+					}
+				}
+				else {
+					printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value);
+				}
+				lastLeftRight2 = value;
+			}
+			else if(event2.number == 1) { // Up-Down
+				if(value == JOYDEV_LOW) {
+					if(lastUpDown == JOYDEV_MID) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 1;
+					}
+					else if(lastUpDown == JOYDEV_BOTH) {
+						event2.number = JOYDEV_UP;
+						event2.value = 0;
+					}
+					else if(lastUpDown == JOYDEV_HIGH) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 1;
+						event3.number = JOYDEV_UP;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_MID) {
+					if(lastUpDown == JOYDEV_LOW) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 0;
+					} 
+					else if(lastUpDown == JOYDEV_HIGH) {
+						event2.number = JOYDEV_UP;
+						event2.value = 0;
+					}
+					else if(lastUpDown == JOYDEV_BOTH) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 0;
+						event3.number = JOYDEV_UP;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_BOTH) {
+					if(lastUpDown == JOYDEV_LOW) {
+						event2.number = JOYDEV_UP;
+						event2.value = 1;
+					}
+					else if(lastUpDown == JOYDEV_HIGH) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 1;
+					}
+					else if(lastUpDown == JOYDEV_MID) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 1;
+						event3.number = JOYDEV_UP;
+						event3.value = 1;
+					}
+				}
+				else if(value == JOYDEV_HIGH) {
+					if(lastUpDown == JOYDEV_MID) {
+						event2.number = JOYDEV_UP;
+						event2.value = 1;
+					}
+					else if(lastUpDown == JOYDEV_BOTH) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 0;
+					}
+					else if(lastUpDown == JOYDEV_LOW) {
+						event2.number = JOYDEV_DOWN;
+						event2.value = 0;
+						event3.number = JOYDEV_UP;
+						event3.value = 1;
+					}
+				}				
+				else {
+					printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value);
+				}
+				lastUpDown = value;
+			}
+			else if(event2.number == 7) { // Up-Down for 2nd pad
+				if(value == JOYDEV_LOW) {
+					if(lastUpDown2 == JOYDEV_MID) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 1;
+					}
+					else if(lastUpDown2 == JOYDEV_BOTH) {
+						event2.number = JOYDEV2_UP;
+						event2.value = 0;
+					}
+					else if(lastUpDown2 == JOYDEV_HIGH) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 1;
+						event3.number = JOYDEV2_UP;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_MID) {
+					if(lastUpDown2 == JOYDEV_LOW) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 0;
+					} 
+					else if(lastUpDown2 == JOYDEV_HIGH) {
+						event2.number = JOYDEV2_UP;
+						event2.value = 0;
+					}
+					else if(lastUpDown2 == JOYDEV_BOTH) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 0;
+						event3.number = JOYDEV2_UP;
+						event3.value = 0;
+					}
+				}
+				else if(value == JOYDEV_BOTH) {
+					if(lastUpDown2 == JOYDEV_LOW) {
+						event2.number = JOYDEV2_UP;
+						event2.value = 1;
+					}
+					else if(lastUpDown2 == JOYDEV_HIGH) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 1;
+					}
+					else if(lastUpDown2 == JOYDEV_MID) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 1;
+						event3.number = JOYDEV2_UP;
+						event3.value = 1;
+					}
+				}
+				else if(value == JOYDEV_HIGH) {
+					if(lastUpDown2 == JOYDEV_MID) {
+						event2.number = JOYDEV2_UP;
+						event2.value = 1;
+					}
+					else if(lastUpDown2 == JOYDEV_BOTH) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 0;
+					}
+					else if(lastUpDown2 == JOYDEV_LOW) {
+						event2.number = JOYDEV2_DOWN;
+						event2.value = 0;
+						event3.number = JOYDEV2_UP;
+						event3.value = 1;
+					}
+				}
+				else {
+					printk("joydev: value %i != {0,127,128,255} - controller not supported\n", value);
+				}
+				lastUpDown2 = value;
+			}
+			else {
+				printk("joydev: not standard axis %i - controller not supported\n", event.number);
+				break;
+			}
 
+			event2.time = jiffies_to_msecs(jiffies);
+			list_for_each_entry(list, &joydev->list, node) {
+				memcpy(list->buffer + list->head, &event2, sizeof(struct js_event));
+
+				if (list->startup == joydev->nabs + joydev->nkey)
+					if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1)))
+						list->startup = 0;
+				kill_fasync(&list->fasync, SIGIO, POLL_IN);
+			}
+
+			if(event3.number != 0)
+			{
+				event3.time = event2.time;
+				list_for_each_entry(list, &joydev->list, node) {
+					memcpy(list->buffer + list->head, &event3, sizeof(struct js_event));
+
+					if (list->startup == joydev->nabs + joydev->nkey)
+						if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1)))
+							list->startup = 0;
+					kill_fasync(&list->fasync, SIGIO, POLL_IN);
+				}
+			}
+#endif
+			break;
 		default:
 			return;
 	}
+#ifdef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL
+	if(!omitanalog)
+	{
+		event.time = jiffies_to_msecs(jiffies);
+		list_for_each_entry(list, &joydev->list, node) {
 
-	event.time = jiffies_to_msecs(jiffies);
+			memcpy(list->buffer + list->head, &event, sizeof(struct js_event));
 
-	list_for_each_entry(list, &joydev->list, node) {
+			if (list->startup == joydev->nabs + joydev->nkey)
+				if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1)))
+					list->startup = 0;
+			kill_fasync(&list->fasync, SIGIO, POLL_IN);
+		}
+	}
+	wake_up_interruptible(&joydev->wait);
+#endif
+#ifndef CONFIG_INPUT_JOYDEV_ANALOGTODIGITAL
+        event.time = jiffies_to_msecs(jiffies);
 
-		memcpy(list->buffer + list->head, &event, sizeof(struct js_event));
+        list_for_each_entry(list, &joydev->list, node) {
 
-		if (list->startup == joydev->nabs + joydev->nkey)
-			if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1)))
-				list->startup = 0;
+                memcpy(list->buffer + list->head, &event, sizeof(struct js_event));
 
-		kill_fasync(&list->fasync, SIGIO, POLL_IN);
-	}
+                if (list->startup == joydev->nabs + joydev->nkey)
+                        if (list->tail == (list->head = (list->head + 1) & (JOYDEV_BUFFER_SIZE - 1)))
+                                list->startup = 0;
 
-	wake_up_interruptible(&joydev->wait);
+                kill_fasync(&list->fasync, SIGIO, POLL_IN);
+        }
+
+        wake_up_interruptible(&joydev->wait);
+#endif
 }
 
 static int joydev_fasync(int fd, struct file *file, int on)
@@ -541,6 +897,10 @@
 	sysfs_create_link(&input_class.subsys.kset.kobj, &cdev->kobj,
 			  joydev->name);
 
+	printk("Podlaczamy joya: %i klawiszy\n", joydev->nkey);
+
+	joydev->nkey = 32; // hack for broken psx adaptors to work properly with dance mats
+
 	return &joydev->handle;
 }
 
Files oldtree/scripts/kconfig/mconf and newtree/scripts/kconfig/mconf differ
