CINXE.COM
LKML: Dmitry Torokhov: [patch 13/28] drivers/input/mouse: convert to dynamic input_dev allocation
<?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 13/28] drivers/input/mouse: convert to dynamic input_dev allocation</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/107" onclick="this.href='/lkml/headers'+'/2005/9/15/107';">[headers]</a>聽 <a href="/lkml/bounce/2005/9/15/107">[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><a href="/lkml/2005/9/15/57">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 class="origin"><a href="">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/107/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:44 -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 13/28] drivers/input/mouse: convert to dynamic input_dev allocation</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">Input: convert drivers/input/mouse to dynamic input_dev allocation<br /><br />This is required for input_dev sysfs integration<br /><br />Signed-off-by: Dmitry Torokhov <dtor@mail.ru><br />---<br /><br /> drivers/input/mouse/alps.c | 67 +++++++++++++------------<br /> drivers/input/mouse/alps.h | 2 <br /> drivers/input/mouse/amimouse.c | 51 +++++++++----------<br /> drivers/input/mouse/inport.c | 96 ++++++++++++++++++-----------------<br /> drivers/input/mouse/lifebook.c | 16 +++--<br /> drivers/input/mouse/logibm.c | 88 ++++++++++++++++----------------<br /> drivers/input/mouse/logips2pp.c | 20 ++++---<br /> drivers/input/mouse/maplemouse.c | 10 +--<br /> drivers/input/mouse/pc110pad.c | 70 ++++++++++++--------------<br /> drivers/input/mouse/psmouse-base.c | 99 +++++++++++++++++++------------------<br /> drivers/input/mouse/psmouse.h | 2 <br /> drivers/input/mouse/rpcmouse.c | 43 +++++++---------<br /> drivers/input/mouse/sermouse.c | 84 ++++++++++++++-----------------<br /> drivers/input/mouse/synaptics.c | 6 +-<br /> drivers/input/mouse/vsxxxaa.c | 84 ++++++++++++++-----------------<br /> 15 files changed, 370 insertions(+), 368 deletions(-)<br /><br />Index: work/drivers/input/mouse/amimouse.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/amimouse.c<br />+++ work/drivers/input/mouse/amimouse.c<br />@@ -34,10 +34,7 @@ MODULE_DESCRIPTION("Amiga mouse driver")<br /> MODULE_LICENSE("GPL");<br /> <br /> static int amimouse_lastx, amimouse_lasty;<br />-static struct input_dev amimouse_dev;<br />-<br />-static char *amimouse_name = "Amiga mouse";<br />-static char *amimouse_phys = "amimouse/input0";<br />+static struct input_dev *amimouse_dev;<br /> <br /> static irqreturn_t amimouse_interrupt(int irq, void *dummy, struct pt_regs *fp)<br /> {<br />@@ -62,16 +59,16 @@ static irqreturn_t amimouse_interrupt(in<br /> <br /> potgor = custom.potgor;<br /> <br />- input_regs(&amimouse_dev, fp);<br />+ input_regs(amimouse_dev, fp);<br /> <br />- input_report_rel(&amimouse_dev, REL_X, dx);<br />- input_report_rel(&amimouse_dev, REL_Y, dy);<br />+ input_report_rel(amimouse_dev, REL_X, dx);<br />+ input_report_rel(amimouse_dev, REL_Y, dy);<br /> <br />- input_report_key(&amimouse_dev, BTN_LEFT, ciaa.pra & 0x40);<br />- input_report_key(&amimouse_dev, BTN_MIDDLE, potgor & 0x0100);<br />- input_report_key(&amimouse_dev, BTN_RIGHT, potgor & 0x0400);<br />+ input_report_key(amimouse_dev, BTN_LEFT, ciaa.pra & 0x40);<br />+ input_report_key(amimouse_dev, BTN_MIDDLE, potgor & 0x0100);<br />+ input_report_key(amimouse_dev, BTN_RIGHT, potgor & 0x0400);<br /> <br />- input_sync(&amimouse_dev);<br />+ input_sync(amimouse_dev);<br /> <br /> return IRQ_HANDLED;<br /> }<br />@@ -103,28 +100,30 @@ static int __init amimouse_init(void)<br /> if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE))<br /> return -ENODEV;<br /> <br />- amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />- amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />- amimouse_dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />- amimouse_dev.open = amimouse_open;<br />- amimouse_dev.close = amimouse_close;<br />-<br />- amimouse_dev.name = amimouse_name;<br />- amimouse_dev.phys = amimouse_phys;<br />- amimouse_dev.id.bustype = BUS_AMIGA;<br />- amimouse_dev.id.vendor = 0x0001;<br />- amimouse_dev.id.product = 0x0002;<br />- amimouse_dev.id.version = 0x0100;<br />+ if (!(amimouse_dev = input_allocate_device()))<br />+ return -ENOMEM;<br />+<br />+ amimouse_dev->name = "Amiga mouse";<br />+ amimouse_dev->phys = "amimouse/input0";<br />+ amimouse_dev->id.bustype = BUS_AMIGA;<br />+ amimouse_dev->id.vendor = 0x0001;<br />+ amimouse_dev->id.product = 0x0002;<br />+ amimouse_dev->id.version = 0x0100;<br />+<br />+ amimouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ amimouse_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />+ amimouse_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+ amimouse_dev->open = amimouse_open;<br />+ amimouse_dev->close = amimouse_close;<br /> <br />- input_register_device(&amimouse_dev);<br />+ input_register_device(amimouse_dev);<br /> <br />- printk(KERN_INFO "input: %s at joy0dat\n", amimouse_name);<br /> return 0;<br /> }<br /> <br /> static void __exit amimouse_exit(void)<br /> {<br />- input_unregister_device(&amimouse_dev);<br />+ input_unregister_device(amimouse_dev);<br /> }<br /> <br /> module_init(amimouse_init);<br />Index: work/drivers/input/mouse/inport.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/inport.c<br />+++ work/drivers/input/mouse/inport.c<br />@@ -87,40 +87,7 @@ MODULE_PARM_DESC(irq, "IRQ number (5=def<br /> <br /> __obsolete_setup("inport_irq=");<br /> <br />-static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs);<br />-<br />-static int inport_open(struct input_dev *dev)<br />-{<br />- if (request_irq(inport_irq, inport_interrupt, 0, "inport", NULL))<br />- return -EBUSY;<br />- outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br />- outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);<br />-<br />- return 0;<br />-}<br />-<br />-static void inport_close(struct input_dev *dev)<br />-{<br />- outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br />- outb(INPORT_MODE_BASE, INPORT_DATA_PORT);<br />- free_irq(inport_irq, NULL);<br />-}<br />-<br />-static struct input_dev inport_dev = {<br />- .evbit = { BIT(EV_KEY) | BIT(EV_REL) },<br />- .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },<br />- .relbit = { BIT(REL_X) | BIT(REL_Y) },<br />- .open = inport_open,<br />- .close = inport_close,<br />- .name = INPORT_NAME,<br />- .phys = "isa023c/input0",<br />- .id = {<br />- .bustype = BUS_ISA,<br />- .vendor = INPORT_VENDOR,<br />- .product = 0x0001,<br />- .version = 0x0100,<br />- },<br />-};<br />+static struct input_dev *inport_dev;<br /> <br /> static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs)<br /> {<br />@@ -129,31 +96,48 @@ static irqreturn_t inport_interrupt(int <br /> outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br /> outb(INPORT_MODE_HOLD | INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);<br /> <br />- input_regs(&inport_dev, regs);<br />+ input_regs(inport_dev, regs);<br /> <br /> outb(INPORT_REG_X, INPORT_CONTROL_PORT);<br />- input_report_rel(&inport_dev, REL_X, inb(INPORT_DATA_PORT));<br />+ input_report_rel(inport_dev, REL_X, inb(INPORT_DATA_PORT));<br /> <br /> outb(INPORT_REG_Y, INPORT_CONTROL_PORT);<br />- input_report_rel(&inport_dev, REL_Y, inb(INPORT_DATA_PORT));<br />+ input_report_rel(inport_dev, REL_Y, inb(INPORT_DATA_PORT));<br /> <br /> outb(INPORT_REG_BTNS, INPORT_CONTROL_PORT);<br /> buttons = inb(INPORT_DATA_PORT);<br /> <br />- input_report_key(&inport_dev, BTN_MIDDLE, buttons & 1);<br />- input_report_key(&inport_dev, BTN_LEFT, buttons & 2);<br />- input_report_key(&inport_dev, BTN_RIGHT, buttons & 4);<br />+ input_report_key(inport_dev, BTN_MIDDLE, buttons & 1);<br />+ input_report_key(inport_dev, BTN_LEFT, buttons & 2);<br />+ input_report_key(inport_dev, BTN_RIGHT, buttons & 4);<br /> <br /> outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br /> outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);<br /> <br />- input_sync(&inport_dev);<br />+ input_sync(inport_dev);<br /> return IRQ_HANDLED;<br /> }<br /> <br />+static int inport_open(struct input_dev *dev)<br />+{<br />+ if (request_irq(inport_irq, inport_interrupt, 0, "inport", NULL))<br />+ return -EBUSY;<br />+ outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br />+ outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT);<br />+<br />+ return 0;<br />+}<br />+<br />+static void inport_close(struct input_dev *dev)<br />+{<br />+ outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br />+ outb(INPORT_MODE_BASE, INPORT_DATA_PORT);<br />+ free_irq(inport_irq, NULL);<br />+}<br />+<br /> static int __init inport_init(void)<br /> {<br />- unsigned char a,b,c;<br />+ unsigned char a, b, c;<br /> <br /> if (!request_region(INPORT_BASE, INPORT_EXTENT, "inport")) {<br /> printk(KERN_ERR "inport.c: Can't allocate ports at %#x\n", INPORT_BASE);<br />@@ -163,26 +147,44 @@ static int __init inport_init(void)<br /> a = inb(INPORT_SIGNATURE_PORT);<br /> b = inb(INPORT_SIGNATURE_PORT);<br /> c = inb(INPORT_SIGNATURE_PORT);<br />- if (( a == b ) || ( a != c )) {<br />+ if (a == b || a != c) {<br /> release_region(INPORT_BASE, INPORT_EXTENT);<br /> printk(KERN_ERR "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE);<br /> return -ENODEV;<br /> }<br /> <br />+ if (!(inport_dev = input_allocate_device())) {<br />+ printk(KERN_ERR "inport.c: Not enough memory for input device\n");<br />+ release_region(INPORT_BASE, INPORT_EXTENT);<br />+ return -ENOMEM;<br />+ }<br />+<br />+ inport_dev->name = INPORT_NAME;<br />+ inport_dev->phys = "isa023c/input0";<br />+ inport_dev->id.bustype = BUS_ISA;<br />+ inport_dev->id.vendor = INPORT_VENDOR;<br />+ inport_dev->id.product = 0x0001;<br />+ inport_dev->id.version = 0x0100;<br />+<br />+ inport_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ inport_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+ inport_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />+<br />+ inport_dev->open = inport_open;<br />+ inport_dev->close = inport_close;<br />+<br /> outb(INPORT_RESET, INPORT_CONTROL_PORT);<br /> outb(INPORT_REG_MODE, INPORT_CONTROL_PORT);<br /> outb(INPORT_MODE_BASE, INPORT_DATA_PORT);<br /> <br />- input_register_device(&inport_dev);<br />-<br />- printk(KERN_INFO "input: " INPORT_NAME " at %#x irq %d\n", INPORT_BASE, inport_irq);<br />+ input_register_device(inport_dev);<br /> <br /> return 0;<br /> }<br /> <br /> static void __exit inport_exit(void)<br /> {<br />- input_unregister_device(&inport_dev);<br />+ input_unregister_device(inport_dev);<br /> release_region(INPORT_BASE, INPORT_EXTENT);<br /> }<br /> <br />Index: work/drivers/input/mouse/logibm.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/logibm.c<br />+++ work/drivers/input/mouse/logibm.c<br />@@ -77,39 +77,7 @@ MODULE_PARM_DESC(irq, "IRQ number (5=def<br /> <br /> __obsolete_setup("logibm_irq=");<br /> <br />-static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs);<br />-<br />-static int logibm_open(struct input_dev *dev)<br />-{<br />- if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) {<br />- printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq);<br />- return -EBUSY;<br />- }<br />- outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT);<br />- return 0;<br />-}<br />-<br />-static void logibm_close(struct input_dev *dev)<br />-{<br />- outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT);<br />- free_irq(logibm_irq, NULL);<br />-}<br />-<br />-static struct input_dev logibm_dev = {<br />- .evbit = { BIT(EV_KEY) | BIT(EV_REL) },<br />- .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },<br />- .relbit = { BIT(REL_X) | BIT(REL_Y) },<br />- .open = logibm_open,<br />- .close = logibm_close,<br />- .name = "Logitech bus mouse",<br />- .phys = "isa023c/input0",<br />- .id = {<br />- .bustype = BUS_ISA,<br />- .vendor = 0x0003,<br />- .product = 0x0001,<br />- .version = 0x0100,<br />- },<br />-};<br />+static struct input_dev *logibm_dev;<br /> <br /> static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs)<br /> {<br />@@ -127,18 +95,34 @@ static irqreturn_t logibm_interrupt(int <br /> dy |= (buttons & 0xf) << 4;<br /> buttons = ~buttons >> 5;<br /> <br />- input_regs(&logibm_dev, regs);<br />- input_report_rel(&logibm_dev, REL_X, dx);<br />- input_report_rel(&logibm_dev, REL_Y, dy);<br />- input_report_key(&logibm_dev, BTN_RIGHT, buttons & 1);<br />- input_report_key(&logibm_dev, BTN_MIDDLE, buttons & 2);<br />- input_report_key(&logibm_dev, BTN_LEFT, buttons & 4);<br />- input_sync(&logibm_dev);<br />+ input_regs(logibm_dev, regs);<br />+ input_report_rel(logibm_dev, REL_X, dx);<br />+ input_report_rel(logibm_dev, REL_Y, dy);<br />+ input_report_key(logibm_dev, BTN_RIGHT, buttons & 1);<br />+ input_report_key(logibm_dev, BTN_MIDDLE, buttons & 2);<br />+ input_report_key(logibm_dev, BTN_LEFT, buttons & 4);<br />+ input_sync(logibm_dev);<br /> <br /> outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT);<br /> return IRQ_HANDLED;<br /> }<br /> <br />+static int logibm_open(struct input_dev *dev)<br />+{<br />+ if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) {<br />+ printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq);<br />+ return -EBUSY;<br />+ }<br />+ outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT);<br />+ return 0;<br />+}<br />+<br />+static void logibm_close(struct input_dev *dev)<br />+{<br />+ outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT);<br />+ free_irq(logibm_irq, NULL);<br />+}<br />+<br /> static int __init logibm_init(void)<br /> {<br /> if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) {<br />@@ -159,16 +143,34 @@ static int __init logibm_init(void)<br /> outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT);<br /> outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT);<br /> <br />- input_register_device(&logibm_dev);<br />+ if (!(logibm_dev = input_allocate_device())) {<br />+ printk(KERN_ERR "logibm.c: Not enough memory for input device\n");<br />+ release_region(LOGIBM_BASE, LOGIBM_EXTENT);<br />+ return -ENOMEM;<br />+ }<br />+<br />+ logibm_dev->name = "Logitech bus mouse";<br />+ logibm_dev->phys = "isa023c/input0";<br />+ logibm_dev->id.bustype = BUS_ISA;<br />+ logibm_dev->id.vendor = 0x0003;<br />+ logibm_dev->id.product = 0x0001;<br />+ logibm_dev->id.version = 0x0100;<br />+<br />+ logibm_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ logibm_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+ logibm_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />+<br />+ logibm_dev->open = logibm_open;<br />+ logibm_dev->close = logibm_close;<br /> <br />- printk(KERN_INFO "input: Logitech bus mouse at %#x irq %d\n", LOGIBM_BASE, logibm_irq);<br />+ input_register_device(logibm_dev);<br /> <br /> return 0;<br /> }<br /> <br /> static void __exit logibm_exit(void)<br /> {<br />- input_unregister_device(&logibm_dev);<br />+ input_unregister_device(logibm_dev);<br /> release_region(LOGIBM_BASE, LOGIBM_EXTENT);<br /> }<br /> <br />Index: work/drivers/input/mouse/maplemouse.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/maplemouse.c<br />+++ work/drivers/input/mouse/maplemouse.c<br />@@ -41,13 +41,12 @@ static int dc_mouse_connect(struct maple<br /> unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]);<br /> struct input_dev *input_dev;<br /> <br />- if (!(input_dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL)))<br />- return -1;<br />+ dev->private_data = input_dev = input_allocate_device();<br />+ if (!input_dev)<br />+ return -ENOMEM;<br /> <br /> dev->private_data = input_dev;<br /> <br />- memset(input_dev, 0, sizeof(struct dc_mouse));<br />- init_input_dev(input_dev);<br /> input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br /> input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE);<br /> input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL);<br />@@ -59,8 +58,6 @@ static int dc_mouse_connect(struct maple<br /> <br /> maple_getcond_callback(dev, dc_mouse_callback, 1, MAPLE_FUNC_MOUSE);<br /> <br />- printk(KERN_INFO "input: mouse(0x%lx): %s\n", data, input_dev->name);<br />-<br /> return 0;<br /> }<br /> <br />@@ -70,7 +67,6 @@ static void dc_mouse_disconnect(struct m<br /> struct input_dev *input_dev = dev->private_data;<br /> <br /> input_unregister_device(input_dev);<br />- kfree(input_dev);<br /> }<br /> <br /> <br />Index: work/drivers/input/mouse/pc110pad.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/pc110pad.c<br />+++ work/drivers/input/mouse/pc110pad.c<br />@@ -53,13 +53,10 @@ MODULE_LICENSE("GPL");<br /> static int pc110pad_irq = 10;<br /> static int pc110pad_io = 0x15e0;<br /> <br />-static struct input_dev pc110pad_dev;<br />+static struct input_dev *pc110pad_dev;<br /> static int pc110pad_data[3];<br /> static int pc110pad_count;<br /> <br />-static char *pc110pad_name = "IBM PC110 TouchPad";<br />-static char *pc110pad_phys = "isa15e0/input0";<br />-<br /> static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs)<br /> {<br /> int value = inb_p(pc110pad_io);<br />@@ -74,14 +71,14 @@ static irqreturn_t pc110pad_interrupt(in<br /> if (pc110pad_count < 3)<br /> return IRQ_HANDLED;<br /> <br />- input_regs(&pc110pad_dev, regs);<br />- input_report_key(&pc110pad_dev, BTN_TOUCH,<br />+ input_regs(pc110pad_dev, regs);<br />+ input_report_key(pc110pad_dev, BTN_TOUCH,<br /> pc110pad_data[0] & 0x01);<br />- input_report_abs(&pc110pad_dev, ABS_X,<br />+ input_report_abs(pc110pad_dev, ABS_X,<br /> pc110pad_data[1] | ((pc110pad_data[0] << 3) & 0x80) | ((pc110pad_data[0] << 1) & 0x100));<br />- input_report_abs(&pc110pad_dev, ABS_Y,<br />+ input_report_abs(pc110pad_dev, ABS_Y,<br /> pc110pad_data[2] | ((pc110pad_data[0] << 4) & 0x80));<br />- input_sync(&pc110pad_dev);<br />+ input_sync(pc110pad_dev);<br /> <br /> pc110pad_count = 0;<br /> return IRQ_HANDLED;<br />@@ -94,9 +91,9 @@ static void pc110pad_close(struct input_<br /> <br /> static int pc110pad_open(struct input_dev *dev)<br /> {<br />- pc110pad_interrupt(0,NULL,NULL);<br />- pc110pad_interrupt(0,NULL,NULL);<br />- pc110pad_interrupt(0,NULL,NULL);<br />+ pc110pad_interrupt(0, NULL, NULL);<br />+ pc110pad_interrupt(0, NULL, NULL);<br />+ pc110pad_interrupt(0, NULL, NULL);<br /> outb(PC110PAD_ON, pc110pad_io + 2);<br /> pc110pad_count = 0;<br /> <br />@@ -127,45 +124,46 @@ static int __init pc110pad_init(void)<br /> <br /> outb(PC110PAD_OFF, pc110pad_io + 2);<br /> <br />- if (request_irq(pc110pad_irq, pc110pad_interrupt, 0, "pc110pad", NULL))<br />- {<br />+ if (request_irq(pc110pad_irq, pc110pad_interrupt, 0, "pc110pad", NULL)) {<br /> release_region(pc110pad_io, 4);<br /> printk(KERN_ERR "pc110pad: Unable to get irq %d.\n", pc110pad_irq);<br /> return -EBUSY;<br /> }<br /> <br />- pc110pad_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);<br />- pc110pad_dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);<br />- pc110pad_dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);<br />-<br />- pc110pad_dev.absmax[ABS_X] = 0x1ff;<br />- pc110pad_dev.absmax[ABS_Y] = 0x0ff;<br />-<br />- pc110pad_dev.open = pc110pad_open;<br />- pc110pad_dev.close = pc110pad_close;<br />-<br />- pc110pad_dev.name = pc110pad_name;<br />- pc110pad_dev.phys = pc110pad_phys;<br />- pc110pad_dev.id.bustype = BUS_ISA;<br />- pc110pad_dev.id.vendor = 0x0003;<br />- pc110pad_dev.id.product = 0x0001;<br />- pc110pad_dev.id.version = 0x0100;<br />+ if (!(pc110pad_dev = input_allocate_device())) {<br />+ free_irq(pc110pad_irq, NULL);<br />+ release_region(pc110pad_io, 4);<br />+ printk(KERN_ERR "pc110pad: Not enough memory.\n");<br />+ return -ENOMEM;<br />+ }<br />+<br />+ pc110pad_dev->name = "IBM PC110 TouchPad";<br />+ pc110pad_dev->phys = "isa15e0/input0";<br />+ pc110pad_dev->id.bustype = BUS_ISA;<br />+ pc110pad_dev->id.vendor = 0x0003;<br />+ pc110pad_dev->id.product = 0x0001;<br />+ pc110pad_dev->id.version = 0x0100;<br />+<br />+ pc110pad_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);<br />+ pc110pad_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y);<br />+ pc110pad_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);<br /> <br />- input_register_device(&pc110pad_dev);<br />+ pc110pad_dev->absmax[ABS_X] = 0x1ff;<br />+ pc110pad_dev->absmax[ABS_Y] = 0x0ff;<br /> <br />- printk(KERN_INFO "input: %s at %#x irq %d\n",<br />- pc110pad_name, pc110pad_io, pc110pad_irq);<br />+ pc110pad_dev->open = pc110pad_open;<br />+ pc110pad_dev->close = pc110pad_close;<br />+<br />+ input_register_device(pc110pad_dev);<br /> <br /> return 0;<br /> }<br /> <br /> static void __exit pc110pad_exit(void)<br /> {<br />- input_unregister_device(&pc110pad_dev);<br />-<br /> outb(PC110PAD_OFF, pc110pad_io + 2);<br />-<br /> free_irq(pc110pad_irq, NULL);<br />+ input_unregister_device(pc110pad_dev);<br /> release_region(pc110pad_io, 4);<br /> }<br /> <br />Index: work/drivers/input/mouse/rpcmouse.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/rpcmouse.c<br />+++ work/drivers/input/mouse/rpcmouse.c<br />@@ -34,20 +34,7 @@ MODULE_DESCRIPTION("Acorn RiscPC mouse d<br /> MODULE_LICENSE("GPL");<br /> <br /> static short rpcmouse_lastx, rpcmouse_lasty;<br />-<br />-static struct input_dev rpcmouse_dev = {<br />- .evbit = { BIT(EV_KEY) | BIT(EV_REL) },<br />- .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) },<br />- .relbit = { BIT(REL_X) | BIT(REL_Y) },<br />- .name = "Acorn RiscPC Mouse",<br />- .phys = "rpcmouse/input0",<br />- .id = {<br />- .bustype = BUS_HOST,<br />- .vendor = 0x0005,<br />- .product = 0x0001,<br />- .version = 0x0100,<br />- },<br />-};<br />+static struct input_dev *rpcmouse_dev;<br /> <br /> static irqreturn_t rpcmouse_irq(int irq, void *dev_id, struct pt_regs *regs)<br /> {<br />@@ -78,29 +65,41 @@ static irqreturn_t rpcmouse_irq(int irq,<br /> return IRQ_HANDLED;<br /> }<br /> <br />+<br /> static int __init rpcmouse_init(void)<br /> {<br />- init_input_dev(&rpcmouse_dev);<br />+ if (!(rpcmouse_dev = input_allocate_device()))<br />+ return -ENOMEM;<br />+<br />+ rpcmouse_dev->name = "Acorn RiscPC Mouse";<br />+ rpcmouse_dev->phys = "rpcmouse/input0";<br />+ rpcmouse_dev->id.bustype = BUS_HOST;<br />+ rpcmouse_dev->id.vendor = 0x0005;<br />+ rpcmouse_dev->id.product = 0x0001;<br />+ rpcmouse_dev->id.version = 0x0100;<br />+<br />+ rpcmouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ rpcmouse_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+ rpcmouse_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br /> <br /> rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX);<br /> rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY);<br /> <br />- if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", &rpcmouse_dev)) {<br />+ if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", rpcmouse_dev)) {<br /> printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n");<br />- return -1;<br />+ input_free_device(rpcmouse_dev);<br />+ return -EBUSY;<br /> }<br /> <br />- input_register_device(&rpcmouse_dev);<br />-<br />- printk(KERN_INFO "input: Acorn RiscPC mouse\n");<br />+ input_register_device(rpcmouse_dev);<br /> <br /> return 0;<br /> }<br /> <br /> static void __exit rpcmouse_exit(void)<br /> {<br />- input_unregister_device(&rpcmouse_dev);<br />- free_irq(IRQ_VSYNCPULSE, &rpcmouse_dev);<br />+ free_irq(IRQ_VSYNCPULSE, rpcmouse_dev);<br />+ input_unregister_device(rpcmouse_dev);<br /> }<br /> <br /> module_init(rpcmouse_init);<br />Index: work/drivers/input/mouse/sermouse.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/sermouse.c<br />+++ work/drivers/input/mouse/sermouse.c<br />@@ -48,7 +48,7 @@ static char *sermouse_protocols[] = { "N<br /> "Logitech MZ++ Mouse"};<br /> <br /> struct sermouse {<br />- struct input_dev dev;<br />+ struct input_dev *dev;<br /> signed char buf[8];<br /> unsigned char count;<br /> unsigned char type;<br />@@ -64,7 +64,7 @@ struct sermouse {<br /> <br /> static void sermouse_process_msc(struct sermouse *sermouse, signed char data, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &sermouse->dev;<br />+ struct input_dev *dev = sermouse->dev;<br /> signed char *buf = sermouse->buf;<br /> <br /> input_regs(dev, regs);<br />@@ -107,7 +107,7 @@ static void sermouse_process_msc(struct <br /> <br /> static void sermouse_process_ms(struct sermouse *sermouse, signed char data, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &sermouse->dev;<br />+ struct input_dev *dev = sermouse->dev;<br /> signed char *buf = sermouse->buf;<br /> <br /> if (data & 0x40) sermouse->count = 0;<br />@@ -230,9 +230,9 @@ static void sermouse_disconnect(struct s<br /> {<br /> struct sermouse *sermouse = serio_get_drvdata(serio);<br /> <br />- input_unregister_device(&sermouse->dev);<br /> serio_close(serio);<br /> serio_set_drvdata(serio, NULL);<br />+ input_unregister_device(sermouse->dev);<br /> kfree(sermouse);<br /> }<br /> <br />@@ -244,56 +244,52 @@ static void sermouse_disconnect(struct s<br /> static int sermouse_connect(struct serio *serio, struct serio_driver *drv)<br /> {<br /> struct sermouse *sermouse;<br />- unsigned char c;<br />- int err;<br />-<br />- if (!serio->id.proto || serio->id.proto > SERIO_MZPP)<br />- return -ENODEV;<br />-<br />- if (!(sermouse = kmalloc(sizeof(struct sermouse), GFP_KERNEL)))<br />- return -ENOMEM;<br />-<br />- memset(sermouse, 0, sizeof(struct sermouse));<br />-<br />- init_input_dev(&sermouse->dev);<br />- sermouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />- sermouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT);<br />- sermouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />- sermouse->dev.private = sermouse;<br />-<br />- sermouse->type = serio->id.proto;<br />- c = serio->id.extra;<br />-<br />- if (c & 0x01) set_bit(BTN_MIDDLE, sermouse->dev.keybit);<br />- if (c & 0x02) set_bit(BTN_SIDE, sermouse->dev.keybit);<br />- if (c & 0x04) set_bit(BTN_EXTRA, sermouse->dev.keybit);<br />- if (c & 0x10) set_bit(REL_WHEEL, sermouse->dev.relbit);<br />- if (c & 0x20) set_bit(REL_HWHEEL, sermouse->dev.relbit);<br />+ struct input_dev *input_dev;<br />+ unsigned char c = serio->id.extra;<br />+ int err = -ENOMEM;<br />+<br />+ sermouse = kzalloc(sizeof(struct sermouse), GFP_KERNEL);<br />+ input_dev = input_allocate_device();<br />+ if (!sermouse || !input_dev)<br />+ goto fail;<br /> <br />+ sermouse->dev = input_dev;<br /> sprintf(sermouse->phys, "%s/input0", serio->phys);<br />+ sermouse->type = serio->id.proto;<br /> <br />- sermouse->dev.name = sermouse_protocols[sermouse->type];<br />- sermouse->dev.phys = sermouse->phys;<br />- sermouse->dev.id.bustype = BUS_RS232;<br />- sermouse->dev.id.vendor = sermouse->type;<br />- sermouse->dev.id.product = c;<br />- sermouse->dev.id.version = 0x0100;<br />- sermouse->dev.dev = &serio->dev;<br />+ input_dev->name = sermouse_protocols[sermouse->type];<br />+ input_dev->phys = sermouse->phys;<br />+ input_dev->id.bustype = BUS_RS232;<br />+ input_dev->id.vendor = sermouse->type;<br />+ input_dev->id.product = c;<br />+ input_dev->id.version = 0x0100;<br />+ input_dev->cdev.dev = &serio->dev;<br />+<br />+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT);<br />+ input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />+ input_dev->private = sermouse;<br />+<br />+ if (c & 0x01) set_bit(BTN_MIDDLE, input_dev->keybit);<br />+ if (c & 0x02) set_bit(BTN_SIDE, input_dev->keybit);<br />+ if (c & 0x04) set_bit(BTN_EXTRA, input_dev->keybit);<br />+ if (c & 0x10) set_bit(REL_WHEEL, input_dev->relbit);<br />+ if (c & 0x20) set_bit(REL_HWHEEL, input_dev->relbit);<br /> <br /> serio_set_drvdata(serio, sermouse);<br /> <br /> err = serio_open(serio, drv);<br />- if (err) {<br />- serio_set_drvdata(serio, NULL);<br />- kfree(sermouse);<br />- return err;<br />- }<br />-<br />- input_register_device(&sermouse->dev);<br />+ if (err)<br />+ goto fail;<br /> <br />- printk(KERN_INFO "input: %s on %s\n", sermouse_protocols[sermouse->type], serio->phys);<br />+ input_register_device(sermouse->dev);<br /> <br /> return 0;<br />+<br />+ fail: serio_set_drvdata(serio, NULL);<br />+ input_free_device(input_dev);<br />+ kfree(sermouse);<br />+ return err;<br /> }<br /> <br /> static struct serio_device_id sermouse_serio_ids[] = {<br />Index: work/drivers/input/mouse/vsxxxaa.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/vsxxxaa.c<br />+++ work/drivers/input/mouse/vsxxxaa.c<br />@@ -112,7 +112,7 @@ MODULE_LICENSE ("GPL");<br /> <br /> <br /> struct vsxxxaa {<br />- struct input_dev dev;<br />+ struct input_dev *dev;<br /> struct serio *serio;<br /> #define BUFLEN 15 /* At least 5 is needed for a full tablet packet */<br /> unsigned char buf[BUFLEN];<br />@@ -211,7 +211,7 @@ vsxxxaa_smells_like_packet (struct vsxxx<br /> static void<br /> vsxxxaa_handle_REL_packet (struct vsxxxaa *mouse, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &mouse->dev;<br />+ struct input_dev *dev = mouse->dev;<br /> unsigned char *buf = mouse->buf;<br /> int left, middle, right;<br /> int dx, dy;<br />@@ -269,7 +269,7 @@ vsxxxaa_handle_REL_packet (struct vsxxxa<br /> static void<br /> vsxxxaa_handle_ABS_packet (struct vsxxxaa *mouse, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &mouse->dev;<br />+ struct input_dev *dev = mouse->dev;<br /> unsigned char *buf = mouse->buf;<br /> int left, middle, right, touch;<br /> int x, y;<br />@@ -323,7 +323,7 @@ vsxxxaa_handle_ABS_packet (struct vsxxxa<br /> static void<br /> vsxxxaa_handle_POR_packet (struct vsxxxaa *mouse, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &mouse->dev;<br />+ struct input_dev *dev = mouse->dev;<br /> unsigned char *buf = mouse->buf;<br /> int left, middle, right;<br /> unsigned char error;<br />@@ -483,9 +483,9 @@ vsxxxaa_disconnect (struct serio *serio)<br /> {<br /> struct vsxxxaa *mouse = serio_get_drvdata (serio);<br /> <br />- input_unregister_device (&mouse->dev);<br /> serio_close (serio);<br /> serio_set_drvdata (serio, NULL);<br />+ input_unregister_device (mouse->dev);<br /> kfree (mouse);<br /> }<br /> <br />@@ -493,61 +493,57 @@ static int<br /> vsxxxaa_connect (struct serio *serio, struct serio_driver *drv)<br /> {<br /> struct vsxxxaa *mouse;<br />- int err;<br />+ struct input_dev *input_dev;<br />+ int err = -ENOMEM;<br /> <br />- if (!(mouse = kmalloc (sizeof (struct vsxxxaa), GFP_KERNEL)))<br />- return -ENOMEM;<br />-<br />- memset (mouse, 0, sizeof (struct vsxxxaa));<br />-<br />- init_input_dev (&mouse->dev);<br />- set_bit (EV_KEY, mouse->dev.evbit); /* We have buttons */<br />- set_bit (EV_REL, mouse->dev.evbit);<br />- set_bit (EV_ABS, mouse->dev.evbit);<br />- set_bit (BTN_LEFT, mouse->dev.keybit); /* We have 3 buttons */<br />- set_bit (BTN_MIDDLE, mouse->dev.keybit);<br />- set_bit (BTN_RIGHT, mouse->dev.keybit);<br />- set_bit (BTN_TOUCH, mouse->dev.keybit); /* ...and Tablet */<br />- set_bit (REL_X, mouse->dev.relbit);<br />- set_bit (REL_Y, mouse->dev.relbit);<br />- set_bit (ABS_X, mouse->dev.absbit);<br />- set_bit (ABS_Y, mouse->dev.absbit);<br />-<br />- mouse->dev.absmin[ABS_X] = 0;<br />- mouse->dev.absmax[ABS_X] = 1023;<br />- mouse->dev.absmin[ABS_Y] = 0;<br />- mouse->dev.absmax[ABS_Y] = 1023;<br />-<br />- mouse->dev.private = mouse;<br />+ mouse = kzalloc (sizeof (struct vsxxxaa), GFP_KERNEL);<br />+ input_dev = input_allocate_device ();<br />+ if (!mouse || !input_dev)<br />+ goto fail;<br /> <br />+ mouse->dev = input_dev;<br />+ mouse->serio = serio;<br /> sprintf (mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer");<br /> sprintf (mouse->phys, "%s/input0", serio->phys);<br />- mouse->dev.name = mouse->name;<br />- mouse->dev.phys = mouse->phys;<br />- mouse->dev.id.bustype = BUS_RS232;<br />- mouse->dev.dev = &serio->dev;<br />- mouse->serio = serio;<br />+<br />+ input_dev->name = mouse->name;<br />+ input_dev->phys = mouse->phys;<br />+ input_dev->id.bustype = BUS_RS232;<br />+ input_dev->cdev.dev = &serio->dev;<br />+ input_dev->private = mouse;<br />+<br />+ set_bit (EV_KEY, input_dev->evbit); /* We have buttons */<br />+ set_bit (EV_REL, input_dev->evbit);<br />+ set_bit (EV_ABS, input_dev->evbit);<br />+ set_bit (BTN_LEFT, input_dev->keybit); /* We have 3 buttons */<br />+ set_bit (BTN_MIDDLE, input_dev->keybit);<br />+ set_bit (BTN_RIGHT, input_dev->keybit);<br />+ set_bit (BTN_TOUCH, input_dev->keybit); /* ...and Tablet */<br />+ set_bit (REL_X, input_dev->relbit);<br />+ set_bit (REL_Y, input_dev->relbit);<br />+ input_set_abs_params (input_dev, ABS_X, 0, 1023, 0, 0);<br />+ input_set_abs_params (input_dev, ABS_Y, 0, 1023, 0, 0);<br /> <br /> serio_set_drvdata (serio, mouse);<br /> <br /> err = serio_open (serio, drv);<br />- if (err) {<br />- serio_set_drvdata (serio, NULL);<br />- kfree (mouse);<br />- return err;<br />- }<br />+ if (err)<br />+ goto fail;<br /> <br /> /*<br /> * Request selftest. Standard packet format and differential<br /> * mode will be requested after the device ID'ed successfully.<br /> */<br />- mouse->serio->write (mouse->serio, 'T'); /* Test */<br />-<br />- input_register_device (&mouse->dev);<br />+ serio->write (serio, 'T'); /* Test */<br /> <br />- printk (KERN_INFO "input: %s on %s\n", mouse->name, mouse->phys);<br />+ input_register_device (input_dev);<br /> <br /> return 0;<br />+<br />+ fail: serio_set_drvdata (serio, NULL);<br />+ input_free_device (input_dev);<br />+ kfree (mouse);<br />+ return err;<br /> }<br /> <br /> static struct serio_device_id vsxxaa_serio_ids[] = {<br />Index: work/drivers/input/mouse/psmouse-base.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/psmouse-base.c<br />+++ work/drivers/input/mouse/psmouse-base.c<br />@@ -114,7 +114,7 @@ struct psmouse_protocol {<br /> <br /> static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &psmouse->dev;<br />+ struct input_dev *dev = psmouse->dev;<br /> unsigned char *packet = psmouse->packet;<br /> <br /> if (psmouse->pktcnt < psmouse->pktsize)<br />@@ -333,12 +333,11 @@ static int genius_detect(struct psmouse <br /> return -1;<br /> <br /> if (set_properties) {<br />- set_bit(BTN_EXTRA, psmouse->dev.keybit);<br />- set_bit(BTN_SIDE, psmouse->dev.keybit);<br />- set_bit(REL_WHEEL, psmouse->dev.relbit);<br />+ set_bit(BTN_EXTRA, psmouse->dev->keybit);<br />+ set_bit(BTN_SIDE, psmouse->dev->keybit);<br />+ set_bit(REL_WHEEL, psmouse->dev->relbit);<br /> <br /> psmouse->vendor = "Genius";<br />- psmouse->name = "Wheel Mouse";<br /> psmouse->pktsize = 4;<br /> }<br /> <br />@@ -365,8 +364,8 @@ static int intellimouse_detect(struct ps<br /> return -1;<br /> <br /> if (set_properties) {<br />- set_bit(BTN_MIDDLE, psmouse->dev.keybit);<br />- set_bit(REL_WHEEL, psmouse->dev.relbit);<br />+ set_bit(BTN_MIDDLE, psmouse->dev->keybit);<br />+ set_bit(REL_WHEEL, psmouse->dev->relbit);<br /> <br /> if (!psmouse->vendor) psmouse->vendor = "Generic";<br /> if (!psmouse->name) psmouse->name = "Wheel Mouse";<br />@@ -398,10 +397,10 @@ static int im_explorer_detect(struct psm<br /> return -1;<br /> <br /> if (set_properties) {<br />- set_bit(BTN_MIDDLE, psmouse->dev.keybit);<br />- set_bit(REL_WHEEL, psmouse->dev.relbit);<br />- set_bit(BTN_SIDE, psmouse->dev.keybit);<br />- set_bit(BTN_EXTRA, psmouse->dev.keybit);<br />+ set_bit(BTN_MIDDLE, psmouse->dev->keybit);<br />+ set_bit(REL_WHEEL, psmouse->dev->relbit);<br />+ set_bit(BTN_SIDE, psmouse->dev->keybit);<br />+ set_bit(BTN_EXTRA, psmouse->dev->keybit);<br /> <br /> if (!psmouse->vendor) psmouse->vendor = "Generic";<br /> if (!psmouse->name) psmouse->name = "Explorer Mouse";<br />@@ -433,7 +432,7 @@ static int thinking_detect(struct psmous<br /> return -1;<br /> <br /> if (set_properties) {<br />- set_bit(BTN_EXTRA, psmouse->dev.keybit);<br />+ set_bit(BTN_EXTRA, psmouse->dev->keybit);<br /> <br /> psmouse->vendor = "Kensington";<br /> psmouse->name = "ThinkingMouse";<br />@@ -839,9 +838,9 @@ static void psmouse_disconnect(struct se<br /> <br /> psmouse_set_state(psmouse, PSMOUSE_IGNORE);<br /> <br />- input_unregister_device(&psmouse->dev);<br /> serio_close(serio);<br /> serio_set_drvdata(serio, NULL);<br />+ input_unregister_device(psmouse->dev);<br /> kfree(psmouse);<br /> <br /> if (parent)<br />@@ -852,16 +851,14 @@ static void psmouse_disconnect(struct se<br /> <br /> static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_protocol *proto)<br /> {<br />- memset(&psmouse->dev, 0, sizeof(struct input_dev));<br />+ struct input_dev *input_dev = psmouse->dev;<br /> <br />- init_input_dev(&psmouse->dev);<br />+ input_dev->private = psmouse;<br />+ input_dev->cdev.dev = &psmouse->ps2dev.serio->dev;<br /> <br />- psmouse->dev.private = psmouse;<br />- psmouse->dev.dev = &psmouse->ps2dev.serio->dev;<br />-<br />- psmouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />- psmouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />- psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />+ input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+ input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br /> <br /> psmouse->set_rate = psmouse_set_rate;<br /> psmouse->set_resolution = psmouse_set_resolution;<br />@@ -883,12 +880,12 @@ static int psmouse_switch_protocol(struc<br /> sprintf(psmouse->devname, "%s %s %s",<br /> psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name);<br /> <br />- psmouse->dev.name = psmouse->devname;<br />- psmouse->dev.phys = psmouse->phys;<br />- psmouse->dev.id.bustype = BUS_I8042;<br />- psmouse->dev.id.vendor = 0x0002;<br />- psmouse->dev.id.product = psmouse->type;<br />- psmouse->dev.id.version = psmouse->model;<br />+ input_dev->name = psmouse->devname;<br />+ input_dev->phys = psmouse->phys;<br />+ input_dev->id.bustype = BUS_I8042;<br />+ input_dev->id.vendor = 0x0002;<br />+ input_dev->id.product = psmouse->type;<br />+ input_dev->id.version = psmouse->model;<br /> <br /> return 0;<br /> }<br />@@ -900,7 +897,8 @@ static int psmouse_switch_protocol(struc<br /> static int psmouse_connect(struct serio *serio, struct serio_driver *drv)<br /> {<br /> struct psmouse *psmouse, *parent = NULL;<br />- int retval;<br />+ struct input_dev *input_dev;<br />+ int retval = -ENOMEM;<br /> <br /> down(&psmouse_sem);<br /> <br />@@ -913,12 +911,13 @@ static int psmouse_connect(struct serio <br /> psmouse_deactivate(parent);<br /> }<br /> <br />- if (!(psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL))) {<br />- retval = -ENOMEM;<br />+ psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL);<br />+ input_dev = input_allocate_device();<br />+ if (!psmouse || !input_dev)<br /> goto out;<br />- }<br /> <br /> ps2_init(&psmouse->ps2dev, serio);<br />+ psmouse->dev = input_dev;<br /> sprintf(psmouse->phys, "%s/input0", serio->phys);<br /> <br /> psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);<br />@@ -926,16 +925,11 @@ static int psmouse_connect(struct serio <br /> serio_set_drvdata(serio, psmouse);<br /> <br /> retval = serio_open(serio, drv);<br />- if (retval) {<br />- serio_set_drvdata(serio, NULL);<br />- kfree(psmouse);<br />+ if (retval)<br /> goto out;<br />- }<br /> <br /> if (psmouse_probe(psmouse) < 0) {<br /> serio_close(serio);<br />- serio_set_drvdata(serio, NULL);<br />- kfree(psmouse);<br /> retval = -ENODEV;<br /> goto out;<br /> }<br />@@ -947,13 +941,11 @@ static int psmouse_connect(struct serio <br /> <br /> psmouse_switch_protocol(psmouse, NULL);<br /> <br />- input_register_device(&psmouse->dev);<br />- printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys);<br />-<br /> psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);<br />-<br /> psmouse_initialize(psmouse);<br /> <br />+ input_register_device(psmouse->dev);<br />+<br /> if (parent && parent->pt_activate)<br /> parent->pt_activate(parent);<br /> <br />@@ -964,6 +956,12 @@ static int psmouse_connect(struct serio <br /> retval = 0;<br /> <br /> out:<br />+ if (retval) {<br />+ serio_set_drvdata(serio, NULL);<br />+ input_free_device(input_dev);<br />+ kfree(psmouse);<br />+ }<br />+<br /> /* If this is a pass-through port the parent needs to be re-activated */<br /> if (parent)<br /> psmouse_activate(parent);<br />@@ -1161,6 +1159,7 @@ static ssize_t psmouse_attr_set_protocol<br /> {<br /> struct serio *serio = psmouse->ps2dev.serio;<br /> struct psmouse *parent = NULL;<br />+ struct input_dev *new_dev;<br /> struct psmouse_protocol *proto;<br /> int retry = 0;<br /> <br />@@ -1170,9 +1169,13 @@ static ssize_t psmouse_attr_set_protocol<br /> if (psmouse->type == proto->type)<br /> return count;<br /> <br />+ if (!(new_dev = input_allocate_device()))<br />+ return -ENOMEM;<br />+<br /> while (serio->child) {<br /> if (++retry > 3) {<br /> printk(KERN_WARNING "psmouse: failed to destroy child port, protocol change aborted.\n");<br />+ input_free_device(new_dev);<br /> return -EIO;<br /> }<br /> <br />@@ -1182,11 +1185,15 @@ static ssize_t psmouse_attr_set_protocol<br /> serio_pin_driver_uninterruptible(serio);<br /> down(&psmouse_sem);<br /> <br />- if (serio->drv != &psmouse_drv)<br />+ if (serio->drv != &psmouse_drv) {<br />+ input_free_device(new_dev);<br /> return -ENODEV;<br />+ }<br /> <br />- if (psmouse->type == proto->type)<br />+ if (psmouse->type == proto->type) {<br />+ input_free_device(new_dev);<br /> return count; /* switched by other thread */<br />+ }<br /> }<br /> <br /> if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) {<br />@@ -1199,8 +1206,9 @@ static ssize_t psmouse_attr_set_protocol<br /> psmouse->disconnect(psmouse);<br /> <br /> psmouse_set_state(psmouse, PSMOUSE_IGNORE);<br />- input_unregister_device(&psmouse->dev);<br />+ input_unregister_device(psmouse->dev);<br /> <br />+ psmouse->dev = new_dev;<br /> psmouse_set_state(psmouse, PSMOUSE_INITIALIZING);<br /> <br /> if (psmouse_switch_protocol(psmouse, proto) < 0) {<br />@@ -1212,8 +1220,7 @@ static ssize_t psmouse_attr_set_protocol<br /> psmouse_initialize(psmouse);<br /> psmouse_set_state(psmouse, PSMOUSE_CMD_MODE);<br /> <br />- input_register_device(&psmouse->dev);<br />- printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys);<br />+ input_register_device(psmouse->dev);<br /> <br /> if (parent && parent->pt_activate)<br /> parent->pt_activate(parent);<br />Index: work/drivers/input/mouse/psmouse.h<br />===================================================================<br />--- work.orig/drivers/input/mouse/psmouse.h<br />+++ work/drivers/input/mouse/psmouse.h<br />@@ -36,7 +36,7 @@ typedef enum {<br /> <br /> struct psmouse {<br /> void *private;<br />- struct input_dev dev;<br />+ struct input_dev *dev;<br /> struct ps2dev ps2dev;<br /> char *vendor;<br /> char *name;<br />Index: work/drivers/input/mouse/synaptics.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/synaptics.c<br />+++ work/drivers/input/mouse/synaptics.c<br />@@ -342,7 +342,7 @@ static void synaptics_parse_hw_state(uns<br /> */<br /> static void synaptics_process_packet(struct psmouse *psmouse)<br /> {<br />- struct input_dev *dev = &psmouse->dev;<br />+ struct input_dev *dev = psmouse->dev;<br /> struct synaptics_data *priv = psmouse->private;<br /> struct synaptics_hw_state hw;<br /> int num_fingers;<br />@@ -473,7 +473,7 @@ static unsigned char synaptics_detect_pk<br /> <br /> static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &psmouse->dev;<br />+ struct input_dev *dev = psmouse->dev;<br /> struct synaptics_data *priv = psmouse->private;<br /> <br /> input_regs(dev, regs);<br />@@ -645,7 +645,7 @@ int synaptics_init(struct psmouse *psmou<br /> SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity),<br /> priv->model_id, priv->capabilities, priv->ext_cap);<br /> <br />- set_input_params(&psmouse->dev, priv);<br />+ set_input_params(psmouse->dev, priv);<br /> <br /> psmouse->protocol_handler = synaptics_process_byte;<br /> psmouse->set_rate = synaptics_set_rate;<br />Index: work/drivers/input/mouse/alps.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/alps.c<br />+++ work/drivers/input/mouse/alps.c<br />@@ -79,8 +79,8 @@ static void alps_process_packet(struct p<br /> {<br /> struct alps_data *priv = psmouse->private;<br /> unsigned char *packet = psmouse->packet;<br />- struct input_dev *dev = &psmouse->dev;<br />- struct input_dev *dev2 = &priv->dev2;<br />+ struct input_dev *dev = psmouse->dev;<br />+ struct input_dev *dev2 = priv->dev2;<br /> int x, y, z, ges, fin, left, right, middle;<br /> int back = 0, forward = 0;<br /> <br />@@ -379,20 +379,24 @@ static int alps_reconnect(struct psmouse<br /> static void alps_disconnect(struct psmouse *psmouse)<br /> {<br /> struct alps_data *priv = psmouse->private;<br />+<br /> psmouse_reset(psmouse);<br />- input_unregister_device(&priv->dev2);<br />+ input_unregister_device(priv->dev2);<br /> kfree(priv);<br /> }<br /> <br /> int alps_init(struct psmouse *psmouse)<br /> {<br /> struct alps_data *priv;<br />+ struct input_dev *dev1 = psmouse->dev, *dev2;<br /> int version;<br /> <br />- psmouse->private = priv = kmalloc(sizeof(struct alps_data), GFP_KERNEL);<br />- if (!priv)<br />+ psmouse->private = priv = kzalloc(sizeof(struct alps_data), GFP_KERNEL);<br />+ dev2 = input_allocate_device();<br />+ if (!priv || !dev2)<br /> goto init_fail;<br />- memset(priv, 0, sizeof(struct alps_data));<br />+<br />+ priv->dev2 = dev2;<br /> <br /> if (!(priv->i = alps_get_model(psmouse, &version)))<br /> goto init_fail;<br />@@ -411,41 +415,39 @@ int alps_init(struct psmouse *psmouse)<br /> if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0))<br /> goto init_fail;<br /> <br />- psmouse->dev.evbit[LONG(EV_KEY)] |= BIT(EV_KEY);<br />- psmouse->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH);<br />- psmouse->dev.keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER);<br />- psmouse->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />-<br />- psmouse->dev.evbit[LONG(EV_ABS)] |= BIT(EV_ABS);<br />- input_set_abs_params(&psmouse->dev, ABS_X, 0, 1023, 0, 0);<br />- input_set_abs_params(&psmouse->dev, ABS_Y, 0, 767, 0, 0);<br />- input_set_abs_params(&psmouse->dev, ABS_PRESSURE, 0, 127, 0, 0);<br />+ dev1->evbit[LONG(EV_KEY)] |= BIT(EV_KEY);<br />+ dev1->keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH);<br />+ dev1->keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER);<br />+ dev1->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+<br />+ dev1->evbit[LONG(EV_ABS)] |= BIT(EV_ABS);<br />+ input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0);<br />+ input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0);<br />+ input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0);<br /> <br /> if (priv->i->flags & ALPS_WHEEL) {<br />- psmouse->dev.evbit[LONG(EV_REL)] |= BIT(EV_REL);<br />- psmouse->dev.relbit[LONG(REL_WHEEL)] |= BIT(REL_WHEEL);<br />+ dev1->evbit[LONG(EV_REL)] |= BIT(EV_REL);<br />+ dev1->relbit[LONG(REL_WHEEL)] |= BIT(REL_WHEEL);<br /> }<br /> <br /> if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) {<br />- psmouse->dev.keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD);<br />- psmouse->dev.keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK);<br />+ dev1->keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD);<br />+ dev1->keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK);<br /> }<br /> <br /> sprintf(priv->phys, "%s/input1", psmouse->ps2dev.serio->phys);<br />- priv->dev2.phys = priv->phys;<br />- priv->dev2.name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse";<br />- priv->dev2.id.bustype = BUS_I8042;<br />- priv->dev2.id.vendor = 0x0002;<br />- priv->dev2.id.product = PSMOUSE_ALPS;<br />- priv->dev2.id.version = 0x0000;<br />-<br />- priv->dev2.evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />- priv->dev2.relbit[LONG(REL_X)] |= BIT(REL_X) | BIT(REL_Y);<br />- priv->dev2.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />-<br />- input_register_device(&priv->dev2);<br />+ dev2->phys = priv->phys;<br />+ dev2->name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse";<br />+ dev2->id.bustype = BUS_I8042;<br />+ dev2->id.vendor = 0x0002;<br />+ dev2->id.product = PSMOUSE_ALPS;<br />+ dev2->id.version = 0x0000;<br />+<br />+ dev2->evbit[0] = BIT(EV_KEY) | BIT(EV_REL);<br />+ dev2->relbit[LONG(REL_X)] |= BIT(REL_X) | BIT(REL_Y);<br />+ dev2->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br /> <br />- printk(KERN_INFO "input: %s on %s\n", priv->dev2.name, psmouse->ps2dev.serio->phys);<br />+ input_register_device(priv->dev2);<br /> <br /> psmouse->protocol_handler = alps_process_byte;<br /> psmouse->disconnect = alps_disconnect;<br />@@ -455,6 +457,7 @@ int alps_init(struct psmouse *psmouse)<br /> return 0;<br /> <br /> init_fail:<br />+ input_free_device(dev2);<br /> kfree(priv);<br /> return -1;<br /> }<br />Index: work/drivers/input/mouse/logips2pp.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/logips2pp.c<br />+++ work/drivers/input/mouse/logips2pp.c<br />@@ -40,7 +40,7 @@ struct ps2pp_info {<br /> <br /> static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse, struct pt_regs *regs)<br /> {<br />- struct input_dev *dev = &psmouse->dev;<br />+ struct input_dev *dev = psmouse->dev;<br /> unsigned char *packet = psmouse->packet;<br /> <br /> if (psmouse->pktcnt < 3)<br />@@ -257,25 +257,27 @@ static struct ps2pp_info *get_model_info<br /> static void ps2pp_set_model_properties(struct psmouse *psmouse, struct ps2pp_info *model_info,<br /> int using_ps2pp)<br /> {<br />+ struct input_dev *input_dev = psmouse->dev;<br />+<br /> if (model_info->features & PS2PP_SIDE_BTN)<br />- set_bit(BTN_SIDE, psmouse->dev.keybit);<br />+ set_bit(BTN_SIDE, input_dev->keybit);<br /> <br /> if (model_info->features & PS2PP_EXTRA_BTN)<br />- set_bit(BTN_EXTRA, psmouse->dev.keybit);<br />+ set_bit(BTN_EXTRA, input_dev->keybit);<br /> <br /> if (model_info->features & PS2PP_TASK_BTN)<br />- set_bit(BTN_TASK, psmouse->dev.keybit);<br />+ set_bit(BTN_TASK, input_dev->keybit);<br /> <br /> if (model_info->features & PS2PP_NAV_BTN) {<br />- set_bit(BTN_FORWARD, psmouse->dev.keybit);<br />- set_bit(BTN_BACK, psmouse->dev.keybit);<br />+ set_bit(BTN_FORWARD, input_dev->keybit);<br />+ set_bit(BTN_BACK, input_dev->keybit);<br /> }<br /> <br /> if (model_info->features & PS2PP_WHEEL)<br />- set_bit(REL_WHEEL, psmouse->dev.relbit);<br />+ set_bit(REL_WHEEL, input_dev->relbit);<br /> <br /> if (model_info->features & PS2PP_HWHEEL)<br />- set_bit(REL_HWHEEL, psmouse->dev.relbit);<br />+ set_bit(REL_HWHEEL, input_dev->relbit);<br /> <br /> switch (model_info->kind) {<br /> case PS2PP_KIND_WHEEL:<br />@@ -387,7 +389,7 @@ int ps2pp_init(struct psmouse *psmouse, <br /> }<br /> <br /> if (buttons < 3)<br />- clear_bit(BTN_MIDDLE, psmouse->dev.keybit);<br />+ clear_bit(BTN_MIDDLE, psmouse->dev->keybit);<br /> <br /> if (model_info)<br /> ps2pp_set_model_properties(psmouse, model_info, use_ps2pp);<br />Index: work/drivers/input/mouse/alps.h<br />===================================================================<br />--- work.orig/drivers/input/mouse/alps.h<br />+++ work/drivers/input/mouse/alps.h<br />@@ -22,7 +22,7 @@ struct alps_model_info {<br /> };<br /> <br /> struct alps_data {<br />- struct input_dev dev2; /* Relative device */<br />+ struct input_dev *dev2; /* Relative device */<br /> char name[32]; /* Name */<br /> char phys[32]; /* Phys */<br /> struct alps_model_info *i; /* Info */<br />Index: work/drivers/input/mouse/lifebook.c<br />===================================================================<br />--- work.orig/drivers/input/mouse/lifebook.c<br />+++ work/drivers/input/mouse/lifebook.c<br />@@ -34,7 +34,7 @@ static struct dmi_system_id lifebook_dmi<br /> static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse, struct pt_regs *regs)<br /> {<br /> unsigned char *packet = psmouse->packet;<br />- struct input_dev *dev = &psmouse->dev;<br />+ struct input_dev *dev = psmouse->dev;<br /> <br /> if (psmouse->pktcnt != 3)<br /> return PSMOUSE_GOOD_DATA;<br />@@ -113,15 +113,17 @@ int lifebook_detect(struct psmouse *psmo<br /> <br /> int lifebook_init(struct psmouse *psmouse)<br /> {<br />+ struct input_dev *input_dev = psmouse->dev;<br />+<br /> if (lifebook_absolute_mode(psmouse))<br /> return -1;<br /> <br />- psmouse->dev.evbit[0] = BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL);<br />- psmouse->dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />- psmouse->dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);<br />- psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />- input_set_abs_params(&psmouse->dev, ABS_X, 0, 1024, 0, 0);<br />- input_set_abs_params(&psmouse->dev, ABS_Y, 0, 1024, 0, 0);<br />+ input_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL);<br />+ input_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT);<br />+ input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);<br />+ input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y);<br />+ input_set_abs_params(input_dev, ABS_X, 0, 1024, 0, 0);<br />+ input_set_abs_params(input_dev, ABS_Y, 0, 1024, 0, 0);<br /> <br /> psmouse->protocol_handler = lifebook_process_byte;<br /> psmouse->set_resolution = lifebook_set_resolution;<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 10: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>