CINXE.COM
LKML: Dmitry Torokhov: [patch 25/28] input core: implement class hierachy
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: Dmitry Torokhov: [patch 25/28] input core: implement class hierachy</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by Dmitry Torokhov" href="/groupie.php?aid=10658" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2005"> [2005]</a> 聽 <a class="nb" href="/lkml/2005/9"> [Sep]</a> 聽 <a class="nb" href="/lkml/2005/9/15"> [15]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2005/9/15/57" onclick="this.href='/lkml/headers'+'/2005/9/15/57';">[headers]</a>聽 <a href="/lkml/bounce/2005/9/15/57">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2005/9/15/58">First message in thread</a></li><li><a href="/lkml/2005/9/15/58">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/9/15/54">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/55">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/56">Dmitry Torokhov</a></li><li class="origin"><a href="">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/59">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/60">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/61">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/9/27/26">Greg KH</a><ul><li><a href="/lkml/2005/9/27/45">Markus Lidel</a></li></ul></li></ul></li><li><a href="/lkml/2005/9/15/63">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/9/15/101">Marcel Holtmann</a><ul><li><a href="/lkml/2005/9/15/200">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/9/15/206">Marcel Holtmann</a></li></ul></li></ul></li></ul></li><li><a href="/lkml/2005/9/15/64">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/65">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/9/27/29">Greg KH</a></li></ul></li><li><a href="/lkml/2005/9/15/66">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/67">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/68">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/70">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/71">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/72">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/89">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/90">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/91">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/92">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/93">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/10/5/315">Greg KH</a><ul><li><a href="/lkml/2005/10/5/317">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/10/5/330">Greg KH</a></li></ul></li></ul></li></ul></li><li><a href="/lkml/2005/9/15/94">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/95">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/96">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/104">Marcel Holtmann</a><ul><li><a href="/lkml/2005/9/15/201">Dmitry Torokhov</a></li></ul></li><li><a href="/lkml/2005/9/15/106">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/107">Dmitry Torokhov</a></li><li><a href="/lkml/2005/9/15/388">Andrew Morton</a><ul><li><a href="/lkml/2005/9/15/389">Dmitry Torokhov</a><ul><li><a href="/lkml/2005/9/16/2">Andrew Morton</a><ul><li><a href="/lkml/2005/9/16/3">Dmitry Torokhov</a></li></ul></li></ul></li></ul></li></ul></li></ul><div class="threadlist">Patch in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2005/9/15/57/1">Get diff 1</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Thu, 15 Sep 2005 02:01:56 -0500</td></tr><tr><td class="lp">From</td><td class="rp" itemprop="author">Dmitry Torokhov <></td></tr><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[patch 25/28] input core: implement class hierachy</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">Input: create 'input' class hierarchy<br /><br />Make 'input' a root class and add 'devices' and 'interfaces'<br />subclasses. 'devices' subclass will contain input_dev class<br />devices whereas 'interfaces' will have devices created by<br />input handlers, such as evdev, mousedev, etc.<br /><br />Signed-off-by: Dmitry Torokhov <dtor@mail.ru><br />---<br /><br /> drivers/input/evdev.c | 12 +--<br /> drivers/input/input.c | 178 +++++++++++++++++++++++++++++++++--------------<br /> drivers/input/joydev.c | 12 +--<br /> drivers/input/mousedev.c | 70 +++++++++---------<br /> drivers/input/tsdev.c | 23 ++----<br /> include/linux/input.h | 9 +-<br /> 6 files changed, 188 insertions(+), 116 deletions(-)<br /><br />Index: work/drivers/input/input.c<br />===================================================================<br />--- work.orig/drivers/input/input.c<br />+++ work/drivers/input/input.c<br />@@ -32,6 +32,8 @@ EXPORT_SYMBOL(input_register_device);<br /> EXPORT_SYMBOL(input_unregister_device);<br /> EXPORT_SYMBOL(input_register_handler);<br /> EXPORT_SYMBOL(input_unregister_handler);<br />+EXPORT_SYMBOL(input_create_interface_device);<br />+EXPORT_SYMBOL(input_destroy_interface_device);<br /> EXPORT_SYMBOL(input_grab_device);<br /> EXPORT_SYMBOL(input_release_device);<br /> EXPORT_SYMBOL(input_open_device);<br />@@ -39,10 +41,14 @@ EXPORT_SYMBOL(input_close_device);<br /> EXPORT_SYMBOL(input_accept_process);<br /> EXPORT_SYMBOL(input_flush_device);<br /> EXPORT_SYMBOL(input_event);<br />-EXPORT_SYMBOL(input_class);<br />+EXPORT_SYMBOL(input_interface_class);<br /> <br /> #define INPUT_DEVICES 256<br /> <br />+static struct class input_class = {<br />+ .name = "input",<br />+};<br />+<br /> static LIST_HEAD(input_dev_list);<br /> static LIST_HEAD(input_handler_list);<br /> <br />@@ -496,7 +502,7 @@ static int input_devices_read(char *buf,<br /> <br /> list_for_each_entry(dev, &input_dev_list, node) {<br /> <br />- path = dev->dynalloc ? kobject_get_path(&dev->cdev.kobj, GFP_KERNEL) : NULL;<br />+ path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL);<br /> <br /> len = sprintf(buf, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n",<br /> dev->id.bustype, dev->id.vendor, dev->id.product, dev->id.version);<br />@@ -725,7 +731,8 @@ static void input_dev_release(struct cla<br /> }<br /> <br /> static struct class input_dev_class = {<br />- .name = "input_dev",<br />+ .name = "devices",<br />+ .parent = &input_class,<br /> .release = input_dev_release,<br /> .class_dev_attrs = input_dev_attrs,<br /> };<br />@@ -737,8 +744,6 @@ struct input_dev *input_allocate_device(<br /> dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);<br /> if (dev) {<br /> dev->dynalloc = 1;<br />- dev->cdev.class = &input_dev_class;<br />- class_device_initialize(&dev->cdev);<br /> INIT_LIST_HEAD(&dev->h_list);<br /> INIT_LIST_HEAD(&dev->node);<br /> }<br />@@ -746,38 +751,24 @@ struct input_dev *input_allocate_device(<br /> return dev;<br /> }<br /> <br />-static void input_register_classdevice(struct input_dev *dev)<br />+int input_register_device(struct input_dev *dev)<br /> {<br /> static atomic_t input_no = ATOMIC_INIT(0);<br />- const char *path;<br />-<br />- __module_get(THIS_MODULE);<br />-<br />- dev->dev = dev->cdev.dev;<br />-<br />- snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id),<br />- "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);<br />-<br />- path = kobject_get_path(&dev->cdev.class->subsys.kset.kobj, GFP_KERNEL);<br />- printk(KERN_INFO "input: %s/%s as %s\n",<br />- dev->name ? dev->name : "Unspecified device",<br />- path ? path : "", dev->cdev.class_id);<br />- kfree(path);<br />-<br />- class_device_add(&dev->cdev);<br />- sysfs_create_group(&dev->cdev.kobj, &input_dev_id_attr_group);<br />- sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group);<br />-}<br />-<br />-void input_register_device(struct input_dev *dev)<br />-{<br /> struct input_handle *handle;<br /> struct input_handler *handler;<br /> struct input_device_id *id;<br />+ const char *path;<br />+ int error;<br /> <br />- set_bit(EV_SYN, dev->evbit);<br />+ if (!dev->dynalloc) {<br />+ printk(KERN_WARNING "input: device %s is statically allocated, will not register\n"<br />+ "Please convert to input_allocate_device() or contact dtor_core@ameritech.net\n",<br />+ dev->name ? dev->name : "<Unknown>");<br />+ return -EINVAL;<br />+ }<br /> <br /> init_MUTEX(&dev->sem);<br />+ set_bit(EV_SYN, dev->evbit);<br /> <br /> /*<br /> * If delay and period are pre-set by the driver, then autorepeating<br />@@ -801,23 +792,46 @@ void input_register_device(struct input_<br /> if ((handle = handler->connect(handler, dev, id)))<br /> input_link_handle(handle);<br /> <br />+ dev->cdev.class = &input_dev_class;<br />+ snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id),<br />+ "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);<br /> <br />- if (dev->dynalloc)<br />- input_register_classdevice(dev);<br />+ error = class_device_register(&dev->cdev);<br />+ if (error)<br />+ return error;<br />+<br />+ error = sysfs_create_group(&dev->cdev.kobj, &input_dev_id_attr_group);<br />+ if (error)<br />+ goto fail1;<br />+<br />+ error = sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group);<br />+ if (error)<br />+ goto fail2;<br />+<br />+ path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL);<br />+ printk(KERN_INFO "input: %s as %s\n",<br />+ dev->name ? dev->name : "Unspecified device", path ? path : "N/A");<br />+ kfree(path);<br /> <br /> #ifdef CONFIG_HOTPLUG<br /> input_call_hotplug("add", dev);<br /> #endif<br /> <br /> input_wakeup_procfs_readers();<br />+<br />+ __module_get(THIS_MODULE);<br />+<br />+ return 0;<br />+<br />+ fail2: sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group);<br />+ fail1: sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group);<br />+ return error;<br /> }<br /> <br /> void input_unregister_device(struct input_dev *dev)<br /> {<br /> struct list_head * node, * next;<br /> <br />- if (!dev) return;<br />-<br /> del_timer_sync(&dev->timer);<br /> <br /> list_for_each_safe(node, next, &dev->h_list) {<br />@@ -833,11 +847,9 @@ void input_unregister_device(struct inpu<br /> <br /> list_del_init(&dev->node);<br /> <br />- if (dev->dynalloc) {<br />- sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group);<br />- sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group);<br />- class_device_unregister(&dev->cdev);<br />- }<br />+ sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group);<br />+ sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group);<br />+ class_device_unregister(&dev->cdev);<br /> <br /> input_wakeup_procfs_readers();<br /> }<br />@@ -885,6 +897,63 @@ void input_unregister_handler(struct inp<br /> input_wakeup_procfs_readers();<br /> }<br /> <br />+<br />+static void input_interface_dev_release(struct class_device *class_dev)<br />+{<br />+ kfree(class_dev);<br />+ module_put(THIS_MODULE);<br />+}<br />+<br />+struct class input_interface_class = {<br />+ .name = "interfaces",<br />+ .parent = &input_class,<br />+ .release = input_interface_dev_release,<br />+};<br />+<br />+int input_create_interface_device(struct input_handle *handle, dev_t devt)<br />+{<br />+ struct class_device *dev;<br />+ int error;<br />+<br />+ dev = kzalloc(sizeof(struct class_device), GFP_KERNEL);<br />+ if (!dev)<br />+ return -ENOMEM;<br />+<br />+ dev->devt = devt;<br />+ dev->class = &input_interface_class;<br />+ strlcpy(dev->class_id, handle->name, BUS_ID_SIZE);<br />+<br />+ error = class_device_register(dev);<br />+ if (error)<br />+ return error;<br />+<br />+ if (handle->dev) {<br />+ sysfs_create_link(&dev->kobj, &handle->dev->cdev.kobj, "device");<br />+ sysfs_create_link(&handle->dev->cdev.kobj, &dev->kobj,<br />+ kobject_name(&dev->kobj));<br />+ }<br />+<br />+ handle->intf_dev = dev;<br />+<br />+ __module_get(THIS_MODULE);<br />+<br />+ return 0;<br />+}<br />+<br />+void input_destroy_interface_device(struct input_handle *handle)<br />+{<br />+ if (handle->intf_dev) {<br />+ if (handle->dev) {<br />+ sysfs_remove_link(&handle->dev->cdev.kobj,<br />+ kobject_name(&handle->intf_dev->kobj));<br />+ sysfs_remove_link(&handle->intf_dev->kobj, "device");<br />+ }<br />+<br />+ class_device_unregister(handle->intf_dev);<br />+ handle->intf_dev = NULL;<br />+ }<br />+}<br />+<br /> static int input_open_file(struct inode *inode, struct file *file)<br /> {<br /> struct input_handler *handler = input_table[iminor(inode) >> 5];<br />@@ -921,40 +990,44 @@ static struct file_operations input_fops<br /> .open = input_open_file,<br /> };<br /> <br />-struct class *input_class;<br />-<br /> static int __init input_init(void)<br /> {<br /> int err;<br /> <br />- err = class_register(&input_dev_class);<br />+ err = class_register(&input_class);<br /> if (err) {<br />- printk(KERN_ERR "input: unable to register input_dev class\n");<br />+ printk(KERN_ERR "input: unable to register input class\n");<br /> return err;<br /> }<br /> <br />- input_class = class_create(THIS_MODULE, "input");<br />- if (IS_ERR(input_class)) {<br />- printk(KERN_ERR "input: unable to register input class\n");<br />- err = PTR_ERR(input_class);<br />+ err = class_register(&input_dev_class);<br />+ if (err) {<br />+ printk(KERN_ERR "input: unable to register device class\n");<br /> goto fail1;<br /> }<br /> <br />+ err = class_register(&input_interface_class);<br />+ if (err) {<br />+ printk(KERN_ERR "input: unable to register handler class\n");<br />+ goto fail2;<br />+ }<br />+<br /> err = input_proc_init();<br /> if (err)<br />- goto fail2;<br />+ goto fail3;<br /> <br /> err = register_chrdev(INPUT_MAJOR, "input", &input_fops);<br /> if (err) {<br /> printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);<br />- goto fail3;<br />+ goto fail4;<br /> }<br /> <br /> return 0;<br /> <br />- fail3: input_proc_exit();<br />- fail2: class_destroy(input_class);<br />- fail1: class_unregister(&input_dev_class);<br />+ fail4: input_proc_exit();<br />+ fail3: class_unregister(&input_interface_class);<br />+ fail2: class_unregister(&input_dev_class);<br />+ fail1: class_unregister(&input_class);<br /> return err;<br /> }<br /> <br />@@ -962,8 +1035,9 @@ static void __exit input_exit(void)<br /> {<br /> input_proc_exit();<br /> unregister_chrdev(INPUT_MAJOR, "input");<br />- class_destroy(input_class);<br />+ class_unregister(&input_interface_class);<br /> class_unregister(&input_dev_class);<br />+ class_unregister(&input_class);<br /> }<br /> <br /> subsys_initcall(input_init);<br />Index: work/include/linux/input.h<br />===================================================================<br />--- work.orig/include/linux/input.h<br />+++ work/include/linux/input.h<br />@@ -891,7 +891,6 @@ struct input_dev {<br /> unsigned int users;<br /> <br /> struct class_device cdev;<br />- struct device *dev; /* will be removed soon */<br /> <br /> int dynalloc; /* temporarily */<br /> <br />@@ -970,6 +969,7 @@ struct input_handle {<br /> <br /> int open;<br /> char *name;<br />+ struct class_device *intf_dev;<br /> <br /> struct input_dev *dev;<br /> struct input_handler *handler;<br />@@ -1006,12 +1006,15 @@ static inline void input_put_device(stru<br /> class_device_put(&dev->cdev);<br /> }<br /> <br />-void input_register_device(struct input_dev *);<br />+int input_register_device(struct input_dev *);<br /> void input_unregister_device(struct input_dev *);<br /> <br /> void input_register_handler(struct input_handler *);<br /> void input_unregister_handler(struct input_handler *);<br /> <br />+int input_create_interface_device(struct input_handle *, dev_t);<br />+void input_destroy_interface_device(struct input_handle *);<br />+<br /> int input_grab_device(struct input_handle *);<br /> void input_release_device(struct input_handle *);<br /> <br />@@ -1074,7 +1077,7 @@ static inline void input_set_abs_params(<br /> dev->absbit[LONG(axis)] |= BIT(axis);<br /> }<br /> <br />-extern struct class *input_class;<br />+extern struct class input_interface_class;<br /> <br /> #endif<br /> #endif<br />Index: work/drivers/input/evdev.c<br />===================================================================<br />--- work.orig/drivers/input/evdev.c<br />+++ work/drivers/input/evdev.c<br />@@ -669,9 +669,9 @@ static struct input_handle *evdev_connec<br /> return NULL;<br /> }<br /> <br />- if (!(evdev = kmalloc(sizeof(struct evdev), GFP_KERNEL)))<br />+ evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);<br />+ if (!evdev)<br /> return NULL;<br />- memset(evdev, 0, sizeof(struct evdev));<br /> <br /> INIT_LIST_HEAD(&evdev->list);<br /> init_waitqueue_head(&evdev->wait);<br />@@ -686,9 +686,8 @@ static struct input_handle *evdev_connec<br /> <br /> evdev_table[minor] = evdev;<br /> <br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor),<br />- dev->dev, "event%d", minor);<br />+ input_create_interface_device(&evdev->handle,<br />+ MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor));<br /> <br /> return &evdev->handle;<br /> }<br />@@ -698,8 +697,7 @@ static void evdev_disconnect(struct inpu<br /> struct evdev *evdev = handle->private;<br /> struct evdev_list *list;<br /> <br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev->minor));<br />+ input_destroy_interface_device(handle);<br /> evdev->exist = 0;<br /> <br /> if (evdev->open) {<br />Index: work/drivers/input/joydev.c<br />===================================================================<br />--- work.orig/drivers/input/joydev.c<br />+++ work/drivers/input/joydev.c<br />@@ -456,9 +456,9 @@ static struct input_handle *joydev_conne<br /> return NULL;<br /> }<br /> <br />- if (!(joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL)))<br />+ joydev = kmalloc(sizeof(struct joydev), GFP_KERNEL);<br />+ if (!joydev)<br /> return NULL;<br />- memset(joydev, 0, sizeof(struct joydev));<br /> <br /> INIT_LIST_HEAD(&joydev->list);<br /> init_waitqueue_head(&joydev->wait);<br />@@ -513,10 +513,8 @@ static struct input_handle *joydev_conne<br /> <br /> joydev_table[minor] = joydev;<br /> <br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor),<br />- dev->dev, "js%d", minor);<br />-<br />+ input_create_interface_device(&joydev->handle,<br />+ MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor));<br /> return &joydev->handle;<br /> }<br /> <br />@@ -525,7 +523,7 @@ static void joydev_disconnect(struct inp<br /> struct joydev *joydev = handle->private;<br /> struct joydev_list *list;<br /> <br />- class_device_destroy(input_class, MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + joydev->minor));<br />+ input_destroy_interface_device(handle);<br /> joydev->exist = 0;<br /> <br /> if (joydev->open) {<br />Index: work/drivers/input/mousedev.c<br />===================================================================<br />--- work.orig/drivers/input/mousedev.c<br />+++ work/drivers/input/mousedev.c<br />@@ -202,7 +202,7 @@ static void mousedev_key_event(struct mo<br /> case BTN_SIDE: index = 3; break;<br /> case BTN_4:<br /> case BTN_EXTRA: index = 4; break;<br />- default: return;<br />+ default: return;<br /> }<br /> <br /> if (value) {<br />@@ -327,7 +327,7 @@ static void mousedev_event(struct input_<br /> mousedev->pkt_count++;<br /> /* Input system eats duplicate events, but we need all of them<br /> * to do correct averaging so apply present one forward<br />- */<br />+ */<br /> fx(0) = fx(1);<br /> fy(0) = fy(1);<br /> }<br />@@ -617,6 +617,33 @@ static struct file_operations mousedev_f<br /> .fasync = mousedev_fasync,<br /> };<br /> <br />+<br />+static void mousedev_init_mousedev(struct mousedev *mousedev, struct input_handler *handler,<br />+ struct input_dev *dev, int minor)<br />+{<br />+ memset(mousedev, 0, sizeof(struct mousedev));<br />+<br />+ INIT_LIST_HEAD(&mousedev->list);<br />+ init_waitqueue_head(&mousedev->wait);<br />+<br />+ if (minor == MOUSEDEV_MIX)<br />+ strcpy(mousedev->name, "mice");<br />+ else<br />+ sprintf(mousedev->name, "mouse%d", minor);<br />+<br />+ mousedev->minor = minor;<br />+ mousedev->exist = 1;<br />+ mousedev->handle.dev = dev;<br />+ mousedev->handle.name = mousedev->name;<br />+ mousedev->handle.handler = handler;<br />+ mousedev->handle.private = mousedev;<br />+<br />+ mousedev_table[minor] = mousedev;<br />+<br />+ input_create_interface_device(&mousedev->handle,<br />+ MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor));<br />+}<br />+<br /> static struct input_handle *mousedev_connect(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id)<br /> {<br /> struct mousedev *mousedev;<br />@@ -628,30 +655,15 @@ static struct input_handle *mousedev_con<br /> return NULL;<br /> }<br /> <br />- if (!(mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL)))<br />+ mousedev = kmalloc(sizeof(struct mousedev), GFP_KERNEL);<br />+ if (!mousedev)<br /> return NULL;<br />- memset(mousedev, 0, sizeof(struct mousedev));<br /> <br />- INIT_LIST_HEAD(&mousedev->list);<br />- init_waitqueue_head(&mousedev->wait);<br />-<br />- mousedev->minor = minor;<br />- mousedev->exist = 1;<br />- mousedev->handle.dev = dev;<br />- mousedev->handle.name = mousedev->name;<br />- mousedev->handle.handler = handler;<br />- mousedev->handle.private = mousedev;<br />- sprintf(mousedev->name, "mouse%d", minor);<br />+ mousedev_init_mousedev(mousedev, handler, dev, minor);<br /> <br /> if (mousedev_mix.open)<br /> input_open_device(&mousedev->handle);<br /> <br />- mousedev_table[minor] = mousedev;<br />-<br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),<br />- dev->dev, "mouse%d", minor);<br />-<br /> return &mousedev->handle;<br /> }<br /> <br />@@ -660,8 +672,7 @@ static void mousedev_disconnect(struct i<br /> struct mousedev *mousedev = handle->private;<br /> struct mousedev_list *list;<br /> <br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + mousedev->minor));<br />+ input_destroy_interface_device(handle);<br /> mousedev->exist = 0;<br /> <br /> if (mousedev->open) {<br />@@ -701,7 +712,7 @@ static struct input_device_id mousedev_i<br /> .absbit = { BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) | BIT(ABS_TOOL_WIDTH) },<br /> }, /* A touchpad */<br /> <br />- { }, /* Terminating entry */<br />+ { }, /* Terminating entry */<br /> };<br /> <br /> MODULE_DEVICE_TABLE(input, mousedev_ids);<br />@@ -727,15 +738,7 @@ static int __init mousedev_init(void)<br /> {<br /> input_register_handler(&mousedev_handler);<br /> <br />- memset(&mousedev_mix, 0, sizeof(struct mousedev));<br />- INIT_LIST_HEAD(&mousedev_mix.list);<br />- init_waitqueue_head(&mousedev_mix.wait);<br />- mousedev_table[MOUSEDEV_MIX] = &mousedev_mix;<br />- mousedev_mix.exist = 1;<br />- mousedev_mix.minor = MOUSEDEV_MIX;<br />-<br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX), NULL, "mice");<br />+ mousedev_init_mousedev(&mousedev_mix, &mousedev_handler, NULL, MOUSEDEV_MIX);<br /> <br /> #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX<br /> if (!(psaux_registered = !misc_register(&psaux_mouse)))<br />@@ -753,8 +756,7 @@ static void __exit mousedev_exit(void)<br /> if (psaux_registered)<br /> misc_deregister(&psaux_mouse);<br /> #endif<br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX));<br />+ input_destroy_interface_device(&mousedev_mix.handle);<br /> input_unregister_handler(&mousedev_handler);<br /> }<br /> <br />Index: work/drivers/input/tsdev.c<br />===================================================================<br />--- work.orig/drivers/input/tsdev.c<br />+++ work/drivers/input/tsdev.c<br />@@ -35,7 +35,7 @@<br /> * e-mail - mail your message to <jsimmons@infradead.org>.<br /> */<br /> <br />-#define TSDEV_MINOR_BASE 128<br />+#define TSDEV_MINOR_BASE 128<br /> #define TSDEV_MINORS 32<br /> /* First 16 devices are h3600_ts compatible; second 16 are h3600_tsraw */<br /> #define TSDEV_MINOR_MASK 15<br />@@ -378,9 +378,9 @@ static struct input_handle *tsdev_connec<br /> return NULL;<br /> }<br /> <br />- if (!(tsdev = kmalloc(sizeof(struct tsdev), GFP_KERNEL)))<br />+ tsdev = kzalloc(sizeof(struct tsdev), GFP_KERNEL);<br />+ if (!tsdev)<br /> return NULL;<br />- memset(tsdev, 0, sizeof(struct tsdev));<br /> <br /> INIT_LIST_HEAD(&tsdev->list);<br /> init_waitqueue_head(&tsdev->wait);<br />@@ -395,24 +395,22 @@ static struct input_handle *tsdev_connec<br /> tsdev->handle.private = tsdev;<br /> <br /> /* Precompute the rough calibration matrix */<br />- delta = dev->absmax [ABS_X] - dev->absmin [ABS_X] + 1;<br />+ delta = dev->absmax[ABS_X] - dev->absmin[ABS_X] + 1;<br /> if (delta == 0)<br /> delta = 1;<br /> tsdev->cal.xscale = (xres << 8) / delta;<br />- tsdev->cal.xtrans = - ((dev->absmin [ABS_X] * tsdev->cal.xscale) >> 8);<br />+ tsdev->cal.xtrans = - ((dev->absmin[ABS_X] * tsdev->cal.xscale) >> 8);<br /> <br />- delta = dev->absmax [ABS_Y] - dev->absmin [ABS_Y] + 1;<br />+ delta = dev->absmax[ABS_Y] - dev->absmin[ABS_Y] + 1;<br /> if (delta == 0)<br /> delta = 1;<br /> tsdev->cal.yscale = (yres << 8) / delta;<br />- tsdev->cal.ytrans = - ((dev->absmin [ABS_Y] * tsdev->cal.yscale) >> 8);<br />+ tsdev->cal.ytrans = - ((dev->absmin[ABS_Y] * tsdev->cal.yscale) >> 8);<br /> <br /> tsdev_table[minor] = tsdev;<br /> <br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor),<br />- dev->dev, "ts%d", minor);<br />-<br />+ input_create_interface_device(&tsdev->handle,<br />+ MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor));<br /> return &tsdev->handle;<br /> }<br /> <br />@@ -421,8 +419,7 @@ static void tsdev_disconnect(struct inpu<br /> struct tsdev *tsdev = handle->private;<br /> struct tsdev_list *list;<br /> <br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + tsdev->minor));<br />+ input_destroy_interface_device(handle);<br /> tsdev->exist = 0;<br /> <br /> if (tsdev->open) {<br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo@vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2005-09-15 09:09 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>