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]