2003-11-19 21:32:51

by Adrian Bunk

[permalink] [raw]
Subject: [2.6 patch] document that udev isn't yet ready (fwd)

The trivial documentation patch forwarded below still applies (with a
few lines offset) against 2.6.0-test9-mm4.

Please apply
Adrian


----- Forwarded message from Adrian Bunk <[email protected]> -----

Date: Wed, 8 Oct 2003 14:07:11 +0200
From: Adrian Bunk <[email protected]>
To: Andreas Jellinghaus <[email protected]>,
Greg KH <[email protected]>, Linus Torvalds <[email protected]>
Cc: [email protected]
Subject: [2.6 patch] document that udev isn't yet ready

On Wed, Oct 08, 2003 at 09:30:21AM +0200, Andreas Jellinghaus wrote:
> On Tue, 07 Oct 2003 21:51:27 +0000, Greg KH wrote:
> > And remember, _I_ did not submit that patch to the kernel marking devfs
> > obsolete. Other kernel developers did. And for good reasons, which
> > have all been explained before. Even if udev wasn't even written yet,
> > it would have been done.
>
> "Note that devfs has been obsoleted by udev,"
>
> Most people expect after reading that sentence, that udev can do the
> work devfs did for them. But udev is not ready to do that, even by
> far. Thats why people complain.
>...

The following trivial change to te help text should clarify it:

--- linux-2.6.0-test6-mm4/fs/Kconfig.old 2003-10-08 14:02:15.000000000 +0200
+++ linux-2.6.0-test6-mm4/fs/Kconfig 2003-10-08 14:03:33.000000000 +0200
@@ -784,7 +784,7 @@
ptys, you will also need to enable (and mount) the /dev/pts
filesystem (CONFIG_DEVPTS_FS).

- Note that devfs has been obsoleted by udev,
+ Note that devfs will be obsoleted by udev
<http://www.kernel.org/pub/linux/utils/kernel/hotplug/>.
It has been stripped down to a bare minimum and is only provided for
legacy installations that use its naming scheme which is


> Regards, Andreas

cu
Adrian

--

"Is there not promise of rain?" Ling Tan asked suddenly out
of the darkness. There had been need of rain for many days.
"Only a promise," Lao Er said.
Pearl S. Buck - Dragon Seed


2003-11-19 22:17:10

by Greg KH

[permalink] [raw]
Subject: Re: [2.6 patch] document that udev isn't yet ready (fwd)

On Wed, Nov 19, 2003 at 10:32:38PM +0100, Adrian Bunk wrote:
> The trivial documentation patch forwarded below still applies (with a
> few lines offset) against 2.6.0-test9-mm4.

Hm, with the 006 release, what do you find lacking in udev?

thanks,

greg k-h

2003-11-19 23:11:25

by Martin Schlemmer

[permalink] [raw]
Subject: Re: [2.6 patch] document that udev isn't yet ready (fwd)

On Thu, 2003-11-20 at 00:14, Greg KH wrote:
> On Wed, Nov 19, 2003 at 10:32:38PM +0100, Adrian Bunk wrote:
> > The trivial documentation patch forwarded below still applies (with a
> > few lines offset) against 2.6.0-test9-mm4.
>
> Hm, with the 006 release, what do you find lacking in udev?
>

I am guessing its more driver support, etc. Input devices for
instance do not seem to have any sysfs support yet, and full
initramfs support with udev in there, and udev.permissions setup
to get general permissions, etc right, might make it more advertisable
for the masses (no need to maintain /dev or the initial costs for
users not so interested in the workings of things).

Lets just say from what I have seen from users talking/asking, the
initial setup and seeming 'lack of functionality' is the biggest
blocker.


Cheers,

--
Martin Schlemmer


Attachments:
signature.asc (189.00 B)
This is a digitally signed message part

2003-11-19 23:30:28

by Greg KH

[permalink] [raw]
Subject: Re: [2.6 patch] document that udev isn't yet ready (fwd)

On Thu, Nov 20, 2003 at 01:12:46AM +0200, Martin Schlemmer wrote:
> On Thu, 2003-11-20 at 00:14, Greg KH wrote:
> > On Wed, Nov 19, 2003 at 10:32:38PM +0100, Adrian Bunk wrote:
> > > The trivial documentation patch forwarded below still applies (with a
> > > few lines offset) against 2.6.0-test9-mm4.
> >
> > Hm, with the 006 release, what do you find lacking in udev?
> >
>
> I am guessing its more driver support, etc. Input devices for
> instance do not seem to have any sysfs support yet,

Yes, we do need better driver support. But that's nothing that udev
itself can do :)

I have a number of patches pending for 2.6.1 that will add more driver
support for sysfs.

> and full initramfs support with udev in there,

The people keeping the klibc kernel bk tree have enough support in it to
place udev into initramfs. Again, nothing that udev needs to do for
this.

> and udev.permissions setup to get general permissions, etc right,

We now support wildcards in udev.permissions, forgot to mention that in
the 006 release. So it's just a matter of distros building up a
permissions file that matches their needs.

> might make it more advertisable for the masses (no need to maintain
> /dev or the initial costs for users not so interested in the workings
> of things).

Mostly it's a implementation issue with a distro to get everything tied
together properly. Much like devfs had issues when it was added to the
kernel and people had to tweak userspace a bunch to get it to work
properly.

> Lets just say from what I have seen from users talking/asking, the
> initial setup and seeming 'lack of functionality' is the biggest
> blocker.

Initial setup will be done by distros when they implement it into their
system. What do you mean by "lack of functionality"? What users are
telling you this, and what functions are they? Please feel free to
forward them on to me, otherwise I will not know...

Now yes, I do know that udev still has a way to go to be solid and
mature, but it is usable for the most part :)

thanks,

greg k-h

2003-11-20 13:08:35

by Pavel Machek

[permalink] [raw]
Subject: Re: [2.6 patch] document that udev isn't yet ready (fwd)

Hi!

> > > Hm, with the 006 release, what do you find lacking in udev?
> > >
> >
> > I am guessing its more driver support, etc. Input devices for
> > instance do not seem to have any sysfs support yet,
>
> Yes, we do need better driver support. But that's nothing that udev
> itself can do :)
>
> I have a number of patches pending for 2.6.1 that will add more driver
> support for sysfs.
>
What drivers did you convert? sysfs-for-inputs would
be *very* welcome.

--
Pavel
Written on sharp zaurus, because my Velo1 broke. If you have Velo you don't need...

2003-11-20 17:16:42

by Greg KH

[permalink] [raw]
Subject: Re: [2.6 patch] document that udev isn't yet ready (fwd)

On Thu, Nov 20, 2003 at 01:52:29PM +0100, Pavel Machek wrote:
> Hi!
>
> > > > Hm, with the 006 release, what do you find lacking in udev?
> > > >
> > >
> > > I am guessing its more driver support, etc. Input devices for
> > > instance do not seem to have any sysfs support yet,
> >
> > Yes, we do need better driver support. But that's nothing that udev
> > itself can do :)
> >
> > I have a number of patches pending for 2.6.1 that will add more driver
> > support for sysfs.
> >
> What drivers did you convert? sysfs-for-inputs would
> be *very* welcome.

I have patches for the memory devices, all sound drivers (ALSA and OSS),
frame buffer devices, and misc devices in my linuxusb.bkbits.net/usb-2.5
tree. Hanna Linder is working on the input sysfs patches, and has
posted some work in the past.

thanks,

greg k-h

2003-11-20 22:27:50

by Pavel Machek

[permalink] [raw]
Subject: driver model for inputs

Hi!

Greg said:

> I have patches for the memory devices, all sound drivers (ALSA and OSS),
> frame buffer devices, and misc devices in my linuxusb.bkbits.net/usb-2.5
> tree. Hanna Linder is working on the input sysfs patches, and has
> posted some work in the past.

I could only find 2.5.70 patches, and those did not seem "good enough"
to do power managment with them. Do you have some newer version?

[One of machines near me needs keyboard to be reinitialized after S3
sleep... And users are starting to hit that, too.]
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

2003-11-20 22:23:57

by Pavel Machek

[permalink] [raw]
Subject: Re: [2.6 patch] document that udev isn't yet ready (fwd)

Hi!

> > > > > Hm, with the 006 release, what do you find lacking in udev?
> > > > >
> > > >
> > > > I am guessing its more driver support, etc. Input devices for
> > > > instance do not seem to have any sysfs support yet,
> > >
> > > Yes, we do need better driver support. But that's nothing that udev
> > > itself can do :)
> > >
> > > I have a number of patches pending for 2.6.1 that will add more driver
> > > support for sysfs.
> > >
> > What drivers did you convert? sysfs-for-inputs would
> > be *very* welcome.
>
> I have patches for the memory devices, all sound drivers (ALSA and OSS),
> frame buffer devices, and misc devices in my linuxusb.bkbits.net/usb-2.5
> tree. Hanna Linder is working on the input sysfs patches, and has
> posted some work in the past.

Do you have URL/her e-mail address? I don't remember seeing anything
:-(.
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

2003-11-20 22:55:59

by Pavel Machek

[permalink] [raw]
Subject: Re: driver model for inputs

Hi!

> >> tree. Hanna Linder is working on the input sysfs patches, and has
> >> posted some work in the past.
> >
> > I could only find 2.5.70 patches, and those did not seem "good enough"
> > to do power managment with them. Do you have some newer version?
> >
> > [One of machines near me needs keyboard to be reinitialized after S3
> > sleep... And users are starting to hit that, too.]
>
> I have test8 version of the patch which mostly works. The only problem now
> is a panic when I remove the mouse... The input layer is sorta hard to follow
> you know :) Im guessing it is a reference counting issue. Do you want what I
> have now or can I update it to test9 and see if taking a break from staring
> at it has helped?

If you could post -test8 version, that would be great.
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

2003-11-20 22:49:58

by Hanna Linder

[permalink] [raw]
Subject: Re: driver model for inputs

--On Thursday, November 20, 2003 11:28:25 PM +0100 Pavel Machek <[email protected]> wrote:


>> tree. Hanna Linder is working on the input sysfs patches, and has
>> posted some work in the past.
>
> I could only find 2.5.70 patches, and those did not seem "good enough"
> to do power managment with them. Do you have some newer version?
>
> [One of machines near me needs keyboard to be reinitialized after S3
> sleep... And users are starting to hit that, too.]
> Pavel

Hi Pavel,

I have test8 version of the patch which mostly works. The only problem now
is a panic when I remove the mouse... The input layer is sorta hard to follow
you know :) Im guessing it is a reference counting issue. Do you want what I
have now or can I update it to test9 and see if taking a break from staring
at it has helped?

Thanks.

Hanna

2003-11-20 23:11:06

by Al Viro

[permalink] [raw]
Subject: Re: driver model for inputs

On Thu, Nov 20, 2003 at 02:48:44PM -0800, Hanna Linder wrote:
> --On Thursday, November 20, 2003 11:28:25 PM +0100 Pavel Machek <[email protected]> wrote:
>
>
> >> tree. Hanna Linder is working on the input sysfs patches, and has
> >> posted some work in the past.
> >
> > I could only find 2.5.70 patches, and those did not seem "good enough"
> > to do power managment with them. Do you have some newer version?
> >
> > [One of machines near me needs keyboard to be reinitialized after S3
> > sleep... And users are starting to hit that, too.]
> > Pavel
>
> Hi Pavel,
>
> I have test8 version of the patch which mostly works. The only problem now
> is a panic when I remove the mouse... The input layer is sorta hard to follow
> you know :) Im guessing it is a reference counting issue. Do you want what I
> have now or can I update it to test9 and see if taking a break from staring
> at it has helped?

Post it for review, please. We are only now getting somewhat close to fixing
sysfs-related breakage in netdev and input layer is much more vile when it
comes to locking (and lack of it) and lifetime rules (ditto).

2003-11-20 23:26:13

by Hanna Linder

[permalink] [raw]
Subject: Re: driver model for inputs

--On Thursday, November 20, 2003 11:55:04 PM +0100 Pavel Machek <[email protected]> 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>

2003-11-20 23:54:49

by Pavel Machek

[permalink] [raw]
Subject: Re: driver model for inputs

Hi!

> > If you could post -test8 version, that would be great.
>
> 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...

[Snip snip; most of patch seems to be moving from something.dev to
something-> dev]

This seems to deal with udev aspect of the problem... Do you have any
ideas have powermanagment fits into the picture? I need a way to hook
suspend() and resume() methods, so that I can fix keyboard/mouse after
sleep.
Pavel

--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

2003-11-21 00:36:15

by Hanna Linder

[permalink] [raw]
Subject: Re: driver model for inputs

--On Friday, November 21, 2003 12:54:10 AM +0100 Pavel Machek <[email protected]> wrote:

>
> [Snip snip; most of patch seems to be moving from something.dev to
> something-> dev]

To take advantage of the internal kobject reference counting. The main
changes are the registering and unregistering of class objects which gives
the input class and devices in the sysfs tree.

>
> This seems to deal with udev aspect of the problem... Do you have any
> ideas have powermanagment fits into the picture? I need a way to hook
> suspend() and resume() methods, so that I can fix keyboard/mouse after
> sleep.
> Pavel

I dont know much about the power management stuff yet. Pat or Greg could
probably tell you more than I can.

Hanna