public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Hanna Linder <hannal@us.ibm.com>
To: Pavel Machek <pavel@ucw.cz>
Cc: Hanna Linder <hannal@us.ibm.com>, Greg KH <greg@kroah.com>,
	Martin Schlemmer <azarah@nosferatu.za.org>,
	Adrian Bunk <bunk@fs.tum.de>, Andrew Morton <akpm@osdl.org>,
	Linux Kernel Mailing Lists <linux-kernel@vger.kernel.org>
Subject: Re: driver model for inputs
Date: Thu, 20 Nov 2003 15:18:37 -0800	[thread overview]
Message-ID: <56710000.1069370317@w-hlinder> (raw)
In-Reply-To: <20031120225504.GG196@elf.ucw.cz>

--On Thursday, November 20, 2003 11:55:04 PM +0100 Pavel Machek <pavel@ucw.cz> wrote:

> If you could post -test8 version, that would be great.
> 									Pavel

It is actually test5. Ive been working on multiple sysfs patches, the parport one is test8. 
Ill get started on this one again and send out a cleaned up test9 version in a bit. This 
one is pretty ugly because it's got lots of printks in it. I was going to break it up before
submitting it too. But here ya go...

Hanna

---
diff -Nrup -Xdontdiff linux-2.6.0-test5/Makefile linux-260t5-ic/Makefile
--- linux-2.6.0-test5/Makefile	Mon Sep  8 12:50:12 2003
+++ linux-260t5-ic/Makefile	Thu Sep 11 11:39:16 2003
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 0
-EXTRAVERSION = -test5
+EXTRAVERSION = -test5ic
 
 # *DOCUMENTATION*
 # To see a list of typical targets execute "make help"
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/base/bus.c linux-260t5-ic/drivers/base/bus.c
--- linux-2.6.0-test5/drivers/base/bus.c	Mon Sep  8 12:49:58 2003
+++ linux-260t5-ic/drivers/base/bus.c	Wed Sep 10 15:02:46 2003
@@ -8,7 +8,7 @@
  *
  */
 
-#undef DEBUG
+#define DEBUG
 
 #include <linux/device.h>
 #include <linux/module.h>
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/base/class.c linux-260t5-ic/drivers/base/class.c
--- linux-2.6.0-test5/drivers/base/class.c	Mon Sep  8 12:50:41 2003
+++ linux-260t5-ic/drivers/base/class.c	Wed Sep 10 15:02:46 2003
@@ -10,7 +10,7 @@
  *
  */
 
-#undef DEBUG
+#define DEBUG
 
 #include <linux/device.h>
 #include <linux/module.h>
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/base/core.c linux-260t5-ic/drivers/base/core.c
--- linux-2.6.0-test5/drivers/base/core.c	Mon Sep  8 12:49:52 2003
+++ linux-260t5-ic/drivers/base/core.c	Wed Sep 10 15:02:46 2003
@@ -8,7 +8,7 @@
  *
  */
 
-#undef DEBUG
+#define DEBUG
 
 #include <linux/device.h>
 #include <linux/err.h>
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/evdev.c linux-260t5-ic/drivers/input/evdev.c
--- linux-2.6.0-test5/drivers/input/evdev.c	Mon Sep  8 12:50:18 2003
+++ linux-260t5-ic/drivers/input/evdev.c	Wed Sep 10 15:02:46 2003
@@ -27,7 +27,7 @@ struct evdev {
 	int open;
 	int minor;
 	char name[16];
-	struct input_handle handle;
+	struct input_handle *handle;
 	wait_queue_head_t wait;
 	struct evdev_list *grab;
 	struct list_head list;
@@ -86,12 +86,13 @@ static int evdev_flush(struct file * fil
 {
 	struct evdev_list *list = file->private_data;
 	if (!list->evdev->exist) return -ENODEV;
-	return input_flush_device(&list->evdev->handle, file);
+	return input_flush_device(list->evdev->handle, file);
 }
 
 static void evdev_free(struct evdev *evdev)
 {
-	devfs_remove("input/event%d", evdev->minor);
+printk(KERN_WARNING "in evdev_free\n");
+	//input_unregister_class_dev(intf.name, evdev->minor);
 	evdev_table[evdev->minor] = NULL;
 	kfree(evdev);
 }
@@ -99,9 +100,10 @@ static void evdev_free(struct evdev *evd
 static int evdev_release(struct inode * inode, struct file * file)
 {
 	struct evdev_list *list = file->private_data;
+printk(KERN_WARNING "in evdev_release \n");
 
 	if (list->evdev->grab == list) {
-		input_release_device(&list->evdev->handle);
+		input_release_device(list->evdev->handle);
 		list->evdev->grab = NULL;
 	}
 
@@ -110,9 +112,11 @@ static int evdev_release(struct inode * 
 
 	if (!--list->evdev->open) {
 		if (list->evdev->exist)
-			input_close_device(&list->evdev->handle);
-		else
+			input_close_device(list->evdev->handle);
+		else{
+	//		input_unregister_class_dev(intf.name, list->evdev->minor);
 			evdev_free(list->evdev);
+		}
 	}
 
 	kfree(list);
@@ -141,7 +145,7 @@ static int evdev_open(struct inode * ino
 
 	if (!list->evdev->open++)
 		if (list->evdev->exist)
-			input_open_device(&list->evdev->handle);
+			input_open_device(list->evdev->handle);
 
 	return 0;
 }
@@ -158,7 +162,7 @@ static ssize_t evdev_write(struct file *
 
 		if (copy_from_user(&event, buffer + retval, sizeof(struct input_event)))
 			return -EFAULT;
-		input_event(list->evdev->handle.dev, event.type, event.code, event.value);
+		input_event(list->evdev->handle->dev, event.type, event.code, event.value);
 		retval += sizeof(struct input_event);
 	}
 
@@ -206,7 +210,7 @@ static int evdev_ioctl(struct inode *ino
 {
 	struct evdev_list *list = file->private_data;
 	struct evdev *evdev = list->evdev;
-	struct input_dev *dev = evdev->handle.dev;
+	struct input_dev *dev = evdev->handle->dev;
 	struct input_absinfo abs;
 	int i, t, u;
 
@@ -278,14 +282,14 @@ static int evdev_ioctl(struct inode *ino
 			if (arg) {
 				if (evdev->grab)
 					return -EBUSY;
-				if (input_grab_device(&evdev->handle))
+				if (input_grab_device(evdev->handle))
 					return -EBUSY;
 				evdev->grab = list;
 				return 0;
 			} else {
 				if (evdev->grab != list)
 					return -EINVAL;
-				input_release_device(&evdev->handle);
+				input_release_device(evdev->handle);
 				evdev->grab = NULL;
 				return 0;
 			}
@@ -408,10 +412,17 @@ static struct file_operations evdev_fops
 	.flush =	evdev_flush
 };
 
+static struct input_class_interface intf = {
+	.name = 	"input/event%d",
+	.mode = 	S_IFCHR | S_IRUGO | S_IWUSR,
+	.minor_base = 	EVDEV_MINOR_BASE,
+};
+
 static struct input_handle *evdev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id)
 {
 	struct evdev *evdev;
 	int minor;
+printk(KERN_WARNING "in evdev_connect\n");
 
 	for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++);
 	if (minor == EVDEV_MINORS) {
@@ -423,36 +434,43 @@ static struct input_handle *evdev_connec
 		return NULL;
 	memset(evdev, 0, sizeof(struct evdev));
 
+	if (!(evdev->handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
+		return NULL;
+	memset(evdev->handle, 0, sizeof(struct input_handle));
+
 	INIT_LIST_HEAD(&evdev->list);
 	init_waitqueue_head(&evdev->wait);
 
 	evdev->exist = 1;
 	evdev->minor = minor;
-	evdev->handle.dev = dev;
-	evdev->handle.name = evdev->name;
-	evdev->handle.handler = handler;
-	evdev->handle.private = evdev;
+	evdev->handle->dev = dev;
+	evdev->handle->name = evdev->name;
+	evdev->handle->handler = handler;
+	evdev->handle->private = evdev;
 	sprintf(evdev->name, "event%d", minor);
 
 	evdev_table[minor] = evdev;
 
-	devfs_mk_cdev(MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor),
-			S_IFCHR|S_IRUGO|S_IWUSR, "input/event%d", minor);
+	intf.minor = minor;
+//	input_register_class_dev(dev, &intf);
 
-	return &evdev->handle;
+	return evdev->handle;
 }
 
 static void evdev_disconnect(struct input_handle *handle)
 {
 	struct evdev *evdev = handle->private;
+printk(KERN_WARNING "in evdev_disconnect\n");
 
 	evdev->exist = 0;
 
 	if (evdev->open) {
 		input_close_device(handle);
 		wake_up_interruptible(&evdev->wait);
-	} else
+	} else {
+//		input_unregister_class_dev(intf.name, evdev->minor);
 		evdev_free(evdev);
+	}
 }
 
 static struct input_device_id evdev_ids[] = {
@@ -474,13 +492,17 @@ static struct input_handler evdev_handle
 
 static int __init evdev_init(void)
 {
+printk(KERN_WARNING "in evdev_init\n");
 	input_register_handler(&evdev_handler);
+	input_register_class_dev(dev, &intf);
 	return 0;
 }
 
 static void __exit evdev_exit(void)
 {
+printk(KERN_WARNING "in evdev_exit \n");
 	input_unregister_handler(&evdev_handler);
+	input_unregister_class_dev(intf.name, evdev->minor);
 }
 
 module_init(evdev_init);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/input.c linux-260t5-ic/drivers/input/input.c
--- linux-2.6.0-test5/drivers/input/input.c	Mon Sep  8 12:50:06 2003
+++ linux-260t5-ic/drivers/input/input.c	Fri Sep 12 14:55:49 2003
@@ -33,6 +33,10 @@ EXPORT_SYMBOL(input_register_device);
 EXPORT_SYMBOL(input_unregister_device);
 EXPORT_SYMBOL(input_register_handler);
 EXPORT_SYMBOL(input_unregister_handler);
+EXPORT_SYMBOL(input_register_class_dev);
+EXPORT_SYMBOL(input_unregister_class_dev);
+EXPORT_SYMBOL(input_dev_get);
+EXPORT_SYMBOL(input_dev_put);
 EXPORT_SYMBOL(input_grab_device);
 EXPORT_SYMBOL(input_release_device);
 EXPORT_SYMBOL(input_open_device);
@@ -217,6 +221,7 @@ int input_grab_device(struct input_handl
 
 void input_release_device(struct input_handle *handle)
 {
+printk(KERN_WARNING "in input_release_device\n");
 	if (handle->dev->grab == handle)
 		handle->dev->grab = NULL;
 }
@@ -678,10 +683,120 @@ static int input_handlers_read(char *buf
 
 #endif
 
+#define to_input_dev(d) container_of(d, struct input_dev, class_dev)
+
+static ssize_t show_dev (struct class_device *class_dev, char *buf)
+{
+	struct input_dev *dev = to_input_dev(class_dev);
+	dev_t base;
+
+	base = MKDEV(INPUT_MAJOR, dev->minor);
+	return sprintf(buf, "%04x\n", base + 32 );
+}
+static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL);
+
+static void release_class_dev(struct class_device *class_dev)
+{
+
+	struct input_dev *dev = to_input_dev(class_dev);
+printk(KERN_WARNING "in release_class_dev\n");
+	if(dev)
+		kfree(dev);
+}
+
 struct class input_class = {
 	.name		= "input",
+	.release	= &release_class_dev,
 };
 
+struct input_dev * input_dev_get(struct input_dev *dev)
+{
+	struct class_device *tmp;
+
+	if(!dev)
+		return NULL;
+
+	tmp = class_device_get(&dev->class_dev);
+	if(tmp)
+		return to_input_dev(tmp);
+	else
+		return NULL;
+}
+
+void input_dev_put(struct input_dev *dev)
+{
+	if(dev)
+		class_device_put(&dev->class_dev);
+}
+
+void input_register_class_dev(struct input_dev *dev, struct input_class_interface *intf)
+{
+	char sysfs_name[16];
+	int err;
+	char *input_name = NULL;
+
+printk(KERN_WARNING "in input_register_class_dev\n");
+
+	devfs_mk_cdev(MKDEV(INPUT_MAJOR, intf->minor_base + intf->minor), intf->mode, intf->name, intf->minor);
+
+	sprintf(sysfs_name, intf->name, intf->minor);
+
+	input_name = strchr(sysfs_name, '/');
+	if(input_name)
+		++input_name;
+	else
+	input_name = sysfs_name;
+	memset(&dev->class_dev, 0x00, sizeof(struct class_device));
+	dev->class_dev.class = &input_class;
+	dev->class_dev.dev = NULL;
+	snprintf(dev->class_dev.class_id, BUS_ID_SIZE, "%s", input_name);
+	err = class_device_register(&dev->class_dev);
+	if (err)	
+		goto error;
+	class_device_create_file(&dev->class_dev, &class_device_attr_dev);
+	dev->minor = intf->minor;
+printk(KERN_WARNING "in input_register_class_dev setting minor to: %d\n",dev->minor);
+	list_add(&dev->node, &input_dev_list);
+	return;
+error:
+printk(KERN_WARNING "in input_register_class_dev error registering class dev: \n");
+	kfree(input_name);
+	return;
+}
+
+void input_unregister_class_dev(char *name, unsigned minor)
+{
+	struct input_dev *dev = NULL;
+	struct list_head *tmp;
+	char tmp_name[DEVICE_NAME_SIZE];
+	int found = 0;
+
+	snprintf(tmp_name, DEVICE_NAME_SIZE, name, minor);
+	devfs_remove(tmp_name, minor);
+
+printk(KERN_WARNING "in input_unregister_class_dev \n");
+
+	list_for_each (tmp, &input_dev_list) {
+
+		dev = list_entry(tmp, struct input_dev, node);
+printk(KERN_WARNING "dev name in unregister is: %s\n",dev->name);
+		if (dev->minor == minor) {
+			found = 1;
+			break;
+		}
+		else{
+printk(KERN_WARNING "given minor: %d dne dev->minor: %d\n",minor,dev->minor);
+		}
+	}
+	if(found) {
+printk(KERN_WARNING "found in input_dev_list minor is: %d \n",dev->minor);
+		list_del(&dev->node);
+		class_device_unregister(&dev->class_dev);
+//              kfree(dev);
+//              input_dev_put(dev);
+	}
+}
+
 static int __init input_init(void)
 {
 	struct proc_dir_entry *entry;
@@ -730,6 +845,7 @@ static int __init input_init(void)
 
 static void __exit input_exit(void)
 {
+printk(KERN_WARNING "in input_exit\n");
 #ifdef CONFIG_PROC_FS
 	remove_proc_entry("devices", proc_bus_input_dir);
 	remove_proc_entry("handlers", proc_bus_input_dir);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/joydev.c linux-260t5-ic/drivers/input/joydev.c
--- linux-2.6.0-test5/drivers/input/joydev.c	Mon Sep  8 12:50:06 2003
+++ linux-260t5-ic/drivers/input/joydev.c	Wed Sep 10 15:02:46 2003
@@ -143,7 +143,7 @@ static int joydev_fasync(int fd, struct 
 
 static void joydev_free(struct joydev *joydev)
 {
-	devfs_remove("js%d", joydev->minor);
+	//input_unregister_class_dev(intf.name, joydev->minor);
 	joydev_table[joydev->minor] = NULL;
 	kfree(joydev);
 }
@@ -159,8 +159,10 @@ static int joydev_release(struct inode *
 	if (!--list->joydev->open) {
 		if (list->joydev->exist)
 			input_close_device(&list->joydev->handle);
-		else
+		else{
+	//		input_unregister_class_dev(intf.name, list->joydev->minor);
 			joydev_free(list->joydev);
+		}
 	}
 
 	kfree(list);
@@ -375,6 +377,12 @@ static struct file_operations joydev_fop
 	.fasync =	joydev_fasync,
 };
 
+static struct input_class_interface intf = {
+	.name = 	"js%d",
+	.mode = 	S_IFCHR | S_IRUGO | S_IWUSR,
+	.minor_base = 	JOYDEV_MINOR_BASE,
+};
+
 static struct input_handle *joydev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id)
 {
 	struct joydev *joydev;
@@ -445,9 +453,9 @@ static struct input_handle *joydev_conne
 	}
 
 	joydev_table[minor] = joydev;
-	
-	devfs_mk_cdev(MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor),
-			S_IFCHR|S_IRUGO|S_IWUSR, "js%d", minor);
+
+	intf.minor = minor;
+	//input_register_class_dev(dev, &intf); 	
 
 	return &joydev->handle;
 }
@@ -460,8 +468,10 @@ static void joydev_disconnect(struct inp
 
 	if (joydev->open)
 		input_close_device(handle);	
-	else
+	else{
+		//input_unregister_class_dev(intf.name, joydev->minor);
 		joydev_free(joydev);
+	}
 }
 
 static struct input_device_id joydev_ids[] = {
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/mouse/logips2pp.c linux-260t5-ic/drivers/input/mouse/logips2pp.c
--- linux-2.6.0-test5/drivers/input/mouse/logips2pp.c	Mon Sep  8 12:50:08 2003
+++ linux-260t5-ic/drivers/input/mouse/logips2pp.c	Wed Sep 10 15:02:46 2003
@@ -19,7 +19,7 @@
 
 void ps2pp_process_packet(struct psmouse *psmouse)
 {
-	struct input_dev *dev = &psmouse->dev;
+	struct input_dev *dev = psmouse->dev;
         unsigned char *packet = psmouse->packet;
 
 	if ((packet[0] & 0x48) == 0x48 && (packet[1] & 0x02) == 0x02) {
@@ -155,9 +155,9 @@ int ps2pp_detect_model(struct psmouse *p
 	psmouse->model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78);
 
 	if (param[1] < 3)
-		clear_bit(BTN_MIDDLE, psmouse->dev.keybit);
+		clear_bit(BTN_MIDDLE, psmouse->dev->keybit);
 	if (param[1] < 2)
-		clear_bit(BTN_RIGHT, psmouse->dev.keybit);
+		clear_bit(BTN_RIGHT, psmouse->dev->keybit);
 
 	psmouse->type = PSMOUSE_PS2;
 
@@ -169,21 +169,21 @@ int ps2pp_detect_model(struct psmouse *p
 
 		for (i = 0; logitech_4btn[i] != -1; i++)
 			if (logitech_4btn[i] == psmouse->model)
-				set_bit(BTN_SIDE, psmouse->dev.keybit);
+				set_bit(BTN_SIDE, psmouse->dev->keybit);
 
 		for (i = 0; logitech_wheel[i] != -1; i++)
 			if (logitech_wheel[i] == psmouse->model) {
-				set_bit(REL_WHEEL, psmouse->dev.relbit);
+				set_bit(REL_WHEEL, psmouse->dev->relbit);
 				psmouse->name = "Wheel Mouse";
 			}
 
 		for (i = 0; logitech_mx[i] != -1; i++)
 			if (logitech_mx[i]  == psmouse->model) {
-				set_bit(BTN_SIDE, psmouse->dev.keybit);
-				set_bit(BTN_EXTRA, psmouse->dev.keybit);
-				set_bit(BTN_BACK, psmouse->dev.keybit);
-				set_bit(BTN_FORWARD, psmouse->dev.keybit);
-				set_bit(BTN_TASK, psmouse->dev.keybit);
+				set_bit(BTN_SIDE, psmouse->dev->keybit);
+				set_bit(BTN_EXTRA, psmouse->dev->keybit);
+				set_bit(BTN_BACK, psmouse->dev->keybit);
+				set_bit(BTN_FORWARD, psmouse->dev->keybit);
+				set_bit(BTN_TASK, psmouse->dev->keybit);
 				psmouse->name = "MX Mouse";
 			}
 
@@ -193,8 +193,8 @@ int ps2pp_detect_model(struct psmouse *p
 
 		if (psmouse->model == 97) { /* TouchPad 3 */
 
-			set_bit(REL_WHEEL, psmouse->dev.relbit);
-			set_bit(REL_HWHEEL, psmouse->dev.relbit);
+			set_bit(REL_WHEEL, psmouse->dev->relbit);
+			set_bit(REL_HWHEEL, psmouse->dev->relbit);
 
 			param[0] = 0x11; param[1] = 0x04; param[2] = 0x68; /* Unprotect RAM */
 			psmouse_command(psmouse, param, 0x30d1);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/mouse/psmouse-base.c linux-260t5-ic/drivers/input/mouse/psmouse-base.c
--- linux-2.6.0-test5/drivers/input/mouse/psmouse-base.c	Mon Sep  8 12:49:58 2003
+++ linux-260t5-ic/drivers/input/mouse/psmouse-base.c	Wed Sep 10 15:02:46 2003
@@ -46,7 +46,7 @@ static char *psmouse_protocols[] = { "No
 
 static void psmouse_process_packet(struct psmouse *psmouse, struct pt_regs *regs)
 {
-	struct input_dev *dev = &psmouse->dev;
+	struct input_dev *dev = psmouse->dev;
 	unsigned char *packet = psmouse->packet;
 
 	input_regs(dev, regs);
@@ -283,9 +283,9 @@ static int psmouse_extensions(struct psm
 
 	if (param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55) {
 
-		set_bit(BTN_EXTRA, psmouse->dev.keybit);
-		set_bit(BTN_SIDE, psmouse->dev.keybit);
-		set_bit(REL_WHEEL, psmouse->dev.relbit);
+		set_bit(BTN_EXTRA, psmouse->dev->keybit);
+		set_bit(BTN_SIDE, psmouse->dev->keybit);
+		set_bit(REL_WHEEL, psmouse->dev->relbit);
 
 		psmouse->vendor = "Genius";
 		psmouse->name = "Wheel Mouse";
@@ -324,7 +324,7 @@ static int psmouse_extensions(struct psm
 	
 	if (param[0] == 3) {
 
-		set_bit(REL_WHEEL, psmouse->dev.relbit);
+		set_bit(REL_WHEEL, psmouse->dev->relbit);
 
 /*
  * Try IntelliMouse/Explorer magic init.
@@ -340,8 +340,8 @@ static int psmouse_extensions(struct psm
 
 		if (param[0] == 4) {
 
-			set_bit(BTN_SIDE, psmouse->dev.keybit);
-			set_bit(BTN_EXTRA, psmouse->dev.keybit);
+			set_bit(BTN_SIDE, psmouse->dev->keybit);
+			set_bit(BTN_EXTRA, psmouse->dev->keybit);
 
 			psmouse->name = "Explorer Mouse";
 			return PSMOUSE_IMEX;
@@ -478,7 +478,7 @@ static void psmouse_cleanup(struct serio
 static void psmouse_disconnect(struct serio *serio)
 {
 	struct psmouse *psmouse = serio->private;
-	input_unregister_device(&psmouse->dev);
+	input_unregister_device(psmouse->dev);
 	serio_close(serio);
 	synaptics_disconnect(psmouse);
 	kfree(psmouse);
@@ -501,13 +501,18 @@ static void psmouse_connect(struct serio
 
 	memset(psmouse, 0, sizeof(struct psmouse));
 
-	init_input_dev(&psmouse->dev);
-	psmouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
-	psmouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
-	psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
+	if (!(psmouse->dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL)))
+		return;
+
+	memset(psmouse->dev, 0, sizeof(struct input_dev));
+
+	init_input_dev(psmouse->dev);
+	psmouse->dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
+	psmouse->dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);
+	psmouse->dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
 
 	psmouse->serio = serio;
-	psmouse->dev.private = psmouse;
+	psmouse->dev->private = psmouse;
 
 	serio->private = psmouse;
 
@@ -527,14 +532,14 @@ static void psmouse_connect(struct serio
 	sprintf(psmouse->phys, "%s/input0",
 		serio->phys);
 
-	psmouse->dev.name = psmouse->devname;
-	psmouse->dev.phys = psmouse->phys;
-	psmouse->dev.id.bustype = BUS_I8042;
-	psmouse->dev.id.vendor = 0x0002;
-	psmouse->dev.id.product = psmouse->type;
-	psmouse->dev.id.version = psmouse->model;
+	psmouse->dev->name = psmouse->devname;
+	psmouse->dev->phys = psmouse->phys;
+	psmouse->dev->id.bustype = BUS_I8042;
+	psmouse->dev->id.vendor = 0x0002;
+	psmouse->dev->id.product = psmouse->type;
+	psmouse->dev->id.version = psmouse->model;
 
-	input_register_device(&psmouse->dev);
+	input_register_device(psmouse->dev);
 	
 	printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys);
 
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/mouse/psmouse.h linux-260t5-ic/drivers/input/mouse/psmouse.h
--- linux-2.6.0-test5/drivers/input/mouse/psmouse.h	Mon Sep  8 12:50:23 2003
+++ linux-260t5-ic/drivers/input/mouse/psmouse.h	Wed Sep 10 15:02:46 2003
@@ -18,7 +18,7 @@
 
 struct psmouse {
 	void *private;
-	struct input_dev dev;
+	struct input_dev *dev;
 	struct serio *serio;
 	char *vendor;
 	char *name;
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/mouse/synaptics.c linux-260t5-ic/drivers/input/mouse/synaptics.c
--- linux-2.6.0-test5/drivers/input/mouse/synaptics.c	Mon Sep  8 12:50:01 2003
+++ linux-260t5-ic/drivers/input/mouse/synaptics.c	Wed Sep 10 15:02:46 2003
@@ -230,23 +230,23 @@ int synaptics_init(struct psmouse *psmou
 	 * which says that they should be valid regardless of the actual size of
 	 * the senser.
 	 */
-	set_bit(EV_ABS, psmouse->dev.evbit);
-	set_abs_params(&psmouse->dev, ABS_X, 1472, 5472, 0, 0);
-	set_abs_params(&psmouse->dev, ABS_Y, 1408, 4448, 0, 0);
-	set_abs_params(&psmouse->dev, ABS_PRESSURE, 0, 255, 0, 0);
-
-	set_bit(EV_MSC, psmouse->dev.evbit);
-	set_bit(MSC_GESTURE, psmouse->dev.mscbit);
-
-	set_bit(EV_KEY, psmouse->dev.evbit);
-	set_bit(BTN_LEFT, psmouse->dev.keybit);
-	set_bit(BTN_RIGHT, psmouse->dev.keybit);
-	set_bit(BTN_FORWARD, psmouse->dev.keybit);
-	set_bit(BTN_BACK, psmouse->dev.keybit);
-
-	clear_bit(EV_REL, psmouse->dev.evbit);
-	clear_bit(REL_X, psmouse->dev.relbit);
-	clear_bit(REL_Y, psmouse->dev.relbit);
+	set_bit(EV_ABS, psmouse->dev->evbit);
+	set_abs_params(psmouse->dev, ABS_X, 1472, 5472, 0, 0);
+	set_abs_params(psmouse->dev, ABS_Y, 1408, 4448, 0, 0);
+	set_abs_params(psmouse->dev, ABS_PRESSURE, 0, 255, 0, 0);
+
+	set_bit(EV_MSC, psmouse->dev->evbit);
+	set_bit(MSC_GESTURE, psmouse->dev->mscbit);
+
+	set_bit(EV_KEY, psmouse->dev->evbit);
+	set_bit(BTN_LEFT, psmouse->dev->keybit);
+	set_bit(BTN_RIGHT, psmouse->dev->keybit);
+	set_bit(BTN_FORWARD, psmouse->dev->keybit);
+	set_bit(BTN_BACK, psmouse->dev->keybit);
+
+	clear_bit(EV_REL, psmouse->dev->evbit);
+	clear_bit(REL_X, psmouse->dev->relbit);
+	clear_bit(REL_Y, psmouse->dev->relbit);
 
 	return 0;
 
@@ -303,7 +303,7 @@ static void synaptics_parse_hw_state(str
  */
 static void synaptics_process_packet(struct psmouse *psmouse)
 {
-	struct input_dev *dev = &psmouse->dev;
+	struct input_dev *dev = psmouse->dev;
 	struct synaptics_data *priv = psmouse->private;
 	struct synaptics_hw_state hw;
 
@@ -353,7 +353,7 @@ static void synaptics_process_packet(str
 
 void synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)
 {
-	struct input_dev *dev = &psmouse->dev;
+	struct input_dev *dev = psmouse->dev;
 	struct synaptics_data *priv = psmouse->private;
 	unsigned char *pBuf = priv->proto_buf;
 	unsigned char u = psmouse->packet[0];
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/mousedev.c linux-260t5-ic/drivers/input/mousedev.c
--- linux-2.6.0-test5/drivers/input/mousedev.c	Mon Sep  8 12:50:28 2003
+++ linux-260t5-ic/drivers/input/mousedev.c	Wed Sep 10 15:02:46 2003
@@ -46,7 +46,7 @@ struct mousedev {
 	char name[16];
 	wait_queue_head_t wait;
 	struct list_head list;
-	struct input_handle handle;
+	struct input_handle *handle;
 };
 
 struct mousedev_list {
@@ -171,9 +171,16 @@ static int mousedev_fasync(int fd, struc
 	return retval < 0 ? retval : 0;
 }
 
+static struct input_class_interface intf = {
+	.name =		"input/mouse%d",
+	.mode = 	S_IFCHR | S_IRUGO | S_IWUSR,
+	.minor_base = 	MOUSEDEV_MINOR_BASE,
+};
+
 static void mousedev_free(struct mousedev *mousedev)
 {
-	devfs_remove("input/mouse%d", mousedev->minor);
+printk(KERN_WARNING "in mousedev_free \n");
+	//input_unregister_class_dev(intf.name, mousedev->minor);
 	mousedev_table[mousedev->minor] = NULL;
 	kfree(mousedev);
 }
@@ -181,15 +188,18 @@ static void mousedev_free(struct mousede
 static int mixdev_release(void)
 {
 	struct input_handle *handle;
+printk(KERN_WARNING "in mixdev_release \n");
 
 	list_for_each_entry(handle, &mousedev_handler.h_list, h_node) {
 		struct mousedev *mousedev = handle->private;
 
 		if (!mousedev->open) {
 			if (mousedev->exist)
-				input_close_device(&mousedev->handle);
-			else
+				input_close_device(mousedev->handle);
+			else {
+				//input_unregister_class_dev(intf.name,mousedev->minor);
 				mousedev_free(mousedev);
+			}
 		}
 	}
 
@@ -199,20 +209,25 @@ static int mixdev_release(void)
 static int mousedev_release(struct inode * inode, struct file * file)
 {
 	struct mousedev_list *list = file->private_data;
+printk(KERN_WARNING "in mousedev_release \n");
 
 	mousedev_fasync(-1, file, 0);
 
 	list_del(&list->node);
 
 	if (!--list->mousedev->open) {
-		if (list->mousedev->minor == MOUSEDEV_MIX)
+		if (list->mousedev->minor == MOUSEDEV_MIX){
+//input_unregister_class_dev(intf.name, list->mousedev->minor);
 			return mixdev_release();
+		}
 
 		if (!mousedev_mix.open) {
 			if (list->mousedev->exist)
-				input_close_device(&list->mousedev->handle);
-			else
+				input_close_device(list->mousedev->handle);
+			else{
+			//	input_unregister_class_dev(intf.name, list->mousedev->minor);
 				mousedev_free(list->mousedev);
+			}
 		}
 	}
 	
@@ -254,7 +269,7 @@ static int mousedev_open(struct inode * 
 			}
 		} else 
 			if (!mousedev_mix.open && list->mousedev->exist)	
-				input_open_device(&list->mousedev->handle);
+				input_open_device(list->mousedev->handle);
 	}
 
 	return 0;
@@ -406,6 +421,9 @@ static struct input_handle *mousedev_con
 {
 	struct mousedev *mousedev;
 	int minor = 0;
+int seen = 0;
+
+printk(KERN_WARNING "in mousedev_connect \n");
 
 	for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
 	if (minor == MOUSEDEV_MINORS) {
@@ -417,31 +435,39 @@ static struct input_handle *mousedev_con
 		return NULL;
 	memset(mousedev, 0, sizeof(struct mousedev));
 
+	if (!(mousedev->handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
+		return NULL;
+	memset(mousedev->handle, 0, sizeof(struct input_handle));
+
 	INIT_LIST_HEAD(&mousedev->list);
 	init_waitqueue_head(&mousedev->wait);
 
 	mousedev->minor = minor;
 	mousedev->exist = 1;
-	mousedev->handle.dev = dev;
-	mousedev->handle.name = mousedev->name;
-	mousedev->handle.handler = handler;
-	mousedev->handle.private = mousedev;
+	mousedev->handle->dev = dev;
+	mousedev->handle->name = mousedev->name;
+	mousedev->handle->handler = handler;
+	mousedev->handle->private = mousedev;
 	sprintf(mousedev->name, "mouse%d", minor);
 
 	if (mousedev_mix.open)
-		input_open_device(&mousedev->handle);
+		input_open_device(mousedev->handle);
 
 	mousedev_table[minor] = mousedev;
 
-	devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),
-			S_IFCHR|S_IRUGO|S_IWUSR, "input/mouse%d", minor);
+	intf.minor = minor;
+printk(KERN_WARNING "in mousedev connect minor before is: %d\n", intf.minor);
+	input_register_class_dev(dev, &intf);
+//	seen++;
+printk(KERN_WARNING "in mousedev connect minor after is: %d seen is %d\n", intf.minor, seen);
 
-	return &mousedev->handle;
+	return mousedev->handle;
 }
 
 static void mousedev_disconnect(struct input_handle *handle)
 {
 	struct mousedev *mousedev = handle->private;
+printk(KERN_WARNING "in mousedev_disconnect \n");
 
 	mousedev->exist = 0;
 
@@ -450,6 +476,7 @@ static void mousedev_disconnect(struct i
 	} else {
 		if (mousedev_mix.open)
 			input_close_device(handle);
+		input_unregister_class_dev(intf.name,mousedev->minor);
 		mousedev_free(mousedev);
 	}
 }
@@ -494,8 +521,17 @@ static struct miscdevice psaux_mouse = {
 };
 #endif
 
+static struct input_class_interface intf2 = {
+	.name =		"input/mice",
+	.mode = 	S_IFCHR | S_IRUGO | S_IWUSR,
+	.minor_base = 	MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX,
+};
+
 static int __init mousedev_init(void)
 {
+	struct input_dev *dev; /* need an input_dev to hold the class_device */
+
+printk(KERN_WARNING "in mousedev_init \n");
 	input_register_handler(&mousedev_handler);
 
 	memset(&mousedev_mix, 0, sizeof(struct mousedev));
@@ -505,9 +541,12 @@ static int __init mousedev_init(void)
 	mousedev_mix.exist = 1;
 	mousedev_mix.minor = MOUSEDEV_MIX;
 
-	devfs_mk_cdev(MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX),
-			S_IFCHR|S_IRUGO|S_IWUSR, "input/mice");
-
+	intf2.minor = MOUSEDEV_MIX;
+	dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL);
+	if(!dev)
+		return -ENOMEM;
+	memset(dev, 0x00, sizeof(struct input_dev));
+	input_register_class_dev(dev, &intf2);
 
 #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
 	if (!(mousedev_mix.misc = !misc_register(&psaux_mouse)))
@@ -521,12 +560,14 @@ static int __init mousedev_init(void)
 
 static void __exit mousedev_exit(void)
 {
+printk(KERN_WARNING "in mousedev_exit\n");
 #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX
 	if (mousedev_mix.misc)
 		misc_deregister(&psaux_mouse);
 #endif
-	devfs_remove("input/mice");
+	/*devfs_remove("input/mice");*/
 	input_unregister_handler(&mousedev_handler);
+	input_unregister_class_dev(intf2.name,MOUSEDEV_MIX);
 }
 
 module_init(mousedev_init);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/input/tsdev.c linux-260t5-ic/drivers/input/tsdev.c
--- linux-2.6.0-test5/drivers/input/tsdev.c	Mon Sep  8 12:50:32 2003
+++ linux-260t5-ic/drivers/input/tsdev.c	Wed Sep 10 15:02:46 2003
@@ -118,7 +118,7 @@ static int tsdev_open(struct inode *inod
 
 static void tsdev_free(struct tsdev *tsdev)
 {
-	devfs_remove("input/ts%d", tsdev->minor);
+	//input_unregister_class_dev(intf.name, tsdev->minor);
 	tsdev_table[tsdev->minor] = NULL;
 	kfree(tsdev);
 }
@@ -133,8 +133,10 @@ static int tsdev_release(struct inode *i
 	if (!--list->tsdev->open) {
 		if (list->tsdev->exist)
 			input_close_device(&list->tsdev->handle);
-		else
+		else{
+	//		input_unregister_class_dev(intf.name,list->tsdev->minor);
 			tsdev_free(list->tsdev);
+		}
 	}
 	kfree(list);
 	return 0;
@@ -298,6 +300,12 @@ static void tsdev_event(struct input_han
 	wake_up_interruptible(&tsdev->wait);
 }
 
+static struct input_class_interface intf = {
+	.name =		"input/ts%d", 
+	.mode = 	S_IFCHRIS | S_IRUGO | S_IWUSR,
+	.minor_base = 	TSDEV_MINOR_BASE,
+};
+
 static struct input_handle *tsdev_connect(struct input_handler *handler,
 					  struct input_dev *dev,
 					  struct input_device_id *id)
@@ -330,9 +338,9 @@ static struct input_handle *tsdev_connec
 	tsdev->handle.private = tsdev;
 
 	tsdev_table[minor] = tsdev;
-	
-	devfs_mk_cdev(MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor),
-			S_IFCHR|S_IRUGO|S_IWUSR, "input/ts%d", minor);
+
+	intf.minor = minor;
+	//input_register_class_dev(dev, &intf);	
 
 	return &tsdev->handle;
 }
@@ -346,8 +354,10 @@ static void tsdev_disconnect(struct inpu
 	if (tsdev->open) {
 		input_close_device(handle);
 		wake_up_interruptible(&tsdev->wait);
-	} else
+	} else {
+		//input_unregister_class_dev(intf.name,tsdev->minor);
 		tsdev_free(tsdev);
+	}
 }
 
 static struct input_device_id tsdev_ids[] = {
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/hid-input.c linux-260t5-ic/drivers/usb/input/hid-input.c
--- linux-2.6.0-test5/drivers/usb/input/hid-input.c	Mon Sep  8 12:50:02 2003
+++ linux-260t5-ic/drivers/usb/input/hid-input.c	Wed Sep 10 15:02:46 2003
@@ -75,13 +75,13 @@ static struct input_dev *find_input(stru
 
 		for (i = 0; i < hidinput->report->maxfield; i++)
 			if (hidinput->report->field[i] == field)
-				return &hidinput->input;
+				return hidinput->input;
 	}
 
 	/* Assume we only have one input and use it */
 	if (!list_empty(&hid->inputs)) {
 		hidinput = list_entry(hid->inputs.next, struct hid_input, list);
-		return &hidinput->input;
+		return hidinput->input;
 	}
 
 	/* This is really a bug */
@@ -91,8 +91,8 @@ static struct input_dev *find_input(stru
 static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
 				     struct hid_usage *usage)
 {
-	struct input_dev *input = &hidinput->input;
-	struct hid_device *device = hidinput->input.private;
+	struct input_dev *input = hidinput->input;
+	struct hid_device *device = hidinput->input->private;
 	int max;
 	int is_abs = 0;
 	unsigned long *bit;
@@ -500,7 +500,7 @@ void hidinput_report_event(struct hid_de
 
 	list_for_each (lh, &hid->inputs) {
 		hidinput = list_entry(lh, struct hid_input, list);
-		input_sync(&hidinput->input);
+		input_sync(hidinput->input);
 	}
 }
 
@@ -577,21 +577,27 @@ int hidinput_connect(struct hid_device *
 					return -1;
 				}
 				memset(hidinput, 0, sizeof(*hidinput));
+				hidinput->input = kmalloc(sizeof(struct input_dev), GFP_KERNEL);
+				if (!(hidinput->input)) {
+					err("Out of memory during hid input_dev probe");
+					return -1;
+				}
+				memset(hidinput->input, 0, sizeof(struct input_dev));
 
 				list_add_tail(&hidinput->list, &hid->inputs);
 
-				hidinput->input.private = hid;
-				hidinput->input.event = hidinput_input_event;
-				hidinput->input.open = hidinput_open;
-				hidinput->input.close = hidinput_close;
-
-				hidinput->input.name = hid->name;
-				hidinput->input.phys = hid->phys;
-				hidinput->input.uniq = hid->uniq;
-				hidinput->input.id.bustype = BUS_USB;
-				hidinput->input.id.vendor = dev->descriptor.idVendor;
-				hidinput->input.id.product = dev->descriptor.idProduct;
-				hidinput->input.id.version = dev->descriptor.bcdDevice;
+				hidinput->input->private = hid;
+				hidinput->input->event = hidinput_input_event;
+				hidinput->input->open = hidinput_open;
+				hidinput->input->close = hidinput_close;
+
+				hidinput->input->name = hid->name;
+				hidinput->input->phys = hid->phys;
+				hidinput->input->uniq = hid->uniq;
+				hidinput->input->id.bustype = BUS_USB;
+				hidinput->input->id.vendor = dev->descriptor.idVendor;
+				hidinput->input->id.product = dev->descriptor.idProduct;
+				hidinput->input->id.version = dev->descriptor.bcdDevice;
 			}
 
 			for (i = 0; i < report->maxfield; i++)
@@ -606,7 +612,7 @@ int hidinput_connect(struct hid_device *
 				 * UGCI) cram a lot of unrelated inputs into the
 				 * same interface. */
 				hidinput->report = report;
-				input_register_device(&hidinput->input);
+				input_register_device(hidinput->input);
 				hidinput = NULL;
 			}
 
@@ -619,7 +625,7 @@ int hidinput_connect(struct hid_device *
 	 * only useful in this case, and not for multi-input quirks. */
 	if (hidinput) {
 		hid_ff_init(hid);
-		input_register_device(&hidinput->input);
+		input_register_device(hidinput->input);
 	}
 
 	return 0;
@@ -632,7 +638,7 @@ void hidinput_disconnect(struct hid_devi
 
 	list_for_each_safe (lh, next, &hid->inputs) {
 		hidinput = list_entry(lh, struct hid_input, list);
-		input_unregister_device(&hidinput->input);
+		input_unregister_device(hidinput->input);
 		list_del(&hidinput->list);
 		kfree(hidinput);
 	}
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/hid-lgff.c linux-260t5-ic/drivers/usb/input/hid-lgff.c
--- linux-2.6.0-test5/drivers/usb/input/hid-lgff.c	Mon Sep  8 12:50:20 2003
+++ linux-260t5-ic/drivers/usb/input/hid-lgff.c	Wed Sep 10 15:02:46 2003
@@ -262,15 +262,15 @@ static void hid_lgff_input_init(struct h
 	ff = dev->ff;
 
 	while (*ff >= 0) {
-		set_bit(*ff, hidinput->input.ffbit);
+		set_bit(*ff, hidinput->input->ffbit);
 		++ff;
 	}
 
-	hidinput->input.upload_effect = hid_lgff_upload_effect;
-	hidinput->input.flush = hid_lgff_flush;
+	hidinput->input->upload_effect = hid_lgff_upload_effect;
+	hidinput->input->flush = hid_lgff_flush;
 
-	set_bit(EV_FF, hidinput->input.evbit);
-	hidinput->input.ff_effects_max = LGFF_EFFECTS;
+	set_bit(EV_FF, hidinput->input->evbit);
+	hidinput->input->ff_effects_max = LGFF_EFFECTS;
 }
 
 static void hid_lgff_exit(struct hid_device* hid)
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/hid-tmff.c linux-260t5-ic/drivers/usb/input/hid-tmff.c
--- linux-2.6.0-test5/drivers/usb/input/hid-tmff.c	Mon Sep  8 12:50:08 2003
+++ linux-260t5-ic/drivers/usb/input/hid-tmff.c	Wed Sep 10 15:02:46 2003
@@ -155,7 +155,7 @@ int hid_tmff_init(struct hid_device *hid
 					private->report = report;
 					private->rumble = field;
 
-					set_bit(FF_RUMBLE, hidinput->input.ffbit);
+					set_bit(FF_RUMBLE, hidinput->input->ffbit);
 					break;
 
 				default:
@@ -164,11 +164,11 @@ int hid_tmff_init(struct hid_device *hid
 			}
 
 			/* Fallthrough to here only when a valid usage is found */
-			hidinput->input.upload_effect = hid_tmff_upload_effect;
-			hidinput->input.flush = hid_tmff_flush;
+			hidinput->input->upload_effect = hid_tmff_upload_effect;
+			hidinput->input->flush = hid_tmff_flush;
 
-			set_bit(EV_FF, hidinput->input.evbit);
-			hidinput->input.ff_effects_max = TMFF_EFFECTS;
+			set_bit(EV_FF, hidinput->input->evbit);
+			hidinput->input->ff_effects_max = TMFF_EFFECTS;
 		}
 	}
 
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/hid.h linux-260t5-ic/drivers/usb/input/hid.h
--- linux-2.6.0-test5/drivers/usb/input/hid.h	Mon Sep  8 12:49:51 2003
+++ linux-260t5-ic/drivers/usb/input/hid.h	Wed Sep 10 15:02:46 2003
@@ -327,7 +327,7 @@ struct hid_control_fifo {
 struct hid_input {
 	struct list_head list;
 	struct hid_report *report;
-	struct input_dev input;
+	struct input_dev *input;
 };
 
 struct hid_device {							/* device report descriptor */
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/kbtab.c linux-260t5-ic/drivers/usb/input/kbtab.c
--- linux-2.6.0-test5/drivers/usb/input/kbtab.c	Mon Sep  8 12:49:51 2003
+++ linux-260t5-ic/drivers/usb/input/kbtab.c	Wed Sep 10 15:02:46 2003
@@ -32,7 +32,7 @@ MODULE_PARM_DESC(kb_pressure_click,
 struct kbtab {
 	signed char *data;
 	dma_addr_t data_dma;
-	struct input_dev dev;
+	struct input_dev *dev;
 	struct usb_device *usbdev;
 	struct urb *irq;
 	int open;
@@ -47,7 +47,7 @@ static void kbtab_irq(struct urb *urb, s
 {
 	struct kbtab *kbtab = urb->context;
 	unsigned char *data = kbtab->data;
-	struct input_dev *dev = &kbtab->dev;
+	struct input_dev *dev = kbtab->dev;
 	int retval;
 
 	switch (urb->status) {
@@ -130,6 +130,10 @@ static int kbtab_probe(struct usb_interf
 		return -ENOMEM;
 	memset(kbtab, 0, sizeof(struct kbtab));
 
+	if (!(kbtab->dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL)))
+		return -ENOMEM;
+	memset(kbtab->dev, 0, sizeof(struct input_dev));
+
 	kbtab->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &kbtab->data_dma);
 	if (!kbtab->data) {
 		kfree(kbtab);
@@ -143,35 +147,35 @@ static int kbtab_probe(struct usb_interf
 		return -ENOMEM;
 	}
 
-	kbtab->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
-	kbtab->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
+	kbtab->dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC);
+	kbtab->dev->absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
 
-	kbtab->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+	kbtab->dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
 
-	kbtab->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
+	kbtab->dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH);
 
-	kbtab->dev.mscbit[0] |= BIT(MSC_SERIAL);
+	kbtab->dev->mscbit[0] |= BIT(MSC_SERIAL);
 
-	kbtab->dev.absmax[ABS_X] = 0x2000;
-	kbtab->dev.absmax[ABS_Y] = 0x1750;
-	kbtab->dev.absmax[ABS_PRESSURE] = 0xff;
+	kbtab->dev->absmax[ABS_X] = 0x2000;
+	kbtab->dev->absmax[ABS_Y] = 0x1750;
+	kbtab->dev->absmax[ABS_PRESSURE] = 0xff;
 	
-	kbtab->dev.absfuzz[ABS_X] = 4;
-	kbtab->dev.absfuzz[ABS_Y] = 4;
+	kbtab->dev->absfuzz[ABS_X] = 4;
+	kbtab->dev->absfuzz[ABS_Y] = 4;
 
-	kbtab->dev.private = kbtab;
-	kbtab->dev.open = kbtab_open;
-	kbtab->dev.close = kbtab_close;
+	kbtab->dev->private = kbtab;
+	kbtab->dev->open = kbtab_open;
+	kbtab->dev->close = kbtab_close;
 
 	usb_make_path(dev, path, 64);
 	sprintf(kbtab->phys, "%s/input0", path);
 
-	kbtab->dev.name = "KB Gear Tablet";
-	kbtab->dev.phys = kbtab->phys;
-	kbtab->dev.id.bustype = BUS_USB;
-	kbtab->dev.id.vendor = dev->descriptor.idVendor;
-	kbtab->dev.id.product = dev->descriptor.idProduct;
-	kbtab->dev.id.version = dev->descriptor.bcdDevice;
+	kbtab->dev->name = "KB Gear Tablet";
+	kbtab->dev->phys = kbtab->phys;
+	kbtab->dev->id.bustype = BUS_USB;
+	kbtab->dev->id.vendor = dev->descriptor.idVendor;
+	kbtab->dev->id.product = dev->descriptor.idProduct;
+	kbtab->dev->id.version = dev->descriptor.bcdDevice;
 	kbtab->usbdev = dev;
 
 	endpoint = &intf->altsetting[0].endpoint[0].desc;
@@ -183,7 +187,7 @@ static int kbtab_probe(struct usb_interf
 	kbtab->irq->transfer_dma = kbtab->data_dma;
 	kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-	input_register_device(&kbtab->dev);
+	input_register_device(kbtab->dev);
 
 	printk(KERN_INFO "input: KB Gear Tablet on %s\n",  path);
 
@@ -199,7 +203,7 @@ static void kbtab_disconnect(struct usb_
 	usb_set_intfdata(intf, NULL);
 	if (kbtab) {
 		usb_unlink_urb(kbtab->irq);
-		input_unregister_device(&kbtab->dev);
+		input_unregister_device(kbtab->dev);
 		usb_free_urb(kbtab->irq);
 		usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma);
 		kfree(kbtab);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/pid.c linux-260t5-ic/drivers/usb/input/pid.c
--- linux-2.6.0-test5/drivers/usb/input/pid.c	Mon Sep  8 12:50:23 2003
+++ linux-260t5-ic/drivers/usb/input/pid.c	Wed Sep 10 15:02:46 2003
@@ -290,11 +290,11 @@ int hid_pid_init(struct hid_device *hid)
     }
 
     usb_fill_control_urb(private->urbffout, hid->dev,0,(void *) &private->ffcr,private->ctrl_buffer,8,hid_pid_ctrl_out,hid);
-    hidinput->input.upload_effect = hid_pid_upload_effect;
-    hidinput->input.flush = hid_pid_flush;
-    hidinput->input.ff_effects_max = 8;  // A random default
-    set_bit(EV_FF, hidinput->input.evbit);
-    set_bit(EV_FF_STATUS, hidinput->input.evbit);
+    hidinput->input->upload_effect = hid_pid_upload_effect;
+    hidinput->input->flush = hid_pid_flush;
+    hidinput->input->ff_effects_max = 8;  // A random default
+    set_bit(EV_FF, hidinput->input->evbit);
+    set_bit(EV_FF_STATUS, hidinput->input->evbit);
 
     spin_lock_init(&private->lock);
 
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/powermate.c linux-260t5-ic/drivers/usb/input/powermate.c
--- linux-2.6.0-test5/drivers/usb/input/powermate.c	Mon Sep  8 12:50:07 2003
+++ linux-260t5-ic/drivers/usb/input/powermate.c	Wed Sep 10 15:02:46 2003
@@ -62,7 +62,7 @@ struct powermate_device {
 	struct usb_ctrlrequest *configcr;
 	dma_addr_t configcr_dma;
 	struct usb_device *udev;
-	struct input_dev input;
+	struct input_dev *input;
 	struct semaphore lock;
 	int static_brightness;
 	int pulse_speed;
@@ -100,10 +100,10 @@ static void powermate_irq(struct urb *ur
 	}
 
 	/* handle updates to device state */
-	input_regs(&pm->input, regs);
-	input_report_key(&pm->input, BTN_0, pm->data[0] & 0x01);
-	input_report_rel(&pm->input, REL_DIAL, pm->data[1]);
-	input_sync(&pm->input);
+	input_regs(pm->input, regs);
+	input_report_key(pm->input, BTN_0, pm->data[0] & 0x01);
+	input_report_rel(pm->input, REL_DIAL, pm->data[1]);
+	input_sync(pm->input);
 
 exit:
 	retval = usb_submit_urb (urb, GFP_ATOMIC);
@@ -317,6 +317,11 @@ static int powermate_probe(struct usb_in
 		return -ENOMEM;
 
 	memset(pm, 0, sizeof(struct powermate_device));
+
+	if (!(pm->input = kmalloc(sizeof(struct input_dev), GFP_KERNEL)))
+		return -ENOMEM;
+
+	memset(pm->input, 0, sizeof(struct input_dev));
 	pm->udev = udev;
 
 	if (powermate_alloc_buffers(udev, pm)) {
@@ -341,7 +346,7 @@ static int powermate_probe(struct usb_in
 	}
 
 	init_MUTEX(&pm->lock);
-	init_input_dev(&pm->input);
+	init_input_dev(pm->input);
 
 	/* get a handle to the interrupt data pipe */
 	pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress);
@@ -365,29 +370,29 @@ static int powermate_probe(struct usb_in
 	}
 
 	switch (udev->descriptor.idProduct) {
-	case POWERMATE_PRODUCT_NEW: pm->input.name = pm_name_powermate; break;
-	case POWERMATE_PRODUCT_OLD: pm->input.name = pm_name_soundknob; break;
+	case POWERMATE_PRODUCT_NEW: pm->input->name = pm_name_powermate; break;
+	case POWERMATE_PRODUCT_OLD: pm->input->name = pm_name_soundknob; break;
 	default: 
-	  pm->input.name = pm_name_soundknob;
+	  pm->input->name = pm_name_soundknob;
 	  printk(KERN_WARNING "powermate: unknown product id %04x\n", udev->descriptor.idProduct);
 	}
 
-	pm->input.private = pm;
-	pm->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC);
-	pm->input.keybit[LONG(BTN_0)] = BIT(BTN_0);
-	pm->input.relbit[LONG(REL_DIAL)] = BIT(REL_DIAL);
-	pm->input.mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED);
-	pm->input.id.bustype = BUS_USB;
-	pm->input.id.vendor = udev->descriptor.idVendor;
-	pm->input.id.product = udev->descriptor.idProduct;
-	pm->input.id.version = udev->descriptor.bcdDevice;
-	pm->input.event = powermate_input_event;
+	pm->input->private = pm;
+	pm->input->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC);
+	pm->input->keybit[LONG(BTN_0)] = BIT(BTN_0);
+	pm->input->relbit[LONG(REL_DIAL)] = BIT(REL_DIAL);
+	pm->input->mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED);
+	pm->input->id.bustype = BUS_USB;
+	pm->input->id.vendor = udev->descriptor.idVendor;
+	pm->input->id.product = udev->descriptor.idProduct;
+	pm->input->id.version = udev->descriptor.bcdDevice;
+	pm->input->event = powermate_input_event;
 
-	input_register_device(&pm->input);
+	input_register_device(pm->input);
 
 	usb_make_path(udev, path, 64);
 	snprintf(pm->phys, 64, "%s/input0", path);
-	printk(KERN_INFO "input: %s on %s\n", pm->input.name, pm->input.phys);
+	printk(KERN_INFO "input: %s on %s\n", pm->input->name, pm->input->phys);
 	
 	/* force an update of everything */
 	pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS;
@@ -407,7 +412,7 @@ static void powermate_disconnect(struct 
 		down(&pm->lock);
 		pm->requires_update = 0;
 		usb_unlink_urb(pm->irq);
-		input_unregister_device(&pm->input);
+		input_unregister_device(pm->input);
 		usb_free_urb(pm->irq);
 		usb_free_urb(pm->config);
 		powermate_free_buffers(interface_to_usbdev(intf), pm);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/usbkbd.c linux-260t5-ic/drivers/usb/input/usbkbd.c
--- linux-2.6.0-test5/drivers/usb/input/usbkbd.c	Mon Sep  8 12:50:32 2003
+++ linux-260t5-ic/drivers/usb/input/usbkbd.c	Wed Sep 10 15:02:46 2003
@@ -65,7 +65,7 @@ static unsigned char usb_kbd_keycode[256
 };
 
 struct usb_kbd {
-	struct input_dev dev;
+	struct input_dev *dev;
 	struct usb_device *usbdev;
 	unsigned char old[8];
 	struct urb *irq, *led;
@@ -99,29 +99,29 @@ static void usb_kbd_irq(struct urb *urb,
 		goto resubmit;
 	}
 
-	input_regs(&kbd->dev, regs);
+	input_regs(kbd->dev, regs);
 
 	for (i = 0; i < 8; i++)
-		input_report_key(&kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
+		input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1);
 
 	for (i = 2; i < 8; i++) {
 
 		if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) {
 			if (usb_kbd_keycode[kbd->old[i]])
-				input_report_key(&kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
+				input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0);
 			else
 				info("Unknown key (scancode %#x) released.", kbd->old[i]);
 		}
 
 		if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) {
 			if (usb_kbd_keycode[kbd->new[i]])
-				input_report_key(&kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
+				input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1);
 			else
 				info("Unknown key (scancode %#x) pressed.", kbd->new[i]);
 		}
 	}
 
-	input_sync(&kbd->dev);
+	input_sync(kbd->dev);
 
 	memcpy(kbd->old, kbd->new, 8);
 
@@ -258,6 +258,11 @@ static int usb_kbd_probe(struct usb_inte
 		return -ENOMEM;
 	memset(kbd, 0, sizeof(struct usb_kbd));
 
+	/*move to usb_kbd_alloc_mem*/
+	if (!(kbd->dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL)))
+		return -ENOMEM;
+	memset(kbd->dev, 0, sizeof(struct input_dev));
+
 	if (usb_kbd_alloc_mem(dev, kbd)) {
 		usb_kbd_free_mem(dev, kbd);
 		kfree(kbd);
@@ -266,17 +271,17 @@ static int usb_kbd_probe(struct usb_inte
 
 	kbd->usbdev = dev;
 
-	kbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
-	kbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
+	kbd->dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
+	kbd->dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);
 
 	for (i = 0; i < 255; i++)
-		set_bit(usb_kbd_keycode[i], kbd->dev.keybit);
+		set_bit(usb_kbd_keycode[i], kbd->dev->keybit);
 	clear_bit(0, kbd->dev.keybit);
 	
-	kbd->dev.private = kbd;
-	kbd->dev.event = usb_kbd_event;
-	kbd->dev.open = usb_kbd_open;
-	kbd->dev.close = usb_kbd_close;
+	kbd->dev->private = kbd;
+	kbd->dev->event = usb_kbd_event;
+	kbd->dev->open = usb_kbd_open;
+	kbd->dev->close = usb_kbd_close;
 
 	usb_fill_int_urb(kbd->irq, dev, pipe,
 			 kbd->new, (maxp > 8 ? 8 : maxp),
@@ -293,12 +298,12 @@ static int usb_kbd_probe(struct usb_inte
 	usb_make_path(dev, path, 64);
 	sprintf(kbd->phys, "%s/input0", path);
 
-	kbd->dev.name = kbd->name;
-	kbd->dev.phys = kbd->phys;	
-	kbd->dev.id.bustype = BUS_USB;
-	kbd->dev.id.vendor = dev->descriptor.idVendor;
-	kbd->dev.id.product = dev->descriptor.idProduct;
-	kbd->dev.id.version = dev->descriptor.bcdDevice;
+	kbd->dev->name = kbd->name;
+	kbd->dev->phys = kbd->phys;	
+	kbd->dev->id.bustype = BUS_USB;
+	kbd->dev->id.vendor = dev->descriptor.idVendor;
+	kbd->dev->id.product = dev->descriptor.idProduct;
+	kbd->dev->id.version = dev->descriptor.bcdDevice;
 
 	if (!(buf = kmalloc(63, GFP_KERNEL))) {
 		usb_free_urb(kbd->irq);
@@ -316,7 +321,7 @@ static int usb_kbd_probe(struct usb_inte
 
 	if (!strlen(kbd->name))
 		sprintf(kbd->name, "USB HIDBP Keyboard %04x:%04x",
-			kbd->dev.id.vendor, kbd->dev.id.product);
+			kbd->dev->id.vendor, kbd->dev->id.product);
 
 	kfree(buf);
 
@@ -328,7 +333,7 @@ static int usb_kbd_probe(struct usb_inte
 	kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP
 				| URB_NO_SETUP_DMA_MAP);
 
-	input_register_device(&kbd->dev);
+	input_register_device(kbd->dev);
 
 	printk(KERN_INFO "input: %s on %s\n", kbd->name, path);
 
@@ -343,7 +348,7 @@ static void usb_kbd_disconnect(struct us
 	usb_set_intfdata(intf, NULL);
 	if (kbd) {
 		usb_unlink_urb(kbd->irq);
-		input_unregister_device(&kbd->dev);
+		input_unregister_device(kbd->dev);
 		usb_kbd_free_mem(interface_to_usbdev(intf), kbd);
 		kfree(kbd);
 	}
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/usbmouse.c linux-260t5-ic/drivers/usb/input/usbmouse.c
--- linux-2.6.0-test5/drivers/usb/input/usbmouse.c	Mon Sep  8 12:50:29 2003
+++ linux-260t5-ic/drivers/usb/input/usbmouse.c	Wed Sep 10 15:02:46 2003
@@ -49,7 +49,7 @@ struct usb_mouse {
 	char name[128];
 	char phys[64];
 	struct usb_device *usbdev;
-	struct input_dev dev;
+	struct input_dev *dev;
 	struct urb *irq;
 	int open;
 
@@ -61,7 +61,7 @@ static void usb_mouse_irq(struct urb *ur
 {
 	struct usb_mouse *mouse = urb->context;
 	signed char *data = mouse->data;
-	struct input_dev *dev = &mouse->dev;
+	struct input_dev *dev = mouse->dev;
 	int status;
 
 	switch (urb->status) {
@@ -149,6 +149,10 @@ static int usb_mouse_probe(struct usb_in
 		return -ENOMEM;
 	memset(mouse, 0, sizeof(struct usb_mouse));
 
+	if (!(mouse->dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL))) 
+		return -ENOMEM;
+	memset(mouse->dev, 0, sizeof(struct input_dev));
+
 	mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma);
 	if (!mouse->data) {
 		kfree(mouse);
@@ -164,25 +168,25 @@ static int usb_mouse_probe(struct usb_in
 
 	mouse->usbdev = dev;
 
-	mouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
-	mouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
-	mouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);
-	mouse->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
-	mouse->dev.relbit[0] |= BIT(REL_WHEEL);
-
-	mouse->dev.private = mouse;
-	mouse->dev.open = usb_mouse_open;
-	mouse->dev.close = usb_mouse_close;
+	mouse->dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);
+	mouse->dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);
+	mouse->dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);
+	mouse->dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA);
+	mouse->dev->relbit[0] |= BIT(REL_WHEEL);
+
+	mouse->dev->private = mouse;
+	mouse->dev->open = usb_mouse_open;
+	mouse->dev->close = usb_mouse_close;
 
 	usb_make_path(dev, path, 64);
 	sprintf(mouse->phys, "%s/input0", path);
 
-	mouse->dev.name = mouse->name;
-	mouse->dev.phys = mouse->phys;
-	mouse->dev.id.bustype = BUS_USB;
-	mouse->dev.id.vendor = dev->descriptor.idVendor;
-	mouse->dev.id.product = dev->descriptor.idProduct;
-	mouse->dev.id.version = dev->descriptor.bcdDevice;
+	mouse->dev->name = mouse->name;
+	mouse->dev->phys = mouse->phys;
+	mouse->dev->id.bustype = BUS_USB;
+	mouse->dev->id.vendor = dev->descriptor.idVendor;
+	mouse->dev->id.product = dev->descriptor.idProduct;
+	mouse->dev->id.version = dev->descriptor.bcdDevice;
 
 	if (!(buf = kmalloc(63, GFP_KERNEL))) {
 		usb_buffer_free(dev, 8, mouse->data, mouse->data_dma);
@@ -199,7 +203,7 @@ static int usb_mouse_probe(struct usb_in
 
 	if (!strlen(mouse->name))
 		sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x",
-			mouse->dev.id.vendor, mouse->dev.id.product);
+			mouse->dev->id.vendor, mouse->dev->id.product);
 
 	kfree(buf);
 
@@ -209,7 +213,7 @@ static int usb_mouse_probe(struct usb_in
 	mouse->irq->transfer_dma = mouse->data_dma;
 	mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
-	input_register_device(&mouse->dev);
+	input_register_device(mouse->dev);
 	printk(KERN_INFO "input: %s on %s\n", mouse->name, path);
 
 	usb_set_intfdata(intf, mouse);
@@ -223,7 +227,7 @@ static void usb_mouse_disconnect(struct 
 	usb_set_intfdata(intf, NULL);
 	if (mouse) {
 		usb_unlink_urb(mouse->irq);
-		input_unregister_device(&mouse->dev);
+		input_unregister_device(mouse->dev);
 		usb_free_urb(mouse->irq);
 		usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma);
 		kfree(mouse);
diff -Nrup -Xdontdiff linux-2.6.0-test5/drivers/usb/input/xpad.c linux-260t5-ic/drivers/usb/input/xpad.c
--- linux-2.6.0-test5/drivers/usb/input/xpad.c	Mon Sep  8 12:50:06 2003
+++ linux-260t5-ic/drivers/usb/input/xpad.c	Wed Sep 10 15:02:46 2003
@@ -102,7 +102,7 @@ static struct usb_device_id xpad_table [
 MODULE_DEVICE_TABLE (usb, xpad_table);
 
 struct usb_xpad {
-	struct input_dev dev;			/* input device interface */
+	struct input_dev *dev;			/* input device interface */
 	struct usb_device *udev;		/* usb device */
 	
 	struct urb *irq_in;			/* urb for interrupt in report */
@@ -236,6 +236,12 @@ static int xpad_probe(struct usb_interfa
 		return -ENOMEM;
 	}
 	memset(xpad, 0, sizeof(struct usb_xpad));
+
+	if ((xpad->dev = kmalloc (sizeof(struct input_dev), GFP_KERNEL)) == NULL) {
+		err("cannot allocate memory for new pad");
+		return -ENOMEM;
+	}
+	memset(xpad->dev, 0, sizeof(struct input_dev));
 	
 	xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN,
 				       SLAB_ATOMIC, &xpad->idata_dma);
@@ -263,20 +269,20 @@ static int xpad_probe(struct usb_interfa
 	
 	xpad->udev = udev;
 	
-	xpad->dev.id.bustype = BUS_USB;
-	xpad->dev.id.vendor = udev->descriptor.idVendor;
-	xpad->dev.id.product = udev->descriptor.idProduct;
-	xpad->dev.id.version = udev->descriptor.bcdDevice;
-	xpad->dev.private = xpad;
-	xpad->dev.name = xpad_device[i].name;
-	xpad->dev.phys = xpad->phys;
-	xpad->dev.open = xpad_open;
-	xpad->dev.close = xpad_close;
+	xpad->dev->id.bustype = BUS_USB;
+	xpad->dev->id.vendor = udev->descriptor.idVendor;
+	xpad->dev->id.product = udev->descriptor.idProduct;
+	xpad->dev->id.version = udev->descriptor.bcdDevice;
+	xpad->dev->private = xpad;
+	xpad->dev->name = xpad_device[i].name;
+	xpad->dev->phys = xpad->phys;
+	xpad->dev->open = xpad_open;
+	xpad->dev->close = xpad_close;
 	
 	usb_make_path(udev, path, 64);
 	snprintf(xpad->phys, 64,  "%s/input0", path);
 	
-	xpad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+	xpad->dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
 	
 	for (i = 0; xpad_btn[i] >= 0; i++)
 		set_bit(xpad_btn[i], xpad->dev.keybit);
@@ -285,34 +291,34 @@ static int xpad_probe(struct usb_interfa
 		
 		signed short t = xpad_abs[i];
 		
-		set_bit(t, xpad->dev.absbit);
+		set_bit(t, xpad->dev->absbit);
 		
 		switch (t) {
 			case ABS_X:
 			case ABS_Y:
 			case ABS_RX:
 			case ABS_RY:	/* the two sticks */
-				xpad->dev.absmax[t] =  32767;
-				xpad->dev.absmin[t] = -32768;
-				xpad->dev.absflat[t] = 128;
-				xpad->dev.absfuzz[t] = 16;
+				xpad->dev->absmax[t] =  32767;
+				xpad->dev->absmin[t] = -32768;
+				xpad->dev->absflat[t] = 128;
+				xpad->dev->absfuzz[t] = 16;
 				break;
 			case ABS_Z:
 			case ABS_RZ:	/* the triggers */
-				xpad->dev.absmax[t] = 255;
-				xpad->dev.absmin[t] = 0;
+				xpad->dev->absmax[t] = 255;
+				xpad->dev->absmin[t] = 0;
 				break;
 			case ABS_HAT0X:
 			case ABS_HAT0Y:	/* the d-pad */
-				xpad->dev.absmax[t] =  1;
-				xpad->dev.absmin[t] = -1;
+				xpad->dev->absmax[t] =  1;
+				xpad->dev->absmin[t] = -1;
 				break;
 		}
 	}
 	
-	input_register_device(&xpad->dev);
+	input_register_device(xpad->dev);
 	
-	printk(KERN_INFO "input: %s on %s", xpad->dev.name, path);
+	printk(KERN_INFO "input: %s on %s", xpad->dev->name, path);
 	
 	usb_set_intfdata(intf, xpad);
 	return 0;
@@ -325,7 +331,7 @@ static void xpad_disconnect(struct usb_i
 	usb_set_intfdata(intf, NULL);
 	if (xpad) {
 		usb_unlink_urb(xpad->irq_in);
-		input_unregister_device(&xpad->dev);
+		input_unregister_device(xpad->dev);
 		usb_free_urb(xpad->irq_in);
 		usb_buffer_free(interface_to_usbdev(intf), XPAD_PKT_LEN, xpad->idata, xpad->idata_dma);
 		kfree(xpad);
diff -Nrup -Xdontdiff linux-2.6.0-test5/include/linux/input.h linux-260t5-ic/include/linux/input.h
--- linux-2.6.0-test5/include/linux/input.h	Mon Sep  8 12:50:03 2003
+++ linux-260t5-ic/include/linux/input.h	Wed Sep 10 15:02:46 2003
@@ -12,12 +12,16 @@
 #ifdef __KERNEL__
 #include <linux/time.h>
 #include <linux/list.h>
+#include <linux/device.h>
 #else
 #include <sys/time.h>
 #include <sys/ioctl.h>
 #include <asm/types.h>
 #endif
 
+#define DEBUG 1
+#define INPUT_DEBUG
+
 /*
  * The event structure itself
  */
@@ -811,6 +815,9 @@ struct input_dev {
 
 	struct list_head	h_list;
 	struct list_head	node;
+
+	struct class_device class_dev;
+	unsigned minor;
 };
 
 /*
@@ -888,6 +895,14 @@ struct input_handle {
 	struct list_head	h_node;
 };
 
+struct input_class_interface {
+
+	char *name;
+	mode_t mode;
+	unsigned minor;
+	int minor_base; 
+};
+
 #define to_dev(n) container_of(n,struct input_dev,node)
 #define to_handler(n) container_of(n,struct input_handler,node);
 #define to_handle(n) container_of(n,struct input_handle,d_node)
@@ -902,6 +917,12 @@ void input_unregister_handler(struct inp
 int input_grab_device(struct input_handle *);
 void input_release_device(struct input_handle *);
 
+void input_register_class_dev(struct input_dev *, struct input_class_interface *);
+void input_unregister_class_dev(char *, unsigned );
+
+struct input_dev * input_dev_get(struct input_dev *);
+void input_dev_put(struct input_dev *);
+
 int input_open_device(struct input_handle *);
 void input_close_device(struct input_handle *);
 
diff -Nrup -Xdontdiff linux-2.6.0-test5/lib/kobject.c linux-260t5-ic/lib/kobject.c
--- linux-2.6.0-test5/lib/kobject.c	Mon Sep  8 12:50:27 2003
+++ linux-260t5-ic/lib/kobject.c	Wed Sep 10 15:02:46 2003
@@ -10,7 +10,7 @@
  * about using the kobject interface.
  */
 
-#undef DEBUG
+#define DEBUG
 
 #include <linux/kobject.h>
 #include <linux/string.h>


  reply	other threads:[~2003-11-20 23:26 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-11-19 21:32 [2.6 patch] document that udev isn't yet ready (fwd) Adrian Bunk
2003-11-19 22:14 ` Greg KH
2003-11-19 23:12   ` Martin Schlemmer
2003-11-19 23:26     ` Greg KH
2003-11-20 12:52       ` Pavel Machek
2003-11-20 17:03         ` Greg KH
2003-11-20 22:24           ` Pavel Machek
2003-11-20 22:28           ` driver model for inputs Pavel Machek
2003-11-20 22:48             ` Hanna Linder
2003-11-20 22:55               ` Pavel Machek
2003-11-20 23:18                 ` Hanna Linder [this message]
2003-11-20 23:54                   ` Pavel Machek
2003-11-21  0:35                     ` Hanna Linder
2003-11-20 23:09               ` viro

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56710000.1069370317@w-hlinder \
    --to=hannal@us.ibm.com \
    --cc=akpm@osdl.org \
    --cc=azarah@nosferatu.za.org \
    --cc=bunk@fs.tum.de \
    --cc=greg@kroah.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pavel@ucw.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox