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 &lt;&gt;</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 &lt;dtor&#64;mail.ru&gt;<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 />&#64;&#64; -32,6 +32,8 &#64;&#64; 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 />&#64;&#64; -39,10 +41,14 &#64;&#64; 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 />&#64;&#64; -496,7 +502,7 &#64;&#64; static int input_devices_read(char *buf,<br /> <br /> list_for_each_entry(dev, &amp;input_dev_list, node) {<br /> <br />- path = dev-&gt;dynalloc ? kobject_get_path(&amp;dev-&gt;cdev.kobj, GFP_KERNEL) : NULL;<br />+ path = kobject_get_path(&amp;dev-&gt;cdev.kobj, GFP_KERNEL);<br /> <br /> len = sprintf(buf, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n",<br /> dev-&gt;id.bustype, dev-&gt;id.vendor, dev-&gt;id.product, dev-&gt;id.version);<br />&#64;&#64; -725,7 +731,8 &#64;&#64; 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 = &amp;input_class,<br /> .release = input_dev_release,<br /> .class_dev_attrs = input_dev_attrs,<br /> };<br />&#64;&#64; -737,8 +744,6 &#64;&#64; struct input_dev *input_allocate_device(<br /> dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);<br /> if (dev) {<br /> dev-&gt;dynalloc = 1;<br />- dev-&gt;cdev.class = &amp;input_dev_class;<br />- class_device_initialize(&amp;dev-&gt;cdev);<br /> INIT_LIST_HEAD(&amp;dev-&gt;h_list);<br /> INIT_LIST_HEAD(&amp;dev-&gt;node);<br /> }<br />&#64;&#64; -746,38 +751,24 &#64;&#64; 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-&gt;dev = dev-&gt;cdev.dev;<br />-<br />- snprintf(dev-&gt;cdev.class_id, sizeof(dev-&gt;cdev.class_id),<br />- "input%ld", (unsigned long) atomic_inc_return(&amp;input_no) - 1);<br />-<br />- path = kobject_get_path(&amp;dev-&gt;cdev.class-&gt;subsys.kset.kobj, GFP_KERNEL);<br />- printk(KERN_INFO "input: %s/%s as %s\n",<br />- dev-&gt;name ? dev-&gt;name : "Unspecified device",<br />- path ? path : "", dev-&gt;cdev.class_id);<br />- kfree(path);<br />-<br />- class_device_add(&amp;dev-&gt;cdev);<br />- sysfs_create_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_id_attr_group);<br />- sysfs_create_group(&amp;dev-&gt;cdev.kobj, &amp;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-&gt;evbit);<br />+ if (!dev-&gt;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&#64;ameritech.net\n",<br />+ dev-&gt;name ? dev-&gt;name : "&lt;Unknown&gt;");<br />+ return -EINVAL;<br />+ }<br /> <br /> init_MUTEX(&amp;dev-&gt;sem);<br />+ set_bit(EV_SYN, dev-&gt;evbit);<br /> <br /> /*<br /> * If delay and period are pre-set by the driver, then autorepeating<br />&#64;&#64; -801,23 +792,46 &#64;&#64; void input_register_device(struct input_<br /> if ((handle = handler-&gt;connect(handler, dev, id)))<br /> input_link_handle(handle);<br /> <br />+ dev-&gt;cdev.class = &amp;input_dev_class;<br />+ snprintf(dev-&gt;cdev.class_id, sizeof(dev-&gt;cdev.class_id),<br />+ "input%ld", (unsigned long) atomic_inc_return(&amp;input_no) - 1);<br /> <br />- if (dev-&gt;dynalloc)<br />- input_register_classdevice(dev);<br />+ error = class_device_register(&amp;dev-&gt;cdev);<br />+ if (error)<br />+ return error;<br />+<br />+ error = sysfs_create_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_id_attr_group);<br />+ if (error)<br />+ goto fail1;<br />+<br />+ error = sysfs_create_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_caps_attr_group);<br />+ if (error)<br />+ goto fail2;<br />+<br />+ path = kobject_get_path(&amp;dev-&gt;cdev.kobj, GFP_KERNEL);<br />+ printk(KERN_INFO "input: %s as %s\n",<br />+ dev-&gt;name ? dev-&gt;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(&amp;dev-&gt;cdev.kobj, &amp;input_dev_caps_attr_group);<br />+ fail1: sysfs_remove_group(&amp;dev-&gt;cdev.kobj, &amp;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(&amp;dev-&gt;timer);<br /> <br /> list_for_each_safe(node, next, &amp;dev-&gt;h_list) {<br />&#64;&#64; -833,11 +847,9 &#64;&#64; void input_unregister_device(struct inpu<br /> <br /> list_del_init(&amp;dev-&gt;node);<br /> <br />- if (dev-&gt;dynalloc) {<br />- sysfs_remove_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_caps_attr_group);<br />- sysfs_remove_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_id_attr_group);<br />- class_device_unregister(&amp;dev-&gt;cdev);<br />- }<br />+ sysfs_remove_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_caps_attr_group);<br />+ sysfs_remove_group(&amp;dev-&gt;cdev.kobj, &amp;input_dev_id_attr_group);<br />+ class_device_unregister(&amp;dev-&gt;cdev);<br /> <br /> input_wakeup_procfs_readers();<br /> }<br />&#64;&#64; -885,6 +897,63 &#64;&#64; 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 = &amp;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-&gt;devt = devt;<br />+ dev-&gt;class = &amp;input_interface_class;<br />+ strlcpy(dev-&gt;class_id, handle-&gt;name, BUS_ID_SIZE);<br />+<br />+ error = class_device_register(dev);<br />+ if (error)<br />+ return error;<br />+<br />+ if (handle-&gt;dev) {<br />+ sysfs_create_link(&amp;dev-&gt;kobj, &amp;handle-&gt;dev-&gt;cdev.kobj, "device");<br />+ sysfs_create_link(&amp;handle-&gt;dev-&gt;cdev.kobj, &amp;dev-&gt;kobj,<br />+ kobject_name(&amp;dev-&gt;kobj));<br />+ }<br />+<br />+ handle-&gt;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-&gt;intf_dev) {<br />+ if (handle-&gt;dev) {<br />+ sysfs_remove_link(&amp;handle-&gt;dev-&gt;cdev.kobj,<br />+ kobject_name(&amp;handle-&gt;intf_dev-&gt;kobj));<br />+ sysfs_remove_link(&amp;handle-&gt;intf_dev-&gt;kobj, "device");<br />+ }<br />+<br />+ class_device_unregister(handle-&gt;intf_dev);<br />+ handle-&gt;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) &gt;&gt; 5];<br />&#64;&#64; -921,40 +990,44 &#64;&#64; 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(&amp;input_dev_class);<br />+ err = class_register(&amp;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(&amp;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(&amp;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", &amp;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(&amp;input_dev_class);<br />+ fail4: input_proc_exit();<br />+ fail3: class_unregister(&amp;input_interface_class);<br />+ fail2: class_unregister(&amp;input_dev_class);<br />+ fail1: class_unregister(&amp;input_class);<br /> return err;<br /> }<br /> <br />&#64;&#64; -962,8 +1035,9 &#64;&#64; 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(&amp;input_interface_class);<br /> class_unregister(&amp;input_dev_class);<br />+ class_unregister(&amp;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 />&#64;&#64; -891,7 +891,6 &#64;&#64; 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 />&#64;&#64; -970,6 +969,7 &#64;&#64; 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 />&#64;&#64; -1006,12 +1006,15 &#64;&#64; static inline void input_put_device(stru<br /> class_device_put(&amp;dev-&gt;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 />&#64;&#64; -1074,7 +1077,7 &#64;&#64; static inline void input_set_abs_params(<br /> dev-&gt;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 />&#64;&#64; -669,9 +669,9 &#64;&#64; 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(&amp;evdev-&gt;list);<br /> init_waitqueue_head(&amp;evdev-&gt;wait);<br />&#64;&#64; -686,9 +686,8 &#64;&#64; 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-&gt;dev, "event%d", minor);<br />+ input_create_interface_device(&amp;evdev-&gt;handle,<br />+ MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor));<br /> <br /> return &amp;evdev-&gt;handle;<br /> }<br />&#64;&#64; -698,8 +697,7 &#64;&#64; static void evdev_disconnect(struct inpu<br /> struct evdev *evdev = handle-&gt;private;<br /> struct evdev_list *list;<br /> <br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + evdev-&gt;minor));<br />+ input_destroy_interface_device(handle);<br /> evdev-&gt;exist = 0;<br /> <br /> if (evdev-&gt;open) {<br />Index: work/drivers/input/joydev.c<br />===================================================================<br />--- work.orig/drivers/input/joydev.c<br />+++ work/drivers/input/joydev.c<br />&#64;&#64; -456,9 +456,9 &#64;&#64; 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(&amp;joydev-&gt;list);<br /> init_waitqueue_head(&amp;joydev-&gt;wait);<br />&#64;&#64; -513,10 +513,8 &#64;&#64; 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-&gt;dev, "js%d", minor);<br />-<br />+ input_create_interface_device(&amp;joydev-&gt;handle,<br />+ MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor));<br /> return &amp;joydev-&gt;handle;<br /> }<br /> <br />&#64;&#64; -525,7 +523,7 &#64;&#64; static void joydev_disconnect(struct inp<br /> struct joydev *joydev = handle-&gt;private;<br /> struct joydev_list *list;<br /> <br />- class_device_destroy(input_class, MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + joydev-&gt;minor));<br />+ input_destroy_interface_device(handle);<br /> joydev-&gt;exist = 0;<br /> <br /> if (joydev-&gt;open) {<br />Index: work/drivers/input/mousedev.c<br />===================================================================<br />--- work.orig/drivers/input/mousedev.c<br />+++ work/drivers/input/mousedev.c<br />&#64;&#64; -202,7 +202,7 &#64;&#64; 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 />&#64;&#64; -327,7 +327,7 &#64;&#64; static void mousedev_event(struct input_<br /> mousedev-&gt;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 />&#64;&#64; -617,6 +617,33 &#64;&#64; 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(&amp;mousedev-&gt;list);<br />+ init_waitqueue_head(&amp;mousedev-&gt;wait);<br />+<br />+ if (minor == MOUSEDEV_MIX)<br />+ strcpy(mousedev-&gt;name, "mice");<br />+ else<br />+ sprintf(mousedev-&gt;name, "mouse%d", minor);<br />+<br />+ mousedev-&gt;minor = minor;<br />+ mousedev-&gt;exist = 1;<br />+ mousedev-&gt;handle.dev = dev;<br />+ mousedev-&gt;handle.name = mousedev-&gt;name;<br />+ mousedev-&gt;handle.handler = handler;<br />+ mousedev-&gt;handle.private = mousedev;<br />+<br />+ mousedev_table[minor] = mousedev;<br />+<br />+ input_create_interface_device(&amp;mousedev-&gt;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 />&#64;&#64; -628,30 +655,15 &#64;&#64; 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(&amp;mousedev-&gt;list);<br />- init_waitqueue_head(&amp;mousedev-&gt;wait);<br />-<br />- mousedev-&gt;minor = minor;<br />- mousedev-&gt;exist = 1;<br />- mousedev-&gt;handle.dev = dev;<br />- mousedev-&gt;handle.name = mousedev-&gt;name;<br />- mousedev-&gt;handle.handler = handler;<br />- mousedev-&gt;handle.private = mousedev;<br />- sprintf(mousedev-&gt;name, "mouse%d", minor);<br />+ mousedev_init_mousedev(mousedev, handler, dev, minor);<br /> <br /> if (mousedev_mix.open)<br /> input_open_device(&amp;mousedev-&gt;handle);<br /> <br />- mousedev_table[minor] = mousedev;<br />-<br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + minor),<br />- dev-&gt;dev, "mouse%d", minor);<br />-<br /> return &amp;mousedev-&gt;handle;<br /> }<br /> <br />&#64;&#64; -660,8 +672,7 &#64;&#64; static void mousedev_disconnect(struct i<br /> struct mousedev *mousedev = handle-&gt;private;<br /> struct mousedev_list *list;<br /> <br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + mousedev-&gt;minor));<br />+ input_destroy_interface_device(handle);<br /> mousedev-&gt;exist = 0;<br /> <br /> if (mousedev-&gt;open) {<br />&#64;&#64; -701,7 +712,7 &#64;&#64; 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 />&#64;&#64; -727,15 +738,7 &#64;&#64; static int __init mousedev_init(void)<br /> {<br /> input_register_handler(&amp;mousedev_handler);<br /> <br />- memset(&amp;mousedev_mix, 0, sizeof(struct mousedev));<br />- INIT_LIST_HEAD(&amp;mousedev_mix.list);<br />- init_waitqueue_head(&amp;mousedev_mix.wait);<br />- mousedev_table[MOUSEDEV_MIX] = &amp;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(&amp;mousedev_mix, &amp;mousedev_handler, NULL, MOUSEDEV_MIX);<br /> <br /> #ifdef CONFIG_INPUT_MOUSEDEV_PSAUX<br /> if (!(psaux_registered = !misc_register(&amp;psaux_mouse)))<br />&#64;&#64; -753,8 +756,7 &#64;&#64; static void __exit mousedev_exit(void)<br /> if (psaux_registered)<br /> misc_deregister(&amp;psaux_mouse);<br /> #endif<br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, MOUSEDEV_MINOR_BASE + MOUSEDEV_MIX));<br />+ input_destroy_interface_device(&amp;mousedev_mix.handle);<br /> input_unregister_handler(&amp;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 />&#64;&#64; -35,7 +35,7 &#64;&#64;<br /> * e-mail - mail your message to &lt;jsimmons&#64;infradead.org&gt;.<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 />&#64;&#64; -378,9 +378,9 &#64;&#64; 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(&amp;tsdev-&gt;list);<br /> init_waitqueue_head(&amp;tsdev-&gt;wait);<br />&#64;&#64; -395,24 +395,22 &#64;&#64; static struct input_handle *tsdev_connec<br /> tsdev-&gt;handle.private = tsdev;<br /> <br /> /* Precompute the rough calibration matrix */<br />- delta = dev-&gt;absmax [ABS_X] - dev-&gt;absmin [ABS_X] + 1;<br />+ delta = dev-&gt;absmax[ABS_X] - dev-&gt;absmin[ABS_X] + 1;<br /> if (delta == 0)<br /> delta = 1;<br /> tsdev-&gt;cal.xscale = (xres &lt;&lt; 8) / delta;<br />- tsdev-&gt;cal.xtrans = - ((dev-&gt;absmin [ABS_X] * tsdev-&gt;cal.xscale) &gt;&gt; 8);<br />+ tsdev-&gt;cal.xtrans = - ((dev-&gt;absmin[ABS_X] * tsdev-&gt;cal.xscale) &gt;&gt; 8);<br /> <br />- delta = dev-&gt;absmax [ABS_Y] - dev-&gt;absmin [ABS_Y] + 1;<br />+ delta = dev-&gt;absmax[ABS_Y] - dev-&gt;absmin[ABS_Y] + 1;<br /> if (delta == 0)<br /> delta = 1;<br /> tsdev-&gt;cal.yscale = (yres &lt;&lt; 8) / delta;<br />- tsdev-&gt;cal.ytrans = - ((dev-&gt;absmin [ABS_Y] * tsdev-&gt;cal.yscale) &gt;&gt; 8);<br />+ tsdev-&gt;cal.ytrans = - ((dev-&gt;absmin[ABS_Y] * tsdev-&gt;cal.yscale) &gt;&gt; 8);<br /> <br /> tsdev_table[minor] = tsdev;<br /> <br />- class_device_create(input_class,<br />- MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor),<br />- dev-&gt;dev, "ts%d", minor);<br />-<br />+ input_create_interface_device(&amp;tsdev-&gt;handle,<br />+ MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor));<br /> return &amp;tsdev-&gt;handle;<br /> }<br /> <br />&#64;&#64; -421,8 +419,7 &#64;&#64; static void tsdev_disconnect(struct inpu<br /> struct tsdev *tsdev = handle-&gt;private;<br /> struct tsdev_list *list;<br /> <br />- class_device_destroy(input_class,<br />- MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + tsdev-&gt;minor));<br />+ input_destroy_interface_device(handle);<br /> tsdev-&gt;exist = 0;<br /> <br /> if (tsdev-&gt;open) {<br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo&#64;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>

Pages: 1 2 3 4 5 6 7 8 9 10