blob: b8894a059f87236623b395473e57a2c17638623d [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * The input core
3 *
4 * Copyright (c) 1999-2002 Vojtech Pavlik
5 */
6
7/*
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License version 2 as published by
10 * the Free Software Foundation.
11 */
12
Joe Perchesda0c4902010-11-29 23:33:07 -080013#define pr_fmt(fmt) KBUILD_BASENAME ": " fmt
14
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#include <linux/init.h>
Dmitry Torokhovffd0db92009-09-16 01:06:43 -070016#include <linux/types.h>
Henrik Rydberg47c78e82010-11-27 09:16:48 +010017#include <linux/input/mt.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <linux/module.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090019#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070020#include <linux/random.h>
21#include <linux/major.h>
22#include <linux/proc_fs.h>
Alexey Dobriyana99bbaf2009-10-04 16:11:37 +040023#include <linux/sched.h>
Dmitry Torokhov969b21c2006-04-02 00:09:34 -050024#include <linux/seq_file.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070025#include <linux/poll.h>
26#include <linux/device.h>
Jes Sorensene676c232006-02-19 00:21:46 -050027#include <linux/mutex.h>
Dmitry Torokhov80064792007-08-30 00:22:11 -040028#include <linux/rcupdate.h>
Jonathan Corbet2edbf852008-05-15 10:37:16 -060029#include <linux/smp_lock.h>
Dmitry Torokhov15e184a2010-01-11 00:05:43 -080030#include "input-compat.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070031
32MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
33MODULE_DESCRIPTION("Input core");
34MODULE_LICENSE("GPL");
35
Linus Torvalds1da177e2005-04-16 15:20:36 -070036#define INPUT_DEVICES 256
37
38static LIST_HEAD(input_dev_list);
39static LIST_HEAD(input_handler_list);
40
Dmitry Torokhov80064792007-08-30 00:22:11 -040041/*
42 * input_mutex protects access to both input_dev_list and input_handler_list.
43 * This also causes input_[un]register_device and input_[un]register_handler
44 * be mutually exclusive which simplifies locking in drivers implementing
45 * input handlers.
46 */
47static DEFINE_MUTEX(input_mutex);
48
Linus Torvalds1da177e2005-04-16 15:20:36 -070049static struct input_handler *input_table[8];
50
Dmitry Torokhov80064792007-08-30 00:22:11 -040051static inline int is_event_supported(unsigned int code,
52 unsigned long *bm, unsigned int max)
53{
54 return code <= max && test_bit(code, bm);
55}
56
57static int input_defuzz_abs_event(int value, int old_val, int fuzz)
58{
59 if (fuzz) {
60 if (value > old_val - fuzz / 2 && value < old_val + fuzz / 2)
61 return old_val;
62
63 if (value > old_val - fuzz && value < old_val + fuzz)
64 return (old_val * 3 + value) / 4;
65
66 if (value > old_val - fuzz * 2 && value < old_val + fuzz * 2)
67 return (old_val + value) / 2;
68 }
69
70 return value;
71}
72
73/*
Dmitry Torokhovef7995f2010-01-29 23:59:12 -080074 * Pass event first through all filters and then, if event has not been
75 * filtered out, through all open handles. This function is called with
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -040076 * dev->event_lock held and interrupts disabled.
Dmitry Torokhov80064792007-08-30 00:22:11 -040077 */
78static void input_pass_event(struct input_dev *dev,
79 unsigned int type, unsigned int code, int value)
80{
Dmitry Torokhovef7995f2010-01-29 23:59:12 -080081 struct input_handler *handler;
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -040082 struct input_handle *handle;
Dmitry Torokhov80064792007-08-30 00:22:11 -040083
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -040084 rcu_read_lock();
85
86 handle = rcu_dereference(dev->grab);
Dmitry Torokhov80064792007-08-30 00:22:11 -040087 if (handle)
88 handle->handler->event(handle, type, code, value);
Dmitry Torokhovef7995f2010-01-29 23:59:12 -080089 else {
90 bool filtered = false;
91
92 list_for_each_entry_rcu(handle, &dev->h_list, d_node) {
93 if (!handle->open)
94 continue;
95
96 handler = handle->handler;
97 if (!handler->filter) {
98 if (filtered)
99 break;
100
101 handler->event(handle, type, code, value);
102
103 } else if (handler->filter(handle, type, code, value))
104 filtered = true;
105 }
106 }
107
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400108 rcu_read_unlock();
Dmitry Torokhov80064792007-08-30 00:22:11 -0400109}
110
111/*
112 * Generate software autorepeat event. Note that we take
113 * dev->event_lock here to avoid racing with input_event
114 * which may cause keys get "stuck".
115 */
116static void input_repeat_key(unsigned long data)
117{
118 struct input_dev *dev = (void *) data;
119 unsigned long flags;
120
121 spin_lock_irqsave(&dev->event_lock, flags);
122
123 if (test_bit(dev->repeat_key, dev->key) &&
124 is_event_supported(dev->repeat_key, dev->keybit, KEY_MAX)) {
125
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800126 input_pass_event(dev, EV_KEY, dev->repeat_key, 2);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400127
128 if (dev->sync) {
129 /*
130 * Only send SYN_REPORT if we are not in a middle
131 * of driver parsing a new hardware packet.
132 * Otherwise assume that the driver will send
133 * SYN_REPORT once it's done.
134 */
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800135 input_pass_event(dev, EV_SYN, SYN_REPORT, 1);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400136 }
137
138 if (dev->rep[REP_PERIOD])
139 mod_timer(&dev->timer, jiffies +
140 msecs_to_jiffies(dev->rep[REP_PERIOD]));
141 }
142
143 spin_unlock_irqrestore(&dev->event_lock, flags);
144}
145
146static void input_start_autorepeat(struct input_dev *dev, int code)
147{
148 if (test_bit(EV_REP, dev->evbit) &&
149 dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] &&
150 dev->timer.data) {
151 dev->repeat_key = code;
152 mod_timer(&dev->timer,
153 jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
154 }
155}
156
Johannes Berge7b5c1e2009-01-29 23:17:52 -0800157static void input_stop_autorepeat(struct input_dev *dev)
158{
159 del_timer(&dev->timer);
160}
161
Dmitry Torokhov80064792007-08-30 00:22:11 -0400162#define INPUT_IGNORE_EVENT 0
163#define INPUT_PASS_TO_HANDLERS 1
164#define INPUT_PASS_TO_DEVICE 2
165#define INPUT_PASS_TO_ALL (INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE)
166
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700167static int input_handle_abs_event(struct input_dev *dev,
168 unsigned int code, int *pval)
169{
170 bool is_mt_event;
171 int *pold;
172
173 if (code == ABS_MT_SLOT) {
174 /*
175 * "Stage" the event; we'll flush it later, when we
Dmitry Torokhov144c0f82010-09-03 10:31:05 -0700176 * get actual touch data.
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700177 */
178 if (*pval >= 0 && *pval < dev->mtsize)
179 dev->slot = *pval;
180
181 return INPUT_IGNORE_EVENT;
182 }
183
184 is_mt_event = code >= ABS_MT_FIRST && code <= ABS_MT_LAST;
185
186 if (!is_mt_event) {
Daniel Mackd31b2862010-08-02 20:18:21 -0700187 pold = &dev->absinfo[code].value;
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700188 } else if (dev->mt) {
189 struct input_mt_slot *mtslot = &dev->mt[dev->slot];
190 pold = &mtslot->abs[code - ABS_MT_FIRST];
191 } else {
192 /*
Dmitry Torokhov144c0f82010-09-03 10:31:05 -0700193 * Bypass filtering for multi-touch events when
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700194 * not employing slots.
195 */
196 pold = NULL;
197 }
198
199 if (pold) {
200 *pval = input_defuzz_abs_event(*pval, *pold,
Daniel Mackd31b2862010-08-02 20:18:21 -0700201 dev->absinfo[code].fuzz);
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700202 if (*pold == *pval)
203 return INPUT_IGNORE_EVENT;
204
205 *pold = *pval;
206 }
207
208 /* Flush pending "slot" event */
Daniel Mack987a6c02010-08-02 20:15:17 -0700209 if (is_mt_event && dev->slot != input_abs_get_val(dev, ABS_MT_SLOT)) {
210 input_abs_set_val(dev, ABS_MT_SLOT, dev->slot);
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800211 input_pass_event(dev, EV_ABS, ABS_MT_SLOT, dev->slot);
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700212 }
213
214 return INPUT_PASS_TO_HANDLERS;
215}
216
Dmitry Torokhov80064792007-08-30 00:22:11 -0400217static void input_handle_event(struct input_dev *dev,
218 unsigned int type, unsigned int code, int value)
219{
220 int disposition = INPUT_IGNORE_EVENT;
221
222 switch (type) {
223
224 case EV_SYN:
225 switch (code) {
226 case SYN_CONFIG:
227 disposition = INPUT_PASS_TO_ALL;
228 break;
229
230 case SYN_REPORT:
231 if (!dev->sync) {
Dmitry Torokhov20da92d2010-07-15 23:27:36 -0700232 dev->sync = true;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400233 disposition = INPUT_PASS_TO_HANDLERS;
234 }
235 break;
Henrik Rydberg5e5ee682009-04-28 07:47:33 -0700236 case SYN_MT_REPORT:
Dmitry Torokhov20da92d2010-07-15 23:27:36 -0700237 dev->sync = false;
Henrik Rydberg5e5ee682009-04-28 07:47:33 -0700238 disposition = INPUT_PASS_TO_HANDLERS;
239 break;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400240 }
241 break;
242
243 case EV_KEY:
244 if (is_event_supported(code, dev->keybit, KEY_MAX) &&
245 !!test_bit(code, dev->key) != value) {
246
247 if (value != 2) {
248 __change_bit(code, dev->key);
249 if (value)
250 input_start_autorepeat(dev, code);
Johannes Berge7b5c1e2009-01-29 23:17:52 -0800251 else
252 input_stop_autorepeat(dev);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400253 }
254
255 disposition = INPUT_PASS_TO_HANDLERS;
256 }
257 break;
258
259 case EV_SW:
260 if (is_event_supported(code, dev->swbit, SW_MAX) &&
261 !!test_bit(code, dev->sw) != value) {
262
263 __change_bit(code, dev->sw);
264 disposition = INPUT_PASS_TO_HANDLERS;
265 }
266 break;
267
268 case EV_ABS:
Henrik Rydberg40d007e2010-07-15 23:10:10 -0700269 if (is_event_supported(code, dev->absbit, ABS_MAX))
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800270 disposition = input_handle_abs_event(dev, code, &value);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400271
Dmitry Torokhov80064792007-08-30 00:22:11 -0400272 break;
273
274 case EV_REL:
275 if (is_event_supported(code, dev->relbit, REL_MAX) && value)
276 disposition = INPUT_PASS_TO_HANDLERS;
277
278 break;
279
280 case EV_MSC:
281 if (is_event_supported(code, dev->mscbit, MSC_MAX))
282 disposition = INPUT_PASS_TO_ALL;
283
284 break;
285
286 case EV_LED:
287 if (is_event_supported(code, dev->ledbit, LED_MAX) &&
288 !!test_bit(code, dev->led) != value) {
289
290 __change_bit(code, dev->led);
291 disposition = INPUT_PASS_TO_ALL;
292 }
293 break;
294
295 case EV_SND:
296 if (is_event_supported(code, dev->sndbit, SND_MAX)) {
297
298 if (!!test_bit(code, dev->snd) != !!value)
299 __change_bit(code, dev->snd);
300 disposition = INPUT_PASS_TO_ALL;
301 }
302 break;
303
304 case EV_REP:
305 if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) {
306 dev->rep[code] = value;
307 disposition = INPUT_PASS_TO_ALL;
308 }
309 break;
310
311 case EV_FF:
312 if (value >= 0)
313 disposition = INPUT_PASS_TO_ALL;
314 break;
Richard Purdieed2fa4d2008-01-03 10:46:21 -0500315
316 case EV_PWR:
317 disposition = INPUT_PASS_TO_ALL;
318 break;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400319 }
320
Dmitry Torokhovc9812282008-06-02 01:02:40 -0400321 if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN)
Dmitry Torokhov20da92d2010-07-15 23:27:36 -0700322 dev->sync = false;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400323
324 if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
325 dev->event(dev, type, code, value);
326
327 if (disposition & INPUT_PASS_TO_HANDLERS)
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800328 input_pass_event(dev, type, code, value);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400329}
330
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400331/**
332 * input_event() - report new input event
Dmitry Torokhov14471902006-11-02 23:26:55 -0500333 * @dev: device that generated the event
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400334 * @type: type of the event
335 * @code: event code
336 * @value: value of the event
337 *
Dmitry Torokhov80064792007-08-30 00:22:11 -0400338 * This function should be used by drivers implementing various input
Dmitry Torokhovdf2d4632009-12-11 21:57:31 -0800339 * devices to report input events. See also input_inject_event().
340 *
341 * NOTE: input_event() may be safely used right after input device was
342 * allocated with input_allocate_device(), even before it is registered
343 * with input_register_device(), but the event will not reach any of the
344 * input handlers. Such early invocation of input_event() may be used
345 * to 'seed' initial state of a switch or initial position of absolute
346 * axis, etc.
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400347 */
Dmitry Torokhov80064792007-08-30 00:22:11 -0400348void input_event(struct input_dev *dev,
349 unsigned int type, unsigned int code, int value)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350{
Dmitry Torokhov80064792007-08-30 00:22:11 -0400351 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352
Dmitry Torokhov80064792007-08-30 00:22:11 -0400353 if (is_event_supported(type, dev->evbit, EV_MAX)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354
Dmitry Torokhov80064792007-08-30 00:22:11 -0400355 spin_lock_irqsave(&dev->event_lock, flags);
356 add_input_randomness(type, code, value);
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800357 input_handle_event(dev, type, code, value);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400358 spin_unlock_irqrestore(&dev->event_lock, flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -0400361EXPORT_SYMBOL(input_event);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400363/**
364 * input_inject_event() - send input event from input handler
365 * @handle: input handle to send event through
366 * @type: type of the event
367 * @code: event code
368 * @value: value of the event
369 *
Dmitry Torokhov80064792007-08-30 00:22:11 -0400370 * Similar to input_event() but will ignore event if device is
371 * "grabbed" and handle injecting event is not the one that owns
372 * the device.
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400373 */
Dmitry Torokhov80064792007-08-30 00:22:11 -0400374void input_inject_event(struct input_handle *handle,
375 unsigned int type, unsigned int code, int value)
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400376{
Dmitry Torokhov80064792007-08-30 00:22:11 -0400377 struct input_dev *dev = handle->dev;
378 struct input_handle *grab;
379 unsigned long flags;
380
381 if (is_event_supported(type, dev->evbit, EV_MAX)) {
382 spin_lock_irqsave(&dev->event_lock, flags);
383
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400384 rcu_read_lock();
Dmitry Torokhov80064792007-08-30 00:22:11 -0400385 grab = rcu_dereference(dev->grab);
386 if (!grab || grab == handle)
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800387 input_handle_event(dev, type, code, value);
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400388 rcu_read_unlock();
Dmitry Torokhov80064792007-08-30 00:22:11 -0400389
390 spin_unlock_irqrestore(&dev->event_lock, flags);
391 }
Dmitry Torokhov0e739d22006-07-06 00:22:43 -0400392}
393EXPORT_SYMBOL(input_inject_event);
394
Dmitry Torokhov80064792007-08-30 00:22:11 -0400395/**
Daniel Mackd31b2862010-08-02 20:18:21 -0700396 * input_alloc_absinfo - allocates array of input_absinfo structs
397 * @dev: the input device emitting absolute events
398 *
399 * If the absinfo struct the caller asked for is already allocated, this
400 * functions will not do anything.
401 */
402void input_alloc_absinfo(struct input_dev *dev)
403{
404 if (!dev->absinfo)
405 dev->absinfo = kcalloc(ABS_CNT, sizeof(struct input_absinfo),
406 GFP_KERNEL);
407
408 WARN(!dev->absinfo, "%s(): kcalloc() failed?\n", __func__);
409}
410EXPORT_SYMBOL(input_alloc_absinfo);
411
412void input_set_abs_params(struct input_dev *dev, unsigned int axis,
413 int min, int max, int fuzz, int flat)
414{
415 struct input_absinfo *absinfo;
416
417 input_alloc_absinfo(dev);
418 if (!dev->absinfo)
419 return;
420
421 absinfo = &dev->absinfo[axis];
422 absinfo->minimum = min;
423 absinfo->maximum = max;
424 absinfo->fuzz = fuzz;
425 absinfo->flat = flat;
426
427 dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis);
428}
429EXPORT_SYMBOL(input_set_abs_params);
430
431
432/**
Dmitry Torokhov80064792007-08-30 00:22:11 -0400433 * input_grab_device - grabs device for exclusive use
434 * @handle: input handle that wants to own the device
435 *
436 * When a device is grabbed by an input handle all events generated by
437 * the device are delivered only to this handle. Also events injected
438 * by other input handles are ignored while device is grabbed.
439 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440int input_grab_device(struct input_handle *handle)
441{
Dmitry Torokhov80064792007-08-30 00:22:11 -0400442 struct input_dev *dev = handle->dev;
443 int retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444
Dmitry Torokhov80064792007-08-30 00:22:11 -0400445 retval = mutex_lock_interruptible(&dev->mutex);
446 if (retval)
447 return retval;
448
449 if (dev->grab) {
450 retval = -EBUSY;
451 goto out;
452 }
453
454 rcu_assign_pointer(dev->grab, handle);
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400455 synchronize_rcu();
Dmitry Torokhov80064792007-08-30 00:22:11 -0400456
457 out:
458 mutex_unlock(&dev->mutex);
459 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -0400461EXPORT_SYMBOL(input_grab_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462
Dmitry Torokhov80064792007-08-30 00:22:11 -0400463static void __input_release_device(struct input_handle *handle)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464{
Andrew Mortona2b2ed22006-07-15 01:17:38 -0400465 struct input_dev *dev = handle->dev;
Dmitry Torokhovc7e8dc62006-07-06 00:21:03 -0400466
Andrew Mortona2b2ed22006-07-15 01:17:38 -0400467 if (dev->grab == handle) {
Dmitry Torokhov80064792007-08-30 00:22:11 -0400468 rcu_assign_pointer(dev->grab, NULL);
469 /* Make sure input_pass_event() notices that grab is gone */
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400470 synchronize_rcu();
Andrew Mortona2b2ed22006-07-15 01:17:38 -0400471
472 list_for_each_entry(handle, &dev->h_list, d_node)
Dmitry Torokhov80064792007-08-30 00:22:11 -0400473 if (handle->open && handle->handler->start)
Dmitry Torokhovc7e8dc62006-07-06 00:21:03 -0400474 handle->handler->start(handle);
475 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476}
Dmitry Torokhov80064792007-08-30 00:22:11 -0400477
478/**
479 * input_release_device - release previously grabbed device
480 * @handle: input handle that owns the device
481 *
482 * Releases previously grabbed device so that other input handles can
483 * start receiving input events. Upon release all handlers attached
484 * to the device have their start() method called so they have a change
485 * to synchronize device state with the rest of the system.
486 */
487void input_release_device(struct input_handle *handle)
488{
489 struct input_dev *dev = handle->dev;
490
491 mutex_lock(&dev->mutex);
492 __input_release_device(handle);
493 mutex_unlock(&dev->mutex);
494}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -0400495EXPORT_SYMBOL(input_release_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496
Dmitry Torokhov80064792007-08-30 00:22:11 -0400497/**
498 * input_open_device - open input device
499 * @handle: handle through which device is being accessed
500 *
501 * This function should be called by input handlers when they
502 * want to start receive events from given input device.
503 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504int input_open_device(struct input_handle *handle)
505{
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500506 struct input_dev *dev = handle->dev;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400507 int retval;
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500508
Dmitry Torokhov80064792007-08-30 00:22:11 -0400509 retval = mutex_lock_interruptible(&dev->mutex);
510 if (retval)
511 return retval;
512
513 if (dev->going_away) {
514 retval = -ENODEV;
515 goto out;
516 }
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500517
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518 handle->open++;
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500519
520 if (!dev->users++ && dev->open)
Dmitry Torokhov80064792007-08-30 00:22:11 -0400521 retval = dev->open(dev);
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500522
Dmitry Torokhov80064792007-08-30 00:22:11 -0400523 if (retval) {
524 dev->users--;
525 if (!--handle->open) {
526 /*
527 * Make sure we are not delivering any more events
528 * through this handle
529 */
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400530 synchronize_rcu();
Dmitry Torokhov80064792007-08-30 00:22:11 -0400531 }
532 }
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500533
Dmitry Torokhov80064792007-08-30 00:22:11 -0400534 out:
Jes Sorensene676c232006-02-19 00:21:46 -0500535 mutex_unlock(&dev->mutex);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400536 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -0400538EXPORT_SYMBOL(input_open_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539
Dmitry Torokhov80064792007-08-30 00:22:11 -0400540int input_flush_device(struct input_handle *handle, struct file *file)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541{
Dmitry Torokhov80064792007-08-30 00:22:11 -0400542 struct input_dev *dev = handle->dev;
543 int retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544
Dmitry Torokhov80064792007-08-30 00:22:11 -0400545 retval = mutex_lock_interruptible(&dev->mutex);
546 if (retval)
547 return retval;
548
549 if (dev->flush)
550 retval = dev->flush(dev, file);
551
552 mutex_unlock(&dev->mutex);
553 return retval;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700554}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -0400555EXPORT_SYMBOL(input_flush_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556
Dmitry Torokhov80064792007-08-30 00:22:11 -0400557/**
558 * input_close_device - close input device
559 * @handle: handle through which device is being accessed
560 *
561 * This function should be called by input handlers when they
562 * want to stop receive events from given input device.
563 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564void input_close_device(struct input_handle *handle)
565{
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500566 struct input_dev *dev = handle->dev;
567
Jes Sorensene676c232006-02-19 00:21:46 -0500568 mutex_lock(&dev->mutex);
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500569
Dmitry Torokhov80064792007-08-30 00:22:11 -0400570 __input_release_device(handle);
571
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500572 if (!--dev->users && dev->close)
573 dev->close(dev);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400574
575 if (!--handle->open) {
576 /*
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400577 * synchronize_rcu() makes sure that input_pass_event()
Dmitry Torokhov80064792007-08-30 00:22:11 -0400578 * completed and that no more input events are delivered
579 * through this handle
580 */
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -0400581 synchronize_rcu();
Dmitry Torokhov80064792007-08-30 00:22:11 -0400582 }
Dmitry Torokhov0fbf87c2005-05-29 02:29:25 -0500583
Jes Sorensene676c232006-02-19 00:21:46 -0500584 mutex_unlock(&dev->mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -0400586EXPORT_SYMBOL(input_close_device);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700587
Dmitry Torokhov80064792007-08-30 00:22:11 -0400588/*
Oliver Neukum866d7d72010-07-01 09:01:50 -0700589 * Simulate keyup events for all keys that are marked as pressed.
590 * The function must be called with dev->event_lock held.
591 */
592static void input_dev_release_keys(struct input_dev *dev)
593{
594 int code;
595
596 if (is_event_supported(EV_KEY, dev->evbit, EV_MAX)) {
597 for (code = 0; code <= KEY_MAX; code++) {
598 if (is_event_supported(code, dev->keybit, KEY_MAX) &&
599 __test_and_clear_bit(code, dev->key)) {
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800600 input_pass_event(dev, EV_KEY, code, 0);
Oliver Neukum866d7d72010-07-01 09:01:50 -0700601 }
602 }
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800603 input_pass_event(dev, EV_SYN, SYN_REPORT, 1);
Oliver Neukum866d7d72010-07-01 09:01:50 -0700604 }
605}
606
607/*
Dmitry Torokhov80064792007-08-30 00:22:11 -0400608 * Prepare device for unregistering
609 */
610static void input_disconnect_device(struct input_dev *dev)
611{
612 struct input_handle *handle;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400613
614 /*
615 * Mark device as going away. Note that we take dev->mutex here
616 * not to protect access to dev->going_away but rather to ensure
617 * that there are no threads in the middle of input_open_device()
618 */
619 mutex_lock(&dev->mutex);
Dmitry Torokhovffd0db92009-09-16 01:06:43 -0700620 dev->going_away = true;
Dmitry Torokhov80064792007-08-30 00:22:11 -0400621 mutex_unlock(&dev->mutex);
622
623 spin_lock_irq(&dev->event_lock);
624
625 /*
626 * Simulate keyup events for all pressed keys so that handlers
627 * are not left with "stuck" keys. The driver may continue
628 * generate events even after we done here but they will not
629 * reach any handlers.
630 */
Oliver Neukum866d7d72010-07-01 09:01:50 -0700631 input_dev_release_keys(dev);
Dmitry Torokhov80064792007-08-30 00:22:11 -0400632
633 list_for_each_entry(handle, &dev->h_list, d_node)
634 handle->open = 0;
635
636 spin_unlock_irq(&dev->event_lock);
637}
638
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700639/**
640 * input_scancode_to_scalar() - converts scancode in &struct input_keymap_entry
641 * @ke: keymap entry containing scancode to be converted.
642 * @scancode: pointer to the location where converted scancode should
643 * be stored.
644 *
645 * This function is used to convert scancode stored in &struct keymap_entry
646 * into scalar form understood by legacy keymap handling methods. These
647 * methods expect scancodes to be represented as 'unsigned int'.
648 */
649int input_scancode_to_scalar(const struct input_keymap_entry *ke,
650 unsigned int *scancode)
651{
652 switch (ke->len) {
653 case 1:
654 *scancode = *((u8 *)ke->scancode);
655 break;
656
657 case 2:
658 *scancode = *((u16 *)ke->scancode);
659 break;
660
661 case 4:
662 *scancode = *((u32 *)ke->scancode);
663 break;
664
665 default:
666 return -EINVAL;
667 }
668
669 return 0;
670}
671EXPORT_SYMBOL(input_scancode_to_scalar);
672
673/*
674 * Those routines handle the default case where no [gs]etkeycode() is
675 * defined. In this case, an array indexed by the scancode is used.
676 */
677
678static unsigned int input_fetch_keycode(struct input_dev *dev,
679 unsigned int index)
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400680{
681 switch (dev->keycodesize) {
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700682 case 1:
683 return ((u8 *)dev->keycode)[index];
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400684
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700685 case 2:
686 return ((u16 *)dev->keycode)[index];
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400687
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700688 default:
689 return ((u32 *)dev->keycode)[index];
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400690 }
691}
692
693static int input_default_getkeycode(struct input_dev *dev,
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700694 struct input_keymap_entry *ke)
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400695{
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700696 unsigned int index;
697 int error;
698
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400699 if (!dev->keycodesize)
700 return -EINVAL;
701
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700702 if (ke->flags & INPUT_KEYMAP_BY_INDEX)
703 index = ke->index;
704 else {
705 error = input_scancode_to_scalar(ke, &index);
706 if (error)
707 return error;
708 }
709
710 if (index >= dev->keycodemax)
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400711 return -EINVAL;
712
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700713 ke->keycode = input_fetch_keycode(dev, index);
714 ke->index = index;
715 ke->len = sizeof(index);
716 memcpy(ke->scancode, &index, sizeof(index));
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400717
718 return 0;
719}
720
721static int input_default_setkeycode(struct input_dev *dev,
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700722 const struct input_keymap_entry *ke,
723 unsigned int *old_keycode)
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400724{
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700725 unsigned int index;
726 int error;
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400727 int i;
728
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400729 if (!dev->keycodesize)
730 return -EINVAL;
731
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700732 if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
733 index = ke->index;
734 } else {
735 error = input_scancode_to_scalar(ke, &index);
736 if (error)
737 return error;
738 }
739
740 if (index >= dev->keycodemax)
741 return -EINVAL;
742
Mattia Dongilide391d12010-11-18 09:06:43 -0800743 if (dev->keycodesize < sizeof(ke->keycode) &&
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700744 (ke->keycode >> (dev->keycodesize * 8)))
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400745 return -EINVAL;
746
747 switch (dev->keycodesize) {
748 case 1: {
749 u8 *k = (u8 *)dev->keycode;
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700750 *old_keycode = k[index];
751 k[index] = ke->keycode;
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400752 break;
753 }
754 case 2: {
755 u16 *k = (u16 *)dev->keycode;
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700756 *old_keycode = k[index];
757 k[index] = ke->keycode;
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400758 break;
759 }
760 default: {
761 u32 *k = (u32 *)dev->keycode;
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700762 *old_keycode = k[index];
763 k[index] = ke->keycode;
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400764 break;
765 }
766 }
767
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700768 __clear_bit(*old_keycode, dev->keybit);
769 __set_bit(ke->keycode, dev->keybit);
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400770
771 for (i = 0; i < dev->keycodemax; i++) {
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700772 if (input_fetch_keycode(dev, i) == *old_keycode) {
773 __set_bit(*old_keycode, dev->keybit);
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400774 break; /* Setting the bit twice is useless, so break */
775 }
776 }
777
778 return 0;
779}
780
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400781/**
782 * input_get_keycode - retrieve keycode currently mapped to a given scancode
783 * @dev: input device which keymap is being queried
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700784 * @ke: keymap entry
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400785 *
786 * This function should be called by anyone interested in retrieving current
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700787 * keymap. Presently evdev handlers use it.
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400788 */
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700789int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke)
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400790{
Dmitry Torokhov2e2e3b92010-03-21 22:56:15 -0700791 unsigned long flags;
792 int retval;
793
794 spin_lock_irqsave(&dev->event_lock, flags);
Dmitry Torokhov2e2e3b92010-03-21 22:56:15 -0700795
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700796 if (dev->getkeycode) {
797 /*
798 * Support for legacy drivers, that don't implement the new
799 * ioctls
800 */
801 u32 scancode = ke->index;
802
803 memcpy(ke->scancode, &scancode, sizeof(scancode));
804 ke->len = sizeof(scancode);
805 retval = dev->getkeycode(dev, scancode, &ke->keycode);
806 } else {
807 retval = dev->getkeycode_new(dev, ke);
808 }
809
810 spin_unlock_irqrestore(&dev->event_lock, flags);
Dmitry Torokhov2e2e3b92010-03-21 22:56:15 -0700811 return retval;
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400812}
813EXPORT_SYMBOL(input_get_keycode);
814
815/**
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700816 * input_set_keycode - attribute a keycode to a given scancode
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400817 * @dev: input device which keymap is being updated
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700818 * @ke: new keymap entry
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400819 *
820 * This function should be called by anyone needing to update current
821 * keymap. Presently keyboard and evdev handlers use it.
822 */
Dmitry Torokhov58b93992010-03-08 22:37:10 -0800823int input_set_keycode(struct input_dev *dev,
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700824 const struct input_keymap_entry *ke)
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400825{
826 unsigned long flags;
Dmitry Torokhovfd6cf3d2010-07-14 00:25:21 -0700827 unsigned int old_keycode;
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400828 int retval;
829
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700830 if (ke->keycode > KEY_MAX)
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400831 return -EINVAL;
832
833 spin_lock_irqsave(&dev->event_lock, flags);
834
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700835 if (dev->setkeycode) {
836 /*
837 * Support for legacy drivers, that don't implement the new
838 * ioctls
839 */
840 unsigned int scancode;
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400841
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -0700842 retval = input_scancode_to_scalar(ke, &scancode);
843 if (retval)
844 goto out;
845
846 /*
847 * We need to know the old scancode, in order to generate a
848 * keyup effect, if the set operation happens successfully
849 */
850 if (!dev->getkeycode) {
851 retval = -EINVAL;
852 goto out;
853 }
854
855 retval = dev->getkeycode(dev, scancode, &old_keycode);
856 if (retval)
857 goto out;
858
859 retval = dev->setkeycode(dev, scancode, ke->keycode);
860 } else {
861 retval = dev->setkeycode_new(dev, ke, &old_keycode);
862 }
863
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400864 if (retval)
865 goto out;
866
Dmitry Torokhov4f93df42010-01-05 17:56:00 -0800867 /* Make sure KEY_RESERVED did not get enabled. */
868 __clear_bit(KEY_RESERVED, dev->keybit);
869
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400870 /*
871 * Simulate keyup event if keycode is not present
872 * in the keymap anymore
873 */
874 if (test_bit(EV_KEY, dev->evbit) &&
875 !is_event_supported(old_keycode, dev->keybit, KEY_MAX) &&
876 __test_and_clear_bit(old_keycode, dev->key)) {
877
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800878 input_pass_event(dev, EV_KEY, old_keycode, 0);
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400879 if (dev->sync)
Dmitry Torokhov9ae43452011-02-02 23:04:27 -0800880 input_pass_event(dev, EV_SYN, SYN_REPORT, 1);
Dmitry Torokhovf4f37c82007-11-04 00:41:12 -0400881 }
882
883 out:
884 spin_unlock_irqrestore(&dev->event_lock, flags);
885
886 return retval;
887}
888EXPORT_SYMBOL(input_set_keycode);
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -0400889
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890#define MATCH_BIT(bit, max) \
Jiri Slaby7b19ada2007-10-18 23:40:32 -0700891 for (i = 0; i < BITS_TO_LONGS(max); i++) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 if ((id->bit[i] & dev->bit[i]) != id->bit[i]) \
893 break; \
Jiri Slaby7b19ada2007-10-18 23:40:32 -0700894 if (i != BITS_TO_LONGS(max)) \
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 continue;
896
Dmitry Torokhov0b7024ac2010-02-02 21:08:26 -0800897static const struct input_device_id *input_match_device(struct input_handler *handler,
Dmitry Torokhov66e66112006-09-14 01:31:59 -0400898 struct input_dev *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899{
Dmitry Torokhov0b7024ac2010-02-02 21:08:26 -0800900 const struct input_device_id *id;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 int i;
902
Dmitry Torokhov0b7024ac2010-02-02 21:08:26 -0800903 for (id = handler->id_table; id->flags || id->driver_info; id++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700904
905 if (id->flags & INPUT_DEVICE_ID_MATCH_BUS)
Dmitry Torokhovddc5d342006-04-26 00:14:19 -0400906 if (id->bustype != dev->id.bustype)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700907 continue;
908
909 if (id->flags & INPUT_DEVICE_ID_MATCH_VENDOR)
Dmitry Torokhovddc5d342006-04-26 00:14:19 -0400910 if (id->vendor != dev->id.vendor)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 continue;
912
913 if (id->flags & INPUT_DEVICE_ID_MATCH_PRODUCT)
Dmitry Torokhovddc5d342006-04-26 00:14:19 -0400914 if (id->product != dev->id.product)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915 continue;
916
917 if (id->flags & INPUT_DEVICE_ID_MATCH_VERSION)
Dmitry Torokhovddc5d342006-04-26 00:14:19 -0400918 if (id->version != dev->id.version)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 continue;
920
921 MATCH_BIT(evbit, EV_MAX);
922 MATCH_BIT(keybit, KEY_MAX);
923 MATCH_BIT(relbit, REL_MAX);
924 MATCH_BIT(absbit, ABS_MAX);
925 MATCH_BIT(mscbit, MSC_MAX);
926 MATCH_BIT(ledbit, LED_MAX);
927 MATCH_BIT(sndbit, SND_MAX);
928 MATCH_BIT(ffbit, FF_MAX);
Dmitry Torokhovff13f982005-09-24 02:02:29 -0500929 MATCH_BIT(swbit, SW_MAX);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930
Dmitry Torokhov0b7024ac2010-02-02 21:08:26 -0800931 if (!handler->match || handler->match(handler, dev))
932 return id;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933 }
934
935 return NULL;
936}
937
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -0400938static int input_attach_handler(struct input_dev *dev, struct input_handler *handler)
939{
940 const struct input_device_id *id;
941 int error;
942
Dmitry Torokhov0b7024ac2010-02-02 21:08:26 -0800943 id = input_match_device(handler, dev);
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -0400944 if (!id)
945 return -ENODEV;
946
947 error = handler->connect(handler, dev, id);
948 if (error && error != -ENODEV)
Joe Perchesda0c4902010-11-29 23:33:07 -0800949 pr_err("failed to attach handler %s to device %s, error: %d\n",
950 handler->name, kobject_name(&dev->dev.kobj), error);
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -0400951
952 return error;
953}
954
Dmitry Torokhov15e184a2010-01-11 00:05:43 -0800955#ifdef CONFIG_COMPAT
956
957static int input_bits_to_string(char *buf, int buf_size,
958 unsigned long bits, bool skip_empty)
959{
960 int len = 0;
961
962 if (INPUT_COMPAT_TEST) {
963 u32 dword = bits >> 32;
964 if (dword || !skip_empty)
965 len += snprintf(buf, buf_size, "%x ", dword);
966
967 dword = bits & 0xffffffffUL;
968 if (dword || !skip_empty || len)
969 len += snprintf(buf + len, max(buf_size - len, 0),
970 "%x", dword);
971 } else {
972 if (bits || !skip_empty)
973 len += snprintf(buf, buf_size, "%lx", bits);
974 }
975
976 return len;
977}
978
979#else /* !CONFIG_COMPAT */
980
981static int input_bits_to_string(char *buf, int buf_size,
982 unsigned long bits, bool skip_empty)
983{
984 return bits || !skip_empty ?
985 snprintf(buf, buf_size, "%lx", bits) : 0;
986}
987
988#endif
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -0400989
Linus Torvalds1da177e2005-04-16 15:20:36 -0700990#ifdef CONFIG_PROC_FS
Dmitry Torokhovf96b4342005-06-30 00:50:29 -0500991
992static struct proc_dir_entry *proc_bus_input_dir;
993static DECLARE_WAIT_QUEUE_HEAD(input_devices_poll_wait);
994static int input_devices_state;
995
996static inline void input_wakeup_procfs_readers(void)
997{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 input_devices_state++;
999 wake_up(&input_devices_poll_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001000}
1001
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001002static unsigned int input_proc_devices_poll(struct file *file, poll_table *wait)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003{
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001004 poll_wait(file, &input_devices_poll_wait, wait);
Dmitry Torokhovfa886612009-03-04 00:52:20 -08001005 if (file->f_version != input_devices_state) {
1006 file->f_version = input_devices_state;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001007 return POLLIN | POLLRDNORM;
Dmitry Torokhovfa886612009-03-04 00:52:20 -08001008 }
Dmitry Torokhov1e0afb22006-06-26 01:48:47 -04001009
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001010 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011}
1012
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001013union input_seq_state {
1014 struct {
1015 unsigned short pos;
1016 bool mutex_acquired;
1017 };
1018 void *p;
1019};
1020
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001021static void *input_devices_seq_start(struct seq_file *seq, loff_t *pos)
1022{
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001023 union input_seq_state *state = (union input_seq_state *)&seq->private;
1024 int error;
1025
1026 /* We need to fit into seq->private pointer */
1027 BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private));
1028
1029 error = mutex_lock_interruptible(&input_mutex);
1030 if (error) {
1031 state->mutex_acquired = false;
1032 return ERR_PTR(error);
1033 }
1034
1035 state->mutex_acquired = true;
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001036
Pavel Emelianovad5d9722007-07-18 00:38:32 -04001037 return seq_list_start(&input_dev_list, *pos);
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001038}
1039
1040static void *input_devices_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1041{
Pavel Emelianovad5d9722007-07-18 00:38:32 -04001042 return seq_list_next(v, &input_dev_list, pos);
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001043}
1044
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001045static void input_seq_stop(struct seq_file *seq, void *v)
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001046{
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001047 union input_seq_state *state = (union input_seq_state *)&seq->private;
1048
1049 if (state->mutex_acquired)
1050 mutex_unlock(&input_mutex);
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001051}
1052
1053static void input_seq_print_bitmap(struct seq_file *seq, const char *name,
1054 unsigned long *bitmap, int max)
1055{
1056 int i;
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001057 bool skip_empty = true;
1058 char buf[18];
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001059
1060 seq_printf(seq, "B: %s=", name);
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001061
1062 for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) {
1063 if (input_bits_to_string(buf, sizeof(buf),
1064 bitmap[i], skip_empty)) {
1065 skip_empty = false;
1066 seq_printf(seq, "%s%s", buf, i > 0 ? " " : "");
1067 }
1068 }
1069
1070 /*
1071 * If no output was produced print a single 0.
1072 */
1073 if (skip_empty)
1074 seq_puts(seq, "0");
1075
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001076 seq_putc(seq, '\n');
1077}
1078
1079static int input_devices_seq_show(struct seq_file *seq, void *v)
1080{
1081 struct input_dev *dev = container_of(v, struct input_dev, node);
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001082 const char *path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 struct input_handle *handle;
1084
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001085 seq_printf(seq, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n",
1086 dev->id.bustype, dev->id.vendor, dev->id.product, dev->id.version);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001088 seq_printf(seq, "N: Name=\"%s\"\n", dev->name ? dev->name : "");
1089 seq_printf(seq, "P: Phys=%s\n", dev->phys ? dev->phys : "");
1090 seq_printf(seq, "S: Sysfs=%s\n", path ? path : "");
Dmitry Torokhov15e03ae2007-03-07 23:20:17 -05001091 seq_printf(seq, "U: Uniq=%s\n", dev->uniq ? dev->uniq : "");
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001092 seq_printf(seq, "H: Handlers=");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001094 list_for_each_entry(handle, &dev->h_list, d_node)
1095 seq_printf(seq, "%s ", handle->name);
1096 seq_putc(seq, '\n');
Dmitry Torokhov051b2fe2005-09-15 02:01:54 -05001097
Henrik Rydberg85b77202010-12-18 20:51:13 +01001098 input_seq_print_bitmap(seq, "PROP", dev->propbit, INPUT_PROP_MAX);
1099
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001100 input_seq_print_bitmap(seq, "EV", dev->evbit, EV_MAX);
1101 if (test_bit(EV_KEY, dev->evbit))
1102 input_seq_print_bitmap(seq, "KEY", dev->keybit, KEY_MAX);
1103 if (test_bit(EV_REL, dev->evbit))
1104 input_seq_print_bitmap(seq, "REL", dev->relbit, REL_MAX);
1105 if (test_bit(EV_ABS, dev->evbit))
1106 input_seq_print_bitmap(seq, "ABS", dev->absbit, ABS_MAX);
1107 if (test_bit(EV_MSC, dev->evbit))
1108 input_seq_print_bitmap(seq, "MSC", dev->mscbit, MSC_MAX);
1109 if (test_bit(EV_LED, dev->evbit))
1110 input_seq_print_bitmap(seq, "LED", dev->ledbit, LED_MAX);
1111 if (test_bit(EV_SND, dev->evbit))
1112 input_seq_print_bitmap(seq, "SND", dev->sndbit, SND_MAX);
1113 if (test_bit(EV_FF, dev->evbit))
1114 input_seq_print_bitmap(seq, "FF", dev->ffbit, FF_MAX);
1115 if (test_bit(EV_SW, dev->evbit))
1116 input_seq_print_bitmap(seq, "SW", dev->swbit, SW_MAX);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001117
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001118 seq_putc(seq, '\n');
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001120 kfree(path);
1121 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122}
1123
Jan Engelhardtcec69c32008-01-31 00:43:32 -05001124static const struct seq_operations input_devices_seq_ops = {
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001125 .start = input_devices_seq_start,
1126 .next = input_devices_seq_next,
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001127 .stop = input_seq_stop,
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001128 .show = input_devices_seq_show,
1129};
1130
1131static int input_proc_devices_open(struct inode *inode, struct file *file)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132{
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001133 return seq_open(file, &input_devices_seq_ops);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134}
1135
Arjan van de Ven2b8693c2007-02-12 00:55:32 -08001136static const struct file_operations input_devices_fileops = {
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001137 .owner = THIS_MODULE,
1138 .open = input_proc_devices_open,
1139 .poll = input_proc_devices_poll,
1140 .read = seq_read,
1141 .llseek = seq_lseek,
1142 .release = seq_release,
1143};
1144
1145static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos)
1146{
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001147 union input_seq_state *state = (union input_seq_state *)&seq->private;
1148 int error;
Dmitry Torokhov80064792007-08-30 00:22:11 -04001149
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001150 /* We need to fit into seq->private pointer */
1151 BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private));
1152
1153 error = mutex_lock_interruptible(&input_mutex);
1154 if (error) {
1155 state->mutex_acquired = false;
1156 return ERR_PTR(error);
1157 }
1158
1159 state->mutex_acquired = true;
1160 state->pos = *pos;
1161
Pavel Emelianovad5d9722007-07-18 00:38:32 -04001162 return seq_list_start(&input_handler_list, *pos);
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001163}
1164
1165static void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1166{
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001167 union input_seq_state *state = (union input_seq_state *)&seq->private;
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001168
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001169 state->pos = *pos + 1;
1170 return seq_list_next(v, &input_handler_list, pos);
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001171}
1172
1173static int input_handlers_seq_show(struct seq_file *seq, void *v)
1174{
1175 struct input_handler *handler = container_of(v, struct input_handler, node);
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001176 union input_seq_state *state = (union input_seq_state *)&seq->private;
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001177
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001178 seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name);
Dmitry Torokhovef7995f2010-01-29 23:59:12 -08001179 if (handler->filter)
1180 seq_puts(seq, " (filter)");
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001181 if (handler->fops)
1182 seq_printf(seq, " Minor=%d", handler->minor);
1183 seq_putc(seq, '\n');
1184
1185 return 0;
1186}
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001187
Jan Engelhardtcec69c32008-01-31 00:43:32 -05001188static const struct seq_operations input_handlers_seq_ops = {
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001189 .start = input_handlers_seq_start,
1190 .next = input_handlers_seq_next,
Dmitry Torokhov1572ca22009-10-13 23:37:30 -07001191 .stop = input_seq_stop,
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001192 .show = input_handlers_seq_show,
1193};
1194
1195static int input_proc_handlers_open(struct inode *inode, struct file *file)
1196{
1197 return seq_open(file, &input_handlers_seq_ops);
1198}
1199
Arjan van de Ven2b8693c2007-02-12 00:55:32 -08001200static const struct file_operations input_handlers_fileops = {
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001201 .owner = THIS_MODULE,
1202 .open = input_proc_handlers_open,
1203 .read = seq_read,
1204 .llseek = seq_lseek,
1205 .release = seq_release,
1206};
Luke Kosewskie334016fc2005-06-01 02:39:28 -05001207
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208static int __init input_proc_init(void)
1209{
1210 struct proc_dir_entry *entry;
1211
Alexey Dobriyan9c370662008-04-29 01:01:41 -07001212 proc_bus_input_dir = proc_mkdir("bus/input", NULL);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001213 if (!proc_bus_input_dir)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214 return -ENOMEM;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001215
Denis V. Lunevc7705f32008-04-29 01:02:35 -07001216 entry = proc_create("devices", 0, proc_bus_input_dir,
1217 &input_devices_fileops);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001218 if (!entry)
1219 goto fail1;
1220
Denis V. Lunevc7705f32008-04-29 01:02:35 -07001221 entry = proc_create("handlers", 0, proc_bus_input_dir,
1222 &input_handlers_fileops);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001223 if (!entry)
1224 goto fail2;
1225
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 return 0;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001227
1228 fail2: remove_proc_entry("devices", proc_bus_input_dir);
Alexey Dobriyan9c370662008-04-29 01:01:41 -07001229 fail1: remove_proc_entry("bus/input", NULL);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001230 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001231}
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001232
Andrew Mortonbeffbdc2005-07-01 23:54:30 -05001233static void input_proc_exit(void)
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001234{
1235 remove_proc_entry("devices", proc_bus_input_dir);
1236 remove_proc_entry("handlers", proc_bus_input_dir);
Alexey Dobriyan9c370662008-04-29 01:01:41 -07001237 remove_proc_entry("bus/input", NULL);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001238}
1239
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240#else /* !CONFIG_PROC_FS */
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001241static inline void input_wakeup_procfs_readers(void) { }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001242static inline int input_proc_init(void) { return 0; }
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001243static inline void input_proc_exit(void) { }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244#endif
1245
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001246#define INPUT_DEV_STRING_ATTR_SHOW(name) \
1247static ssize_t input_dev_show_##name(struct device *dev, \
1248 struct device_attribute *attr, \
1249 char *buf) \
1250{ \
1251 struct input_dev *input_dev = to_input_dev(dev); \
1252 \
1253 return scnprintf(buf, PAGE_SIZE, "%s\n", \
1254 input_dev->name ? input_dev->name : ""); \
1255} \
1256static DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL)
Dmitry Torokhov5c1e9a62005-09-15 02:01:55 -05001257
1258INPUT_DEV_STRING_ATTR_SHOW(name);
1259INPUT_DEV_STRING_ATTR_SHOW(phys);
1260INPUT_DEV_STRING_ATTR_SHOW(uniq);
1261
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001262static int input_print_modalias_bits(char *buf, int size,
1263 char name, unsigned long *bm,
1264 unsigned int min_bit, unsigned int max_bit)
Rusty Russell1d8f4302005-12-07 21:40:34 +01001265{
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001266 int len = 0, i;
Rusty Russell1d8f4302005-12-07 21:40:34 +01001267
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001268 len += snprintf(buf, max(size, 0), "%c", name);
1269 for (i = min_bit; i < max_bit; i++)
Jiri Slaby7b19ada2007-10-18 23:40:32 -07001270 if (bm[BIT_WORD(i)] & BIT_MASK(i))
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001271 len += snprintf(buf + len, max(size - len, 0), "%X,", i);
Kay Sieversbd37e5a2006-01-05 13:19:55 +01001272 return len;
1273}
1274
Dmitry Torokhov2db66872006-04-02 00:09:26 -05001275static int input_print_modalias(char *buf, int size, struct input_dev *id,
1276 int add_cr)
Kay Sieversbd37e5a2006-01-05 13:19:55 +01001277{
1278 int len;
1279
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001280 len = snprintf(buf, max(size, 0),
1281 "input:b%04Xv%04Xp%04Xe%04X-",
1282 id->id.bustype, id->id.vendor,
1283 id->id.product, id->id.version);
Kay Sieversbd37e5a2006-01-05 13:19:55 +01001284
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001285 len += input_print_modalias_bits(buf + len, size - len,
1286 'e', id->evbit, 0, EV_MAX);
1287 len += input_print_modalias_bits(buf + len, size - len,
1288 'k', id->keybit, KEY_MIN_INTERESTING, KEY_MAX);
1289 len += input_print_modalias_bits(buf + len, size - len,
1290 'r', id->relbit, 0, REL_MAX);
1291 len += input_print_modalias_bits(buf + len, size - len,
1292 'a', id->absbit, 0, ABS_MAX);
1293 len += input_print_modalias_bits(buf + len, size - len,
1294 'm', id->mscbit, 0, MSC_MAX);
1295 len += input_print_modalias_bits(buf + len, size - len,
1296 'l', id->ledbit, 0, LED_MAX);
1297 len += input_print_modalias_bits(buf + len, size - len,
1298 's', id->sndbit, 0, SND_MAX);
1299 len += input_print_modalias_bits(buf + len, size - len,
1300 'f', id->ffbit, 0, FF_MAX);
1301 len += input_print_modalias_bits(buf + len, size - len,
1302 'w', id->swbit, 0, SW_MAX);
Dmitry Torokhov2db66872006-04-02 00:09:26 -05001303
1304 if (add_cr)
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001305 len += snprintf(buf + len, max(size - len, 0), "\n");
Dmitry Torokhov2db66872006-04-02 00:09:26 -05001306
Rusty Russell1d8f4302005-12-07 21:40:34 +01001307 return len;
1308}
1309
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001310static ssize_t input_dev_show_modalias(struct device *dev,
1311 struct device_attribute *attr,
1312 char *buf)
Rusty Russell1d8f4302005-12-07 21:40:34 +01001313{
1314 struct input_dev *id = to_input_dev(dev);
Kay Sieversbd37e5a2006-01-05 13:19:55 +01001315 ssize_t len;
Rusty Russell1d8f4302005-12-07 21:40:34 +01001316
Dmitry Torokhov2db66872006-04-02 00:09:26 -05001317 len = input_print_modalias(buf, PAGE_SIZE, id, 1);
1318
Richard Purdie8a3cf452006-06-26 01:48:21 -04001319 return min_t(int, len, PAGE_SIZE);
Rusty Russell1d8f4302005-12-07 21:40:34 +01001320}
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001321static DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL);
Rusty Russell1d8f4302005-12-07 21:40:34 +01001322
Henrik Rydberg85b77202010-12-18 20:51:13 +01001323static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap,
1324 int max, int add_cr);
1325
1326static ssize_t input_dev_show_properties(struct device *dev,
1327 struct device_attribute *attr,
1328 char *buf)
1329{
1330 struct input_dev *input_dev = to_input_dev(dev);
1331 int len = input_print_bitmap(buf, PAGE_SIZE, input_dev->propbit,
1332 INPUT_PROP_MAX, true);
1333 return min_t(int, len, PAGE_SIZE);
1334}
1335static DEVICE_ATTR(properties, S_IRUGO, input_dev_show_properties, NULL);
1336
Greg Kroah-Hartman629b77a2005-10-27 22:25:43 -07001337static struct attribute *input_dev_attrs[] = {
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001338 &dev_attr_name.attr,
1339 &dev_attr_phys.attr,
1340 &dev_attr_uniq.attr,
1341 &dev_attr_modalias.attr,
Henrik Rydberg85b77202010-12-18 20:51:13 +01001342 &dev_attr_properties.attr,
Greg Kroah-Hartman629b77a2005-10-27 22:25:43 -07001343 NULL
1344};
1345
Dmitry Torokhovbd0ef232005-11-20 00:56:31 -05001346static struct attribute_group input_dev_attr_group = {
Greg Kroah-Hartman629b77a2005-10-27 22:25:43 -07001347 .attrs = input_dev_attrs,
Dmitry Torokhov5c1e9a62005-09-15 02:01:55 -05001348};
1349
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001350#define INPUT_DEV_ID_ATTR(name) \
1351static ssize_t input_dev_show_id_##name(struct device *dev, \
1352 struct device_attribute *attr, \
1353 char *buf) \
1354{ \
1355 struct input_dev *input_dev = to_input_dev(dev); \
1356 return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name); \
1357} \
1358static DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL)
Dmitry Torokhov5c1e9a62005-09-15 02:01:55 -05001359
1360INPUT_DEV_ID_ATTR(bustype);
1361INPUT_DEV_ID_ATTR(vendor);
1362INPUT_DEV_ID_ATTR(product);
1363INPUT_DEV_ID_ATTR(version);
1364
1365static struct attribute *input_dev_id_attrs[] = {
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001366 &dev_attr_bustype.attr,
1367 &dev_attr_vendor.attr,
1368 &dev_attr_product.attr,
1369 &dev_attr_version.attr,
Dmitry Torokhov5c1e9a62005-09-15 02:01:55 -05001370 NULL
1371};
1372
1373static struct attribute_group input_dev_id_attr_group = {
1374 .name = "id",
1375 .attrs = input_dev_id_attrs,
1376};
1377
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001378static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap,
1379 int max, int add_cr)
1380{
1381 int i;
1382 int len = 0;
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001383 bool skip_empty = true;
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001384
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001385 for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) {
1386 len += input_bits_to_string(buf + len, max(buf_size - len, 0),
1387 bitmap[i], skip_empty);
1388 if (len) {
1389 skip_empty = false;
1390 if (i > 0)
1391 len += snprintf(buf + len, max(buf_size - len, 0), " ");
1392 }
1393 }
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001394
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001395 /*
1396 * If no output was produced print a single 0.
1397 */
1398 if (len == 0)
1399 len = snprintf(buf, buf_size, "%d", 0);
Dmitry Torokhov969b21c2006-04-02 00:09:34 -05001400
1401 if (add_cr)
1402 len += snprintf(buf + len, max(buf_size - len, 0), "\n");
1403
1404 return len;
1405}
1406
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001407#define INPUT_DEV_CAP_ATTR(ev, bm) \
1408static ssize_t input_dev_show_cap_##bm(struct device *dev, \
1409 struct device_attribute *attr, \
1410 char *buf) \
1411{ \
1412 struct input_dev *input_dev = to_input_dev(dev); \
1413 int len = input_print_bitmap(buf, PAGE_SIZE, \
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001414 input_dev->bm##bit, ev##_MAX, \
1415 true); \
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001416 return min_t(int, len, PAGE_SIZE); \
1417} \
1418static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL)
Dmitry Torokhov5c1e9a62005-09-15 02:01:55 -05001419
1420INPUT_DEV_CAP_ATTR(EV, ev);
1421INPUT_DEV_CAP_ATTR(KEY, key);
1422INPUT_DEV_CAP_ATTR(REL, rel);
1423INPUT_DEV_CAP_ATTR(ABS, abs);
1424INPUT_DEV_CAP_ATTR(MSC, msc);
1425INPUT_DEV_CAP_ATTR(LED, led);
1426INPUT_DEV_CAP_ATTR(SND, snd);
1427INPUT_DEV_CAP_ATTR(FF, ff);
1428INPUT_DEV_CAP_ATTR(SW, sw);
1429
1430static struct attribute *input_dev_caps_attrs[] = {
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001431 &dev_attr_ev.attr,
1432 &dev_attr_key.attr,
1433 &dev_attr_rel.attr,
1434 &dev_attr_abs.attr,
1435 &dev_attr_msc.attr,
1436 &dev_attr_led.attr,
1437 &dev_attr_snd.attr,
1438 &dev_attr_ff.attr,
1439 &dev_attr_sw.attr,
Dmitry Torokhov5c1e9a62005-09-15 02:01:55 -05001440 NULL
1441};
1442
1443static struct attribute_group input_dev_caps_attr_group = {
1444 .name = "capabilities",
1445 .attrs = input_dev_caps_attrs,
1446};
1447
David Brownella4dbd672009-06-24 10:06:31 -07001448static const struct attribute_group *input_dev_attr_groups[] = {
Dmitry Torokhovcb9def42007-03-07 23:20:26 -05001449 &input_dev_attr_group,
1450 &input_dev_id_attr_group,
1451 &input_dev_caps_attr_group,
1452 NULL
1453};
1454
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001455static void input_dev_release(struct device *device)
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001456{
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001457 struct input_dev *dev = to_input_dev(device);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001458
Anssi Hannula509ca1a2006-07-19 01:40:22 -04001459 input_ff_destroy(dev);
Henrik Rydberg40d007e2010-07-15 23:10:10 -07001460 input_mt_destroy_slots(dev);
Daniel Mackd31b2862010-08-02 20:18:21 -07001461 kfree(dev->absinfo);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001462 kfree(dev);
Anssi Hannula509ca1a2006-07-19 01:40:22 -04001463
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001464 module_put(THIS_MODULE);
1465}
1466
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001467/*
Kay Sievers312c0042005-11-16 09:00:00 +01001468 * Input uevent interface - loading event handlers based on
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001469 * device bitfields.
1470 */
Kay Sievers7eff2e72007-08-14 15:15:12 +02001471static int input_add_uevent_bm_var(struct kobj_uevent_env *env,
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001472 const char *name, unsigned long *bitmap, int max)
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001473{
Kay Sievers7eff2e72007-08-14 15:15:12 +02001474 int len;
1475
Henrik Rydbergfcd30272010-12-18 20:28:26 +01001476 if (add_uevent_var(env, "%s", name))
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001477 return -ENOMEM;
1478
Kay Sievers7eff2e72007-08-14 15:15:12 +02001479 len = input_print_bitmap(&env->buf[env->buflen - 1],
1480 sizeof(env->buf) - env->buflen,
Dmitry Torokhov15e184a2010-01-11 00:05:43 -08001481 bitmap, max, false);
Kay Sievers7eff2e72007-08-14 15:15:12 +02001482 if (len >= (sizeof(env->buf) - env->buflen))
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001483 return -ENOMEM;
1484
Kay Sievers7eff2e72007-08-14 15:15:12 +02001485 env->buflen += len;
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001486 return 0;
1487}
1488
Kay Sievers7eff2e72007-08-14 15:15:12 +02001489static int input_add_uevent_modalias_var(struct kobj_uevent_env *env,
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001490 struct input_dev *dev)
1491{
Kay Sievers7eff2e72007-08-14 15:15:12 +02001492 int len;
1493
1494 if (add_uevent_var(env, "MODALIAS="))
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001495 return -ENOMEM;
1496
Kay Sievers7eff2e72007-08-14 15:15:12 +02001497 len = input_print_modalias(&env->buf[env->buflen - 1],
1498 sizeof(env->buf) - env->buflen,
1499 dev, 0);
1500 if (len >= (sizeof(env->buf) - env->buflen))
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001501 return -ENOMEM;
1502
Kay Sievers7eff2e72007-08-14 15:15:12 +02001503 env->buflen += len;
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001504 return 0;
1505}
1506
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001507#define INPUT_ADD_HOTPLUG_VAR(fmt, val...) \
1508 do { \
Kay Sievers7eff2e72007-08-14 15:15:12 +02001509 int err = add_uevent_var(env, fmt, val); \
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001510 if (err) \
1511 return err; \
1512 } while (0)
1513
1514#define INPUT_ADD_HOTPLUG_BM_VAR(name, bm, max) \
1515 do { \
Kay Sievers7eff2e72007-08-14 15:15:12 +02001516 int err = input_add_uevent_bm_var(env, name, bm, max); \
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001517 if (err) \
1518 return err; \
1519 } while (0)
1520
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001521#define INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev) \
1522 do { \
Kay Sievers7eff2e72007-08-14 15:15:12 +02001523 int err = input_add_uevent_modalias_var(env, dev); \
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001524 if (err) \
1525 return err; \
1526 } while (0)
1527
Kay Sievers7eff2e72007-08-14 15:15:12 +02001528static int input_dev_uevent(struct device *device, struct kobj_uevent_env *env)
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001529{
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001530 struct input_dev *dev = to_input_dev(device);
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001531
1532 INPUT_ADD_HOTPLUG_VAR("PRODUCT=%x/%x/%x/%x",
1533 dev->id.bustype, dev->id.vendor,
1534 dev->id.product, dev->id.version);
1535 if (dev->name)
1536 INPUT_ADD_HOTPLUG_VAR("NAME=\"%s\"", dev->name);
1537 if (dev->phys)
1538 INPUT_ADD_HOTPLUG_VAR("PHYS=\"%s\"", dev->phys);
Dmitry Torokhov08de1f02005-11-08 21:34:29 -08001539 if (dev->uniq)
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001540 INPUT_ADD_HOTPLUG_VAR("UNIQ=\"%s\"", dev->uniq);
1541
Henrik Rydberg85b77202010-12-18 20:51:13 +01001542 INPUT_ADD_HOTPLUG_BM_VAR("PROP=", dev->propbit, INPUT_PROP_MAX);
1543
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001544 INPUT_ADD_HOTPLUG_BM_VAR("EV=", dev->evbit, EV_MAX);
1545 if (test_bit(EV_KEY, dev->evbit))
1546 INPUT_ADD_HOTPLUG_BM_VAR("KEY=", dev->keybit, KEY_MAX);
1547 if (test_bit(EV_REL, dev->evbit))
1548 INPUT_ADD_HOTPLUG_BM_VAR("REL=", dev->relbit, REL_MAX);
1549 if (test_bit(EV_ABS, dev->evbit))
1550 INPUT_ADD_HOTPLUG_BM_VAR("ABS=", dev->absbit, ABS_MAX);
1551 if (test_bit(EV_MSC, dev->evbit))
1552 INPUT_ADD_HOTPLUG_BM_VAR("MSC=", dev->mscbit, MSC_MAX);
1553 if (test_bit(EV_LED, dev->evbit))
1554 INPUT_ADD_HOTPLUG_BM_VAR("LED=", dev->ledbit, LED_MAX);
1555 if (test_bit(EV_SND, dev->evbit))
1556 INPUT_ADD_HOTPLUG_BM_VAR("SND=", dev->sndbit, SND_MAX);
1557 if (test_bit(EV_FF, dev->evbit))
1558 INPUT_ADD_HOTPLUG_BM_VAR("FF=", dev->ffbit, FF_MAX);
1559 if (test_bit(EV_SW, dev->evbit))
1560 INPUT_ADD_HOTPLUG_BM_VAR("SW=", dev->swbit, SW_MAX);
1561
Dmitry Torokhovac648a62006-04-02 00:09:51 -05001562 INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev);
Dmitry Torokhova7fadbe2005-09-15 02:01:57 -05001563
1564 return 0;
1565}
1566
Dmitry Torokhov3cc96352009-11-12 23:19:05 -08001567#define INPUT_DO_TOGGLE(dev, type, bits, on) \
1568 do { \
1569 int i; \
1570 bool active; \
1571 \
1572 if (!test_bit(EV_##type, dev->evbit)) \
1573 break; \
1574 \
1575 for (i = 0; i < type##_MAX; i++) { \
1576 if (!test_bit(i, dev->bits##bit)) \
1577 continue; \
1578 \
1579 active = test_bit(i, dev->bits); \
1580 if (!active && !on) \
1581 continue; \
1582 \
1583 dev->event(dev, EV_##type, i, on ? active : 0); \
1584 } \
Dmitry Torokhovffd0db92009-09-16 01:06:43 -07001585 } while (0)
1586
Dmitry Torokhovb50b5212010-11-03 11:02:31 -07001587static void input_dev_toggle(struct input_dev *dev, bool activate)
Dmitry Torokhovffd0db92009-09-16 01:06:43 -07001588{
1589 if (!dev->event)
1590 return;
1591
1592 INPUT_DO_TOGGLE(dev, LED, led, activate);
1593 INPUT_DO_TOGGLE(dev, SND, snd, activate);
1594
1595 if (activate && test_bit(EV_REP, dev->evbit)) {
1596 dev->event(dev, EV_REP, REP_PERIOD, dev->rep[REP_PERIOD]);
1597 dev->event(dev, EV_REP, REP_DELAY, dev->rep[REP_DELAY]);
1598 }
1599}
1600
Dmitry Torokhovb50b5212010-11-03 11:02:31 -07001601/**
1602 * input_reset_device() - reset/restore the state of input device
1603 * @dev: input device whose state needs to be reset
1604 *
1605 * This function tries to reset the state of an opened input device and
1606 * bring internal state and state if the hardware in sync with each other.
1607 * We mark all keys as released, restore LED state, repeat rate, etc.
1608 */
1609void input_reset_device(struct input_dev *dev)
1610{
1611 mutex_lock(&dev->mutex);
1612
1613 if (dev->users) {
1614 input_dev_toggle(dev, true);
1615
1616 /*
1617 * Keys that have been pressed at suspend time are unlikely
1618 * to be still pressed when we resume.
1619 */
1620 spin_lock_irq(&dev->event_lock);
1621 input_dev_release_keys(dev);
1622 spin_unlock_irq(&dev->event_lock);
1623 }
1624
1625 mutex_unlock(&dev->mutex);
1626}
1627EXPORT_SYMBOL(input_reset_device);
1628
1629#ifdef CONFIG_PM
Dmitry Torokhovffd0db92009-09-16 01:06:43 -07001630static int input_dev_suspend(struct device *dev)
1631{
1632 struct input_dev *input_dev = to_input_dev(dev);
1633
1634 mutex_lock(&input_dev->mutex);
Dmitry Torokhovb50b5212010-11-03 11:02:31 -07001635
1636 if (input_dev->users)
1637 input_dev_toggle(input_dev, false);
1638
Dmitry Torokhovffd0db92009-09-16 01:06:43 -07001639 mutex_unlock(&input_dev->mutex);
1640
1641 return 0;
1642}
1643
1644static int input_dev_resume(struct device *dev)
1645{
1646 struct input_dev *input_dev = to_input_dev(dev);
1647
Dmitry Torokhovb50b5212010-11-03 11:02:31 -07001648 input_reset_device(input_dev);
Dmitry Torokhovffd0db92009-09-16 01:06:43 -07001649
1650 return 0;
1651}
1652
1653static const struct dev_pm_ops input_dev_pm_ops = {
1654 .suspend = input_dev_suspend,
1655 .resume = input_dev_resume,
1656 .poweroff = input_dev_suspend,
1657 .restore = input_dev_resume,
1658};
1659#endif /* CONFIG_PM */
1660
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001661static struct device_type input_dev_type = {
1662 .groups = input_dev_attr_groups,
1663 .release = input_dev_release,
1664 .uevent = input_dev_uevent,
Dmitry Torokhovffd0db92009-09-16 01:06:43 -07001665#ifdef CONFIG_PM
1666 .pm = &input_dev_pm_ops,
1667#endif
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001668};
1669
Kay Sieverse454cea2009-09-18 23:01:12 +02001670static char *input_devnode(struct device *dev, mode_t *mode)
Kay Sieversaa5ed632009-04-30 15:23:42 +02001671{
1672 return kasprintf(GFP_KERNEL, "input/%s", dev_name(dev));
1673}
1674
Greg Kroah-Hartmanea9f2402005-10-27 22:25:43 -07001675struct class input_class = {
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001676 .name = "input",
Kay Sieverse454cea2009-09-18 23:01:12 +02001677 .devnode = input_devnode,
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001678};
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001679EXPORT_SYMBOL_GPL(input_class);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001680
Dmitry Torokhov14471902006-11-02 23:26:55 -05001681/**
1682 * input_allocate_device - allocate memory for new input device
1683 *
1684 * Returns prepared struct input_dev or NULL.
1685 *
1686 * NOTE: Use input_free_device() to free devices that have not been
1687 * registered; input_unregister_device() should be used for already
1688 * registered devices.
1689 */
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001690struct input_dev *input_allocate_device(void)
1691{
1692 struct input_dev *dev;
1693
1694 dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);
1695 if (dev) {
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001696 dev->dev.type = &input_dev_type;
1697 dev->dev.class = &input_class;
1698 device_initialize(&dev->dev);
Dmitry Torokhovf60d2b12006-06-26 01:48:36 -04001699 mutex_init(&dev->mutex);
Dmitry Torokhov80064792007-08-30 00:22:11 -04001700 spin_lock_init(&dev->event_lock);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001701 INIT_LIST_HEAD(&dev->h_list);
1702 INIT_LIST_HEAD(&dev->node);
Dmitry Torokhov655816e2006-09-14 01:32:14 -04001703
1704 __module_get(THIS_MODULE);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001705 }
1706
1707 return dev;
1708}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001709EXPORT_SYMBOL(input_allocate_device);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05001710
Dmitry Torokhov14471902006-11-02 23:26:55 -05001711/**
1712 * input_free_device - free memory occupied by input_dev structure
1713 * @dev: input device to free
1714 *
1715 * This function should only be used if input_register_device()
1716 * was not called yet or if it failed. Once device was registered
1717 * use input_unregister_device() and memory will be freed once last
Dmitry Torokhov80064792007-08-30 00:22:11 -04001718 * reference to the device is dropped.
Dmitry Torokhov14471902006-11-02 23:26:55 -05001719 *
1720 * Device should be allocated by input_allocate_device().
1721 *
1722 * NOTE: If there are references to the input device then memory
1723 * will not be freed until last reference is dropped.
1724 */
Dmitry Torokhovf60d2b12006-06-26 01:48:36 -04001725void input_free_device(struct input_dev *dev)
1726{
Dmitry Torokhov54f9e362007-03-16 00:57:25 -04001727 if (dev)
Dmitry Torokhovf60d2b12006-06-26 01:48:36 -04001728 input_put_device(dev);
Dmitry Torokhovf60d2b12006-06-26 01:48:36 -04001729}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001730EXPORT_SYMBOL(input_free_device);
Dmitry Torokhovf60d2b12006-06-26 01:48:36 -04001731
Dmitry Torokhov534565f2007-04-25 00:53:18 -04001732/**
1733 * input_set_capability - mark device as capable of a certain event
1734 * @dev: device that is capable of emitting or accepting event
1735 * @type: type of the event (EV_KEY, EV_REL, etc...)
1736 * @code: event code
1737 *
1738 * In addition to setting up corresponding bit in appropriate capability
1739 * bitmap the function also adjusts dev->evbit.
1740 */
1741void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)
1742{
1743 switch (type) {
1744 case EV_KEY:
1745 __set_bit(code, dev->keybit);
1746 break;
1747
1748 case EV_REL:
1749 __set_bit(code, dev->relbit);
1750 break;
1751
1752 case EV_ABS:
1753 __set_bit(code, dev->absbit);
1754 break;
1755
1756 case EV_MSC:
1757 __set_bit(code, dev->mscbit);
1758 break;
1759
1760 case EV_SW:
1761 __set_bit(code, dev->swbit);
1762 break;
1763
1764 case EV_LED:
1765 __set_bit(code, dev->ledbit);
1766 break;
1767
1768 case EV_SND:
1769 __set_bit(code, dev->sndbit);
1770 break;
1771
1772 case EV_FF:
1773 __set_bit(code, dev->ffbit);
1774 break;
1775
Dmitry Baryshkov22d1c392007-12-14 01:21:03 -05001776 case EV_PWR:
1777 /* do nothing */
1778 break;
1779
Dmitry Torokhov534565f2007-04-25 00:53:18 -04001780 default:
Joe Perchesda0c4902010-11-29 23:33:07 -08001781 pr_err("input_set_capability: unknown type %u (code %u)\n",
1782 type, code);
Dmitry Torokhov534565f2007-04-25 00:53:18 -04001783 dump_stack();
1784 return;
1785 }
1786
1787 __set_bit(type, dev->evbit);
1788}
1789EXPORT_SYMBOL(input_set_capability);
1790
Dmitry Torokhov92a3a582010-01-05 17:56:01 -08001791#define INPUT_CLEANSE_BITMASK(dev, type, bits) \
1792 do { \
1793 if (!test_bit(EV_##type, dev->evbit)) \
1794 memset(dev->bits##bit, 0, \
1795 sizeof(dev->bits##bit)); \
1796 } while (0)
1797
1798static void input_cleanse_bitmasks(struct input_dev *dev)
1799{
1800 INPUT_CLEANSE_BITMASK(dev, KEY, key);
1801 INPUT_CLEANSE_BITMASK(dev, REL, rel);
1802 INPUT_CLEANSE_BITMASK(dev, ABS, abs);
1803 INPUT_CLEANSE_BITMASK(dev, MSC, msc);
1804 INPUT_CLEANSE_BITMASK(dev, LED, led);
1805 INPUT_CLEANSE_BITMASK(dev, SND, snd);
1806 INPUT_CLEANSE_BITMASK(dev, FF, ff);
1807 INPUT_CLEANSE_BITMASK(dev, SW, sw);
1808}
1809
Dmitry Torokhov80064792007-08-30 00:22:11 -04001810/**
1811 * input_register_device - register device with input core
1812 * @dev: device to be registered
1813 *
1814 * This function registers device with input core. The device must be
1815 * allocated with input_allocate_device() and all it's capabilities
1816 * set up before registering.
1817 * If function fails the device must be freed with input_free_device().
1818 * Once device has been successfully registered it can be unregistered
1819 * with input_unregister_device(); input_free_device() should not be
1820 * called in this case.
1821 */
Dmitry Torokhov5f945482005-11-02 22:51:46 -05001822int input_register_device(struct input_dev *dev)
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001823{
Dmitry Torokhovbd0ef232005-11-20 00:56:31 -05001824 static atomic_t input_no = ATOMIC_INIT(0);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001825 struct input_handler *handler;
Dmitry Torokhovbd0ef232005-11-20 00:56:31 -05001826 const char *path;
1827 int error;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001828
Dmitry Torokhov4f93df42010-01-05 17:56:00 -08001829 /* Every input device generates EV_SYN/SYN_REPORT events. */
Dmitry Torokhov80064792007-08-30 00:22:11 -04001830 __set_bit(EV_SYN, dev->evbit);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001831
Dmitry Torokhov4f93df42010-01-05 17:56:00 -08001832 /* KEY_RESERVED is not supposed to be transmitted to userspace. */
1833 __clear_bit(KEY_RESERVED, dev->keybit);
1834
Dmitry Torokhov92a3a582010-01-05 17:56:01 -08001835 /* Make sure that bitmasks not mentioned in dev->evbit are clean. */
1836 input_cleanse_bitmasks(dev);
1837
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001838 /*
1839 * If delay and period are pre-set by the driver, then autorepeating
1840 * is handled by the driver itself and we don't do it in input.c.
1841 */
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001842 init_timer(&dev->timer);
1843 if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) {
1844 dev->timer.data = (long) dev;
1845 dev->timer.function = input_repeat_key;
1846 dev->rep[REP_DELAY] = 250;
1847 dev->rep[REP_PERIOD] = 33;
1848 }
1849
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -07001850 if (!dev->getkeycode && !dev->getkeycode_new)
1851 dev->getkeycode_new = input_default_getkeycode;
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -04001852
Mauro Carvalho Chehab8613e4c2010-09-09 21:54:22 -07001853 if (!dev->setkeycode && !dev->setkeycode_new)
1854 dev->setkeycode_new = input_default_setkeycode;
Marvin Raaijmakersc8e4c772007-03-14 22:50:42 -04001855
Kay Sieversa6c24902008-10-30 00:07:50 -04001856 dev_set_name(&dev->dev, "input%ld",
1857 (unsigned long) atomic_inc_return(&input_no) - 1);
Dmitry Torokhovbd0ef232005-11-20 00:56:31 -05001858
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001859 error = device_add(&dev->dev);
Dmitry Torokhovbd0ef232005-11-20 00:56:31 -05001860 if (error)
1861 return error;
1862
Dmitry Torokhov9657d752007-06-14 23:32:24 -04001863 path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
Joe Perchesda0c4902010-11-29 23:33:07 -08001864 pr_info("%s as %s\n",
1865 dev->name ? dev->name : "Unspecified device",
1866 path ? path : "N/A");
Dmitry Torokhovbd0ef232005-11-20 00:56:31 -05001867 kfree(path);
Greg Kroah-Hartman10204022005-10-27 22:25:43 -07001868
Dmitry Torokhov80064792007-08-30 00:22:11 -04001869 error = mutex_lock_interruptible(&input_mutex);
1870 if (error) {
1871 device_del(&dev->dev);
1872 return error;
1873 }
1874
1875 list_add_tail(&dev->node, &input_dev_list);
1876
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001877 list_for_each_entry(handler, &input_handler_list, node)
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001878 input_attach_handler(dev, handler);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001879
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001880 input_wakeup_procfs_readers();
Dmitry Torokhov5f945482005-11-02 22:51:46 -05001881
Dmitry Torokhov80064792007-08-30 00:22:11 -04001882 mutex_unlock(&input_mutex);
1883
Dmitry Torokhov5f945482005-11-02 22:51:46 -05001884 return 0;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001885}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001886EXPORT_SYMBOL(input_register_device);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001887
Dmitry Torokhov80064792007-08-30 00:22:11 -04001888/**
1889 * input_unregister_device - unregister previously registered device
1890 * @dev: device to be unregistered
1891 *
1892 * This function unregisters an input device. Once device is unregistered
1893 * the caller should not try to access it as it may get freed at any moment.
1894 */
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001895void input_unregister_device(struct input_dev *dev)
1896{
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001897 struct input_handle *handle, *next;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001898
Dmitry Torokhov80064792007-08-30 00:22:11 -04001899 input_disconnect_device(dev);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001900
Dmitry Torokhov80064792007-08-30 00:22:11 -04001901 mutex_lock(&input_mutex);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001902
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001903 list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001904 handle->handler->disconnect(handle);
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001905 WARN_ON(!list_empty(&dev->h_list));
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001906
Dmitry Torokhov80064792007-08-30 00:22:11 -04001907 del_timer_sync(&dev->timer);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001908 list_del_init(&dev->node);
1909
1910 input_wakeup_procfs_readers();
Dmitry Torokhov80064792007-08-30 00:22:11 -04001911
1912 mutex_unlock(&input_mutex);
1913
1914 device_unregister(&dev->dev);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001915}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001916EXPORT_SYMBOL(input_unregister_device);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001917
Dmitry Torokhov80064792007-08-30 00:22:11 -04001918/**
1919 * input_register_handler - register a new input handler
1920 * @handler: handler to be registered
1921 *
1922 * This function registers a new input handler (interface) for input
1923 * devices in the system and attaches it to all input devices that
1924 * are compatible with the handler.
1925 */
Dmitry Torokhov4263cf02006-09-14 01:32:39 -04001926int input_register_handler(struct input_handler *handler)
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001927{
1928 struct input_dev *dev;
Dmitry Torokhov80064792007-08-30 00:22:11 -04001929 int retval;
1930
1931 retval = mutex_lock_interruptible(&input_mutex);
1932 if (retval)
1933 return retval;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001934
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001935 INIT_LIST_HEAD(&handler->h_list);
1936
Dmitry Torokhov4263cf02006-09-14 01:32:39 -04001937 if (handler->fops != NULL) {
Dmitry Torokhov80064792007-08-30 00:22:11 -04001938 if (input_table[handler->minor >> 5]) {
1939 retval = -EBUSY;
1940 goto out;
1941 }
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001942 input_table[handler->minor >> 5] = handler;
Dmitry Torokhov4263cf02006-09-14 01:32:39 -04001943 }
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001944
1945 list_add_tail(&handler->node, &input_handler_list);
1946
1947 list_for_each_entry(dev, &input_dev_list, node)
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001948 input_attach_handler(dev, handler);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001949
1950 input_wakeup_procfs_readers();
Dmitry Torokhov80064792007-08-30 00:22:11 -04001951
1952 out:
1953 mutex_unlock(&input_mutex);
1954 return retval;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001955}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001956EXPORT_SYMBOL(input_register_handler);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001957
Dmitry Torokhov80064792007-08-30 00:22:11 -04001958/**
1959 * input_unregister_handler - unregisters an input handler
1960 * @handler: handler to be unregistered
1961 *
1962 * This function disconnects a handler from its input devices and
1963 * removes it from lists of known handlers.
1964 */
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001965void input_unregister_handler(struct input_handler *handler)
1966{
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001967 struct input_handle *handle, *next;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001968
Dmitry Torokhov80064792007-08-30 00:22:11 -04001969 mutex_lock(&input_mutex);
1970
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001971 list_for_each_entry_safe(handle, next, &handler->h_list, h_node)
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001972 handler->disconnect(handle);
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04001973 WARN_ON(!list_empty(&handler->h_list));
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001974
1975 list_del_init(&handler->node);
1976
1977 if (handler->fops != NULL)
1978 input_table[handler->minor >> 5] = NULL;
1979
1980 input_wakeup_procfs_readers();
Dmitry Torokhov80064792007-08-30 00:22:11 -04001981
1982 mutex_unlock(&input_mutex);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001983}
Dmitry Torokhovca56fe02006-06-26 01:49:21 -04001984EXPORT_SYMBOL(input_unregister_handler);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05001985
Dmitry Torokhov80064792007-08-30 00:22:11 -04001986/**
Dmitry Torokhov66d2a592009-12-01 21:54:35 -08001987 * input_handler_for_each_handle - handle iterator
1988 * @handler: input handler to iterate
1989 * @data: data for the callback
1990 * @fn: function to be called for each handle
1991 *
1992 * Iterate over @bus's list of devices, and call @fn for each, passing
1993 * it @data and stop when @fn returns a non-zero value. The function is
1994 * using RCU to traverse the list and therefore may be usind in atonic
1995 * contexts. The @fn callback is invoked from RCU critical section and
1996 * thus must not sleep.
1997 */
1998int input_handler_for_each_handle(struct input_handler *handler, void *data,
1999 int (*fn)(struct input_handle *, void *))
2000{
2001 struct input_handle *handle;
2002 int retval = 0;
2003
2004 rcu_read_lock();
2005
2006 list_for_each_entry_rcu(handle, &handler->h_list, h_node) {
2007 retval = fn(handle, data);
2008 if (retval)
2009 break;
2010 }
2011
2012 rcu_read_unlock();
2013
2014 return retval;
2015}
2016EXPORT_SYMBOL(input_handler_for_each_handle);
2017
2018/**
Dmitry Torokhov80064792007-08-30 00:22:11 -04002019 * input_register_handle - register a new input handle
2020 * @handle: handle to register
2021 *
2022 * This function puts a new input handle onto device's
2023 * and handler's lists so that events can flow through
2024 * it once it is opened using input_open_device().
2025 *
2026 * This function is supposed to be called from handler's
2027 * connect() method.
2028 */
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04002029int input_register_handle(struct input_handle *handle)
2030{
2031 struct input_handler *handler = handle->handler;
Dmitry Torokhov80064792007-08-30 00:22:11 -04002032 struct input_dev *dev = handle->dev;
2033 int error;
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04002034
Dmitry Torokhov80064792007-08-30 00:22:11 -04002035 /*
2036 * We take dev->mutex here to prevent race with
2037 * input_release_device().
2038 */
2039 error = mutex_lock_interruptible(&dev->mutex);
2040 if (error)
2041 return error;
Dmitry Torokhovef7995f2010-01-29 23:59:12 -08002042
2043 /*
2044 * Filters go to the head of the list, normal handlers
2045 * to the tail.
2046 */
2047 if (handler->filter)
2048 list_add_rcu(&handle->d_node, &dev->h_list);
2049 else
2050 list_add_tail_rcu(&handle->d_node, &dev->h_list);
2051
Dmitry Torokhov80064792007-08-30 00:22:11 -04002052 mutex_unlock(&dev->mutex);
Dmitry Torokhov80064792007-08-30 00:22:11 -04002053
2054 /*
2055 * Since we are supposed to be called from ->connect()
2056 * which is mutually exclusive with ->disconnect()
2057 * we can't be racing with input_unregister_handle()
2058 * and so separate lock is not needed here.
2059 */
Dmitry Torokhov66d2a592009-12-01 21:54:35 -08002060 list_add_tail_rcu(&handle->h_node, &handler->h_list);
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04002061
2062 if (handler->start)
2063 handler->start(handle);
2064
2065 return 0;
2066}
2067EXPORT_SYMBOL(input_register_handle);
2068
Dmitry Torokhov80064792007-08-30 00:22:11 -04002069/**
2070 * input_unregister_handle - unregister an input handle
2071 * @handle: handle to unregister
2072 *
2073 * This function removes input handle from device's
2074 * and handler's lists.
2075 *
2076 * This function is supposed to be called from handler's
2077 * disconnect() method.
2078 */
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04002079void input_unregister_handle(struct input_handle *handle)
2080{
Dmitry Torokhov80064792007-08-30 00:22:11 -04002081 struct input_dev *dev = handle->dev;
2082
Dmitry Torokhov66d2a592009-12-01 21:54:35 -08002083 list_del_rcu(&handle->h_node);
Dmitry Torokhov80064792007-08-30 00:22:11 -04002084
2085 /*
2086 * Take dev->mutex to prevent race with input_release_device().
2087 */
2088 mutex_lock(&dev->mutex);
2089 list_del_rcu(&handle->d_node);
2090 mutex_unlock(&dev->mutex);
Dmitry Torokhov66d2a592009-12-01 21:54:35 -08002091
Dmitry Torokhov82ba56c2007-10-13 15:46:55 -04002092 synchronize_rcu();
Dmitry Torokhov5b2a0822007-04-12 01:29:46 -04002093}
2094EXPORT_SYMBOL(input_unregister_handle);
2095
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002096static int input_open_file(struct inode *inode, struct file *file)
2097{
Jonathan Corbet2edbf852008-05-15 10:37:16 -06002098 struct input_handler *handler;
Arjan van de Ven99ac48f2006-03-28 01:56:41 -08002099 const struct file_operations *old_fops, *new_fops = NULL;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002100 int err;
2101
Arnd Bergmann2f2177c2010-03-09 20:38:48 -08002102 err = mutex_lock_interruptible(&input_mutex);
2103 if (err)
2104 return err;
2105
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002106 /* No load-on-demand here? */
Jonathan Corbet2edbf852008-05-15 10:37:16 -06002107 handler = input_table[iminor(inode) >> 5];
Arnd Bergmann2f2177c2010-03-09 20:38:48 -08002108 if (handler)
2109 new_fops = fops_get(handler->fops);
2110
2111 mutex_unlock(&input_mutex);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002112
2113 /*
2114 * That's _really_ odd. Usually NULL ->open means "nothing special",
2115 * not "no device". Oh, well...
2116 */
Arnd Bergmann2f2177c2010-03-09 20:38:48 -08002117 if (!new_fops || !new_fops->open) {
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002118 fops_put(new_fops);
Jonathan Corbet2edbf852008-05-15 10:37:16 -06002119 err = -ENODEV;
2120 goto out;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002121 }
Arnd Bergmann2f2177c2010-03-09 20:38:48 -08002122
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002123 old_fops = file->f_op;
2124 file->f_op = new_fops;
2125
2126 err = new_fops->open(inode, file);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002127 if (err) {
2128 fops_put(file->f_op);
2129 file->f_op = fops_get(old_fops);
2130 }
2131 fops_put(old_fops);
Jonathan Corbet2edbf852008-05-15 10:37:16 -06002132out:
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002133 return err;
2134}
2135
Arjan van de Ven2b8693c2007-02-12 00:55:32 -08002136static const struct file_operations input_fops = {
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002137 .owner = THIS_MODULE,
2138 .open = input_open_file,
Arnd Bergmann6038f372010-08-15 18:52:59 +02002139 .llseek = noop_llseek,
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002140};
2141
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142static int __init input_init(void)
2143{
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002144 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002145
Greg Kroah-Hartmanea9f2402005-10-27 22:25:43 -07002146 err = class_register(&input_class);
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05002147 if (err) {
Joe Perchesda0c4902010-11-29 23:33:07 -08002148 pr_err("unable to register input_dev class\n");
Dmitry Torokhovd19fbe82005-09-15 02:01:39 -05002149 return err;
2150 }
2151
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002152 err = input_proc_init();
2153 if (err)
Greg Kroah-Hartmanb0fdfeb2005-10-27 22:25:43 -07002154 goto fail1;
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002155
2156 err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
2157 if (err) {
Joe Perchesda0c4902010-11-29 23:33:07 -08002158 pr_err("unable to register char major %d", INPUT_MAJOR);
Greg Kroah-Hartmanb0fdfeb2005-10-27 22:25:43 -07002159 goto fail2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002160 }
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002161
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002162 return 0;
2163
Greg Kroah-Hartmanb0fdfeb2005-10-27 22:25:43 -07002164 fail2: input_proc_exit();
Greg Kroah-Hartmanea9f2402005-10-27 22:25:43 -07002165 fail1: class_unregister(&input_class);
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002166 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167}
2168
2169static void __exit input_exit(void)
2170{
Dmitry Torokhovf96b4342005-06-30 00:50:29 -05002171 input_proc_exit();
Linus Torvalds1da177e2005-04-16 15:20:36 -07002172 unregister_chrdev(INPUT_MAJOR, "input");
Greg Kroah-Hartmanea9f2402005-10-27 22:25:43 -07002173 class_unregister(&input_class);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174}
2175
2176subsys_initcall(input_init);
2177module_exit(input_exit);