Hi!

This patch moves all the input stuff from majors 10 and 15 to major 13.
(10+15)/2 ;) It works rather well, but support for mouse mixing is gone
for the moment, and there is no devfs support yet. I'll do both tomorrow
hopefully.

-- 
Vojtech Pavlik
SuSE Labs
diff -urN linux-2.3.99-pre3-old/drivers/usb/evdev.c linux/drivers/usb/evdev.c
--- linux-2.3.99-pre3-old/drivers/usb/evdev.c   Wed Feb 23 20:27:14 2000
+++ linux/drivers/usb/evdev.c   Tue Mar 28 21:43:02 2000
@@ -29,9 +29,9 @@
  */
 
 #define EVDEV_MINOR_BASE       64
+#define EVDEV_MINORS           32
 #define EVDEV_BUFFER_SIZE      64
 
-#include <linux/miscdevice.h>
 #include <linux/poll.h>
 #include <linux/malloc.h>
 #include <linux/module.h>
@@ -39,10 +39,9 @@
 #include <linux/input.h>
 
 struct evdev {
-       char name[32];
        int used;
+       int minor;
        struct input_handle handle;
-       struct miscdevice misc;
        wait_queue_head_t wait;
        struct evdev_list *list;
 };
@@ -56,8 +55,7 @@
        struct evdev_list *next;
 };
 
-static unsigned long evdev_miscbits = 0;
-static struct evdev *evdev_base[BITS_PER_LONG];
+static struct evdev *evdev_table[BITS_PER_LONG] = { NULL, /* ... */ };
 
 static void evdev_event(struct input_handle *handle, unsigned int type, unsigned int 
code, int value)
 {
@@ -101,8 +99,7 @@
        *listptr = (*listptr)->next;
        
        if (!--list->evdev->used) {
-               clear_bit(list->evdev->misc.minor - EVDEV_MINOR_BASE, &evdev_miscbits);
-               misc_deregister(&list->evdev->misc);
+               evdev_table[list->evdev->minor] = NULL;
                kfree(list->evdev);
        }
 
@@ -117,7 +114,7 @@
        struct evdev_list *list;
        int i = MINOR(inode->i_rdev) - EVDEV_MINOR_BASE;
 
-       if (i > BITS_PER_LONG || !test_bit(i, &evdev_miscbits))
+       if (i > EVDEV_MINORS || !evdev_table[i])
                return -ENODEV;
 
        if (!(list = kmalloc(sizeof(struct evdev_list), GFP_KERNEL)))
@@ -125,9 +122,9 @@
 
        memset(list, 0, sizeof(struct evdev_list));
 
-       list->evdev = evdev_base[i];
-       list->next = evdev_base[i]->list;
-       evdev_base[i]->list = list;
+       list->evdev = evdev_table[i];
+       list->next = evdev_table[i]->list;
+       evdev_table[i]->list = list;
 
        file->private_data = list;
 
@@ -205,22 +202,22 @@
 static int evdev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct evdev *evdev;
+       int minor;
 
-       if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL)))
+       for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++);
+       if (evdev_table[minor]) {
+               printk(KERN_ERR "evdev: no more free evdev devices\n");
                return -1;
+       }
 
+       if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL)))
+               return -1;
        memset(evdev, 0, sizeof(struct evdev));
 
        init_waitqueue_head(&evdev->wait);
 
-       evdev->misc.minor = ffz(evdev_miscbits);
-       set_bit(evdev->misc.minor, &evdev_miscbits);
-       evdev_base[evdev->misc.minor] = evdev;
-
-       sprintf(evdev->name, "evdev%d", evdev->misc.minor);
-       evdev->misc.name = evdev->name;
-       evdev->misc.minor += EVDEV_MINOR_BASE;
-       evdev->misc.fops = &evdev_fops;
+       evdev->minor = minor;
+       evdev_table[minor] = evdev;
 
        evdev->handle.dev = dev;
        evdev->handle.handler = handler;
@@ -228,11 +225,10 @@
 
        evdev->used = 1;
 
-       misc_register(&evdev->misc);
        input_open_device(&evdev->handle);
 
-       printk("%s: Event device for input%d on misc%d - /dev/input%d\n",
-               evdev->name, dev->number, evdev->misc.minor, evdev->misc.minor - 
EVDEV_MINOR_BASE);
+       printk("event%d: Event device for input%d\n",
+               minor, dev->number);
 
        return 0;
 }
@@ -244,8 +240,7 @@
        input_close_device(handle);
 
        if (!--evdev->used) {
-               clear_bit(evdev->misc.minor - EVDEV_MINOR_BASE, &evdev_miscbits);
-               misc_deregister(&evdev->misc);
+               evdev_table[evdev->minor] = NULL;
                kfree(evdev);
        }
 }
@@ -254,6 +249,8 @@
        event:          evdev_event,
        connect:        evdev_connect,
        disconnect:     evdev_disconnect,
+       fops:           &evdev_fops,
+       minor:          EVDEV_MINOR_BASE,
 };
 
 static int __init evdev_init(void)
diff -urN linux-2.3.99-pre3-old/drivers/usb/input.c linux/drivers/usb/input.c
--- linux-2.3.99-pre3-old/drivers/usb/input.c   Thu Feb 24 19:11:24 2000
+++ linux/drivers/usb/input.c   Wed Mar 29 00:12:16 2000
@@ -45,9 +45,11 @@
 EXPORT_SYMBOL(input_event);
 #endif
 
+#define INPUT_MAJOR    13
+
 static struct input_dev *input_dev = NULL;
 static struct input_handler *input_handler = NULL;
-
+static struct input_handler *input_table[8] = { NULL, /* ... */ };
 static int input_number = 0;
 
 void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int 
value)
@@ -224,6 +226,13 @@
        struct input_dev *dev = input_dev;
 
 /*
+ * Add minors if needed.
+ */
+
+       if (handler->fops != NULL)
+               input_table[handler->minor >> 5] = handler;
+
+/*
  * Add the handler.
  */
 
@@ -263,6 +272,12 @@
 
        *handlerptr = (*handlerptr)->next;
 
+/*
+ * Remove minors.
+ */
+
+       if (handler->fops != NULL)
+               input_table[handler->minor >> 5] = NULL;
 }
 
 void input_open_device(struct input_handle *handle)
@@ -302,3 +317,36 @@
                handleptr = &((*handleptr)->hnext);
        *handleptr = (*handleptr)->hnext;
 }
+
+static int input_open_file(struct inode *inode, struct file *file)
+{
+       struct input_handler *handler = input_table[MINOR(inode->i_rdev) >> 5];
+
+       if (!handler || !handler->fops || !handler->fops->open)
+               return -ENODEV;
+
+       file->f_op = handler->fops;
+
+       return handler->fops->open(inode, file);
+}
+
+static struct file_operations input_fops = {
+       open: input_open_file,
+};
+
+int __init input_init(void)
+{
+       if (register_chrdev(INPUT_MAJOR, "input", &input_fops)) {
+               printk(KERN_ERR "input: unable to register char major %d", 
+INPUT_MAJOR);
+               return -EBUSY;
+       }
+       return 0;
+}
+
+void __exit input_exit(void)
+{
+       unregister_chrdev(INPUT_MAJOR, "input");
+}
+
+module_init(input_init);
+module_exit(input_exit);
diff -urN linux-2.3.99-pre3-old/drivers/usb/joydev.c linux/drivers/usb/joydev.c
--- linux-2.3.99-pre3-old/drivers/usb/joydev.c  Mon Mar 27 22:50:26 2000
+++ linux/drivers/usb/joydev.c  Tue Mar 28 21:52:28 2000
@@ -45,14 +45,15 @@
 #include <linux/poll.h>
 #include <linux/init.h>
 
-#define JOYDEV_MAJOR            15
+#define JOYDEV_MINOR_BASE      0
+#define JOYDEV_MINORS          32
 #define JOYDEV_BUFFER_SIZE     64
 
 struct joydev {
-       char name[32];
        int used;
-       struct input_handle handle;
        int minor;
+       char name[32];
+       struct input_handle handle;
        wait_queue_head_t wait;
        struct joydev *next;
        struct joydev_list *list;
@@ -76,11 +77,10 @@
        struct joydev_list *next;
 };
 
-static unsigned long joydev_minors = 0;
-static struct joydev *joydev_base[BITS_PER_LONG];
+static struct joydev *joydev_table[BITS_PER_LONG];
 
 MODULE_AUTHOR("Vojtech Pavlik <[EMAIL PROTECTED]>");
-MODULE_SUPPORTED_DEVICE("js");
+MODULE_SUPPORTED_DEVICE("input/js");
 
 static int joydev_correct(int value, struct js_corr *corr)
 {
@@ -166,7 +166,7 @@
        *listptr = (*listptr)->next;
        
        if (!--list->joydev->used) {
-               clear_bit(list->joydev->minor, &joydev_minors);
+               joydev_table[list->joydev->minor] = NULL;
                kfree(list->joydev);
        }
 
@@ -179,22 +179,18 @@
 static int joydev_open(struct inode *inode, struct file *file)
 {
        struct joydev_list *list;
-       int i = MINOR(inode->i_rdev);
+       int i = MINOR(inode->i_rdev) - JOYDEV_MINOR_BASE;
 
-       if (MAJOR(inode->i_rdev) != JOYSTICK_MAJOR)
-               return -EINVAL;
-
-       if (i > BITS_PER_LONG || !test_bit(i, &joydev_minors))
+       if (i > JOYDEV_MINORS || !joydev_table[i])
                return -ENODEV;
 
        if (!(list = kmalloc(sizeof(struct joydev_list), GFP_KERNEL)))
                return -ENOMEM;
-
        memset(list, 0, sizeof(struct joydev_list));
 
-       list->joydev = joydev_base[i];
-       list->next = joydev_base[i]->list;
-       joydev_base[i]->list = list;    
+       list->joydev = joydev_table[i];
+       list->next = joydev_table[i]->list;
+       joydev_table[i]->list = list;   
 
        file->private_data = list;
 
@@ -373,27 +369,30 @@
 static int joydev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct joydev *joydev;
-       int i, j;
+       int i, j, minor;
 
        if (!(test_bit(EV_KEY, dev->evbit) && test_bit(EV_ABS, dev->evbit) &&
              test_bit(ABS_X, dev->absbit) && test_bit(ABS_Y, dev->absbit) &&
             (test_bit(BTN_TRIGGER, dev->keybit) || test_bit(BTN_A, dev->keybit)
                || test_bit(BTN_1, dev->keybit)))) return -1;
 
-       if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL)))
+       for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
+       if (joydev_table[minor]) {
+               printk(KERN_ERR "joydev: no more free joydev devices\n");
                return -1;
+       }
 
+       if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL)))
+               return -1;
        memset(joydev, 0, sizeof(struct joydev));
 
        init_waitqueue_head(&joydev->wait);
 
-       if (joydev_minors == -1) {
-               printk("Can't register new joystick - 32 devices already taken.\n");
-               return -1;
-       }
-
        sprintf(joydev->name, "joydev%d", joydev->minor);
 
+       joydev->minor = minor;
+       joydev_table[minor] = joydev;
+
        joydev->handle.dev = dev;
        joydev->handle.handler = handler;
        joydev->handle.private = joydev;
@@ -421,10 +420,6 @@
                        joydev->nkey++;
                }
 
-       joydev->minor = ffz(joydev_minors);
-       set_bit(joydev->minor, &joydev_minors);
-       joydev_base[joydev->minor] = joydev;
-
        for (i = 0; i < joydev->nabs; i++) {
                j = joydev->abspam[i];
                if (dev->absmax[j] == dev->absmin[j]) {
@@ -441,7 +436,7 @@
 
        input_open_device(&joydev->handle);     
 
-       printk("%s: Joystick device for input%d on /dev/js%d\n", joydev->name, 
dev->number, joydev->minor);
+       printk("js%d: Joystick device for input%d\n", minor, dev->number);
 
        return 0;
 }
@@ -453,7 +448,7 @@
        input_close_device(handle);
 
        if (!--joydev->used) {
-               clear_bit(joydev->minor, &joydev_minors);
+               joydev_table[joydev->minor] = NULL;
                kfree(joydev);
        }
 }
@@ -462,14 +457,12 @@
        event:          joydev_event,
        connect:        joydev_connect,
        disconnect:     joydev_disconnect,
+       fops:           &joydev_fops,
+       minor:          JOYDEV_MINOR_BASE,
 };
 
 static int __init joydev_init(void)
 {
-       if (register_chrdev(JOYDEV_MAJOR, "js", &joydev_fops)) {
-               printk(KERN_ERR "joydev: unable to get major %d for joystick\n", 
JOYDEV_MAJOR);
-               return -EBUSY;
-       }
        input_register_handler(&joydev_handler);
        return 0;
 }
@@ -477,8 +470,6 @@
 static void __exit joydev_exit(void)
 {
        input_unregister_handler(&joydev_handler);
-       if (unregister_chrdev(JOYSTICK_MAJOR, "js"))
-               printk(KERN_ERR "js: can't unregister device\n");
 }
 
 module_init(joydev_init);
diff -urN linux-2.3.99-pre3-old/drivers/usb/mousedev.c linux/drivers/usb/mousedev.c
--- linux-2.3.99-pre3-old/drivers/usb/mousedev.c        Mon Mar 27 22:51:05 2000
+++ linux/drivers/usb/mousedev.c        Wed Mar 29 00:11:53 2000
@@ -29,8 +29,8 @@
  */
 
 #define MOUSEDEV_MINOR_BASE    32
+#define MOUSEDEV_MINORS                32
 
-#include <linux/miscdevice.h>
 #include <linux/malloc.h>
 #include <linux/poll.h>
 #include <linux/module.h>
@@ -46,10 +46,9 @@
 #endif
 
 struct mousedev {
-       char name[32];
        int used;
+       int minor;
        struct input_handle handle;
-       struct miscdevice misc;
        wait_queue_head_t wait;
        struct mousedev_list *list;
 };
@@ -71,12 +70,7 @@
 static unsigned char mousedev_genius_seq[] = { 0xe8, 3, 0xe6, 0xe6, 0xe6 };
 static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
 
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-static struct mousedev mousedev_single;
-#else
-static unsigned long mousedev_miscbits = 0;
-static struct mousedev *mousedev_base[BITS_PER_LONG];
-#endif
+static struct mousedev *mousedev_table[BITS_PER_LONG];
 
 static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned 
int code, int value)
 {
@@ -163,13 +157,10 @@
                listptr = &((*listptr)->next);
        *listptr = (*listptr)->next;
        
-#ifndef CONFIG_INPUT_MOUSEDEV_MIX
        if (!--list->mousedev->used) {
-               clear_bit(list->mousedev->misc.minor - MOUSEDEV_MINOR_BASE, 
&mousedev_miscbits);
-               misc_deregister(&list->mousedev->misc);
+               mousedev_table[list->mousedev->minor] = NULL;
                kfree(list->mousedev);
        }
-#endif
 
        kfree(list);
 
@@ -180,29 +171,20 @@
 static int mousedev_open(struct inode * inode, struct file * file)
 {
        struct mousedev_list *list;
-
-#ifndef CONFIG_INPUT_MOUSEDEV_MIX
        int i = MINOR(inode->i_rdev) - MOUSEDEV_MINOR_BASE;
-       if (i > BITS_PER_LONG || !test_bit(i, &mousedev_miscbits))
+
+       if (i > MOUSEDEV_MINORS || !mousedev_table[i])
                return -ENODEV;
-#endif
 
        if (!(list = kmalloc(sizeof(struct mousedev_list), GFP_KERNEL)))
                return -ENOMEM;
 
        memset(list, 0, sizeof(struct mousedev_list));
 
-
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       list->mousedev = &mousedev_single;
-       list->next = mousedev_single.list;
-       mousedev_single.list = list;
-#else
-       list->mousedev = mousedev_base[i];
-       list->next = mousedev_base[i]->list;
-       mousedev_base[i]->list = list;
+       list->mousedev = mousedev_table[i];
+       list->next = mousedev_table[i]->list;
+       mousedev_table[i]->list = list;
        list->mousedev->used++;
-#endif
 
        file->private_data = list;
 
@@ -359,6 +341,8 @@
 
 static int mousedev_connect(struct input_handler *handler, struct input_dev *dev)
 {
+       struct mousedev *mousedev;
+       int minor;
 
        if (!test_bit(EV_KEY, dev->evbit) ||
           (!test_bit(BTN_LEFT, dev->keybit) && !test_bit(BTN_TOUCH, dev->keybit)))
@@ -367,109 +351,62 @@
        if ((!test_bit(EV_REL, dev->evbit) || !test_bit(REL_X, dev->relbit)) &&
            (!test_bit(EV_ABS, dev->evbit) || !test_bit(ABS_X, dev->absbit)))
                return -1;
-       
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       {
-               struct input_handle *handle;
-
-               if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
-                       return -1;
-
-               memset(handle, 0, sizeof(struct input_handle));
 
-               handle->dev = dev;
-               handle->handler = handler;
-               handle->private = &mousedev_single;
-
-               input_open_device(handle);
-
-               printk("mousedev.c: Adding mouse: input%d\n", dev->number);
+       for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
+       if (mousedev_table[minor]) {
+               printk(KERN_ERR "mousedev: no more free mousedev devices\n");
+               return -1;
        }
-#else
-       {
-               struct mousedev *mousedev;
 
-               if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
-                       return -1;
-
-               memset(mousedev, 0, sizeof(struct mousedev));
+       if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))
+               return -1;
+       memset(mousedev, 0, sizeof(struct mousedev));
 
-               mousedev->misc.minor = ffz(mousedev_miscbits);
-               set_bit(mousedev->misc.minor, &mousedev_miscbits);
-               mousedev_base[mousedev->misc.minor] = mousedev;
+       mousedev->minor = minor;
+       mousedev_table[minor] = mousedev;
 
-               sprintf(mousedev->name, "mousedev%d", mousedev->misc.minor);
-               mousedev->misc.name = mousedev->name;
-               mousedev->misc.minor += MOUSEDEV_MINOR_BASE;
-               mousedev->misc.fops = &mousedev_fops;
+       mousedev->handle.dev = dev;
+       mousedev->handle.handler = handler;
+       mousedev->handle.private = mousedev;
 
-               mousedev->handle.dev = dev;
-               mousedev->handle.handler = handler;
-               mousedev->handle.private = mousedev;
+       init_waitqueue_head(&mousedev->wait);
 
-               init_waitqueue_head(&mousedev->wait);
+       mousedev->used = 1;
 
-               mousedev->used = 1;
+       input_open_device(&mousedev->handle);
 
-               misc_register(&mousedev->misc);
-               input_open_device(&mousedev->handle);
-
-               printk("%s: PS/2 mouse device for input%d on misc%d\n",
-                       mousedev->name, dev->number, mousedev->misc.minor);
-       }
-#endif
+       printk("mouse%d: PS/2 mouse device for input%d\n",
+               minor, dev->number);
 
        return 0;
 }
 
 static void mousedev_disconnect(struct input_handle *handle)
 {
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       printk("mousedev.c: Removing mouse: input%d\n", handle->dev->number);
-       input_close_device(handle);
-       kfree(handle);
-#else
        struct mousedev *mousedev = handle->private;
        input_close_device(handle);
        if (!--mousedev->used) {
-               clear_bit(mousedev->misc.minor - MOUSEDEV_MINOR_BASE, 
&mousedev_miscbits);
-               misc_deregister(&mousedev->misc);
+               mousedev_table[mousedev->minor] = NULL;
                kfree(mousedev);
        }
-#endif
 }
        
 static struct input_handler mousedev_handler = {
        event:          mousedev_event,
        connect:        mousedev_connect,
        disconnect:     mousedev_disconnect,
+       fops:           &mousedev_fops,
+       minor:          MOUSEDEV_MINOR_BASE,
 };
 
 static int __init mousedev_init(void)
 {
        input_register_handler(&mousedev_handler);
-
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       memset(&mousedev_single, 0, sizeof(struct mousedev));
-
-       init_waitqueue_head(&mousedev_single.wait);
-       mousedev_single.misc.minor = MOUSEDEV_MINOR_BASE;
-       mousedev_single.misc.name = "mousedev";
-       mousedev_single.misc.fops = &mousedev_fops;
-
-       misc_register(&mousedev_single.misc);
-
-       printk("mousedev: PS/2 mouse device on misc%d\n", mousedev_single.misc.minor);
-#endif
-
        return 0;
 }
 
 static void __exit mousedev_exit(void)
 {
-#ifdef CONFIG_INPUT_MOUSEDEV_MIX
-       misc_deregister(&mousedev_single.misc);
-#endif
        input_unregister_handler(&mousedev_handler);
 }
 
diff -urN linux-2.3.99-pre3-old/include/linux/input.h linux/include/linux/input.h
--- linux-2.3.99-pre3-old/include/linux/input.h Mon Mar 27 22:51:07 2000
+++ linux/include/linux/input.h Tue Mar 28 21:40:26 2000
@@ -433,8 +433,10 @@
        int (*connect)(struct input_handler *handler, struct input_dev *dev);
        void (*disconnect)(struct input_handle *handle);
 
-       struct input_handle *handle;
+       struct file_operations *fops;
+       int minor;
 
+       struct input_handle *handle;
        struct input_handler *next;
 };
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to