blob: f41d5fe51abe3b812b600c7fa79d789f350ef3ce [file] [log] [blame]
Jiri Kosinadde58452006-12-08 18:40:44 +01001/*
Jiri Kosina229695e2006-12-08 18:40:53 +01002 * HID support for Linux
Jiri Kosinadde58452006-12-08 18:40:44 +01003 *
4 * Copyright (c) 1999 Andreas Gal
5 * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
6 * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
Jiri Kosina6b1968d2012-03-09 13:55:43 +01007 * Copyright (c) 2006-2012 Jiri Kosina
Jiri Kosinadde58452006-12-08 18:40:44 +01008 */
9
10/*
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
13 * Software Foundation; either version 2 of the License, or (at your option)
14 * any later version.
15 */
16
Joe Perches4291ee32010-12-09 19:29:03 -080017#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18
Jiri Kosinadde58452006-12-08 18:40:44 +010019#include <linux/module.h>
20#include <linux/slab.h>
21#include <linux/init.h>
22#include <linux/kernel.h>
Jiri Kosinadde58452006-12-08 18:40:44 +010023#include <linux/list.h>
24#include <linux/mm.h>
Jiri Kosinadde58452006-12-08 18:40:44 +010025#include <linux/spinlock.h>
26#include <asm/unaligned.h>
27#include <asm/byteorder.h>
28#include <linux/input.h>
29#include <linux/wait.h>
Jiri Kosina47a80ed2007-03-12 14:55:12 +010030#include <linux/vmalloc.h>
Jiri Kosinac4124c92007-11-30 11:12:58 +010031#include <linux/sched.h>
David Herrmann4ea54542011-08-10 14:02:07 +020032#include <linux/semaphore.h>
Jiri Kosinadde58452006-12-08 18:40:44 +010033
Jiri Kosinadde58452006-12-08 18:40:44 +010034#include <linux/hid.h>
35#include <linux/hiddev.h>
Jiri Kosinac080d892007-01-25 11:43:31 +010036#include <linux/hid-debug.h>
Jiri Kosina86166b72007-05-14 09:57:40 +020037#include <linux/hidraw.h>
Jiri Kosinadde58452006-12-08 18:40:44 +010038
Jiri Slaby5f22a792008-05-16 11:49:19 +020039#include "hid-ids.h"
40
Jiri Kosinadde58452006-12-08 18:40:44 +010041/*
42 * Version Information
43 */
44
Jiri Kosina53149802007-01-09 13:24:25 +010045#define DRIVER_DESC "HID core driver"
Jiri Kosinadde58452006-12-08 18:40:44 +010046
Jiri Kosina58037eb2007-05-30 15:07:13 +020047int hid_debug = 0;
Anssi Hannula377e10f2008-03-22 23:50:13 +010048module_param_named(debug, hid_debug, int, 0600);
Jiri Kosinacd667ce2009-06-12 15:20:57 +020049MODULE_PARM_DESC(debug, "toggle HID debugging messages");
Jiri Kosina58037eb2007-05-30 15:07:13 +020050EXPORT_SYMBOL_GPL(hid_debug);
Jiri Kosina58037eb2007-05-30 15:07:13 +020051
Jiri Kosina6b1968d2012-03-09 13:55:43 +010052static int hid_ignore_special_drivers = 0;
53module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600);
Hans Petter Selasky643727a2014-09-08 09:35:35 +020054MODULE_PARM_DESC(ignore_special_drivers, "Ignore any special drivers and handle all devices by generic driver");
Jiri Kosina6b1968d2012-03-09 13:55:43 +010055
Jiri Kosinadde58452006-12-08 18:40:44 +010056/*
Jiri Kosinadde58452006-12-08 18:40:44 +010057 * Register a new report for a device.
58 */
59
Benjamin Tissoiresf07b3c12018-04-24 10:04:33 +020060struct hid_report *hid_register_report(struct hid_device *device,
61 unsigned int type, unsigned int id,
62 unsigned int application)
Jiri Kosinadde58452006-12-08 18:40:44 +010063{
64 struct hid_report_enum *report_enum = device->report_enum + type;
65 struct hid_report *report;
66
Kees Cook43622022013-08-28 22:29:55 +020067 if (id >= HID_MAX_IDS)
68 return NULL;
Jiri Kosinadde58452006-12-08 18:40:44 +010069 if (report_enum->report_id_hash[id])
70 return report_enum->report_id_hash[id];
71
Joe Perchesa3789a12010-12-09 19:29:07 -080072 report = kzalloc(sizeof(struct hid_report), GFP_KERNEL);
73 if (!report)
Jiri Kosinadde58452006-12-08 18:40:44 +010074 return NULL;
75
76 if (id != 0)
77 report_enum->numbered = 1;
78
79 report->id = id;
80 report->type = type;
81 report->size = 0;
82 report->device = device;
Benjamin Tissoiresf07b3c12018-04-24 10:04:33 +020083 report->application = application;
Jiri Kosinadde58452006-12-08 18:40:44 +010084 report_enum->report_id_hash[id] = report;
85
86 list_add_tail(&report->list, &report_enum->report_list);
87
88 return report;
89}
Michael Poole90a006a2010-01-24 22:32:29 -050090EXPORT_SYMBOL_GPL(hid_register_report);
Jiri Kosinadde58452006-12-08 18:40:44 +010091
92/*
93 * Register a new field for this report.
94 */
95
96static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values)
97{
98 struct hid_field *field;
99
100 if (report->maxfield == HID_MAX_FIELDS) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100101 hid_err(report->device, "too many fields in report\n");
Jiri Kosinadde58452006-12-08 18:40:44 +0100102 return NULL;
103 }
104
Joe Perchesa3789a12010-12-09 19:29:07 -0800105 field = kzalloc((sizeof(struct hid_field) +
106 usages * sizeof(struct hid_usage) +
107 values * sizeof(unsigned)), GFP_KERNEL);
108 if (!field)
109 return NULL;
Jiri Kosinadde58452006-12-08 18:40:44 +0100110
111 field->index = report->maxfield++;
112 report->field[field->index] = field;
113 field->usage = (struct hid_usage *)(field + 1);
Jiri Slaby282bfd42008-03-28 17:06:41 +0100114 field->value = (s32 *)(field->usage + usages);
Jiri Kosinadde58452006-12-08 18:40:44 +0100115 field->report = report;
116
117 return field;
118}
119
120/*
121 * Open a collection. The type/usage is pushed on the stack.
122 */
123
124static int open_collection(struct hid_parser *parser, unsigned type)
125{
126 struct hid_collection *collection;
127 unsigned usage;
128
129 usage = parser->local.usage[0];
130
Benjamin Tissoires08a8a7c2018-07-13 16:13:50 +0200131 if (parser->collection_stack_ptr == parser->collection_stack_size) {
132 unsigned int *collection_stack;
133 unsigned int new_size = parser->collection_stack_size +
134 HID_COLLECTION_STACK_SIZE;
135
136 collection_stack = krealloc(parser->collection_stack,
137 new_size * sizeof(unsigned int),
138 GFP_KERNEL);
139 if (!collection_stack)
140 return -ENOMEM;
141
142 parser->collection_stack = collection_stack;
143 parser->collection_stack_size = new_size;
Jiri Kosinadde58452006-12-08 18:40:44 +0100144 }
145
146 if (parser->device->maxcollection == parser->device->collection_size) {
Kees Cook6da2ec52018-06-12 13:55:00 -0700147 collection = kmalloc(
148 array3_size(sizeof(struct hid_collection),
149 parser->device->collection_size,
150 2),
151 GFP_KERNEL);
Jiri Kosinadde58452006-12-08 18:40:44 +0100152 if (collection == NULL) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100153 hid_err(parser->device, "failed to reallocate collection array\n");
Sachin Kamata6fbaac2012-09-17 16:41:56 +0530154 return -ENOMEM;
Jiri Kosinadde58452006-12-08 18:40:44 +0100155 }
156 memcpy(collection, parser->device->collection,
157 sizeof(struct hid_collection) *
158 parser->device->collection_size);
159 memset(collection + parser->device->collection_size, 0,
160 sizeof(struct hid_collection) *
161 parser->device->collection_size);
162 kfree(parser->device->collection);
163 parser->device->collection = collection;
164 parser->device->collection_size *= 2;
165 }
166
167 parser->collection_stack[parser->collection_stack_ptr++] =
168 parser->device->maxcollection;
169
170 collection = parser->device->collection +
171 parser->device->maxcollection++;
172 collection->type = type;
173 collection->usage = usage;
174 collection->level = parser->collection_stack_ptr - 1;
Peter Huttererc53431e2018-12-05 10:42:22 +1000175 collection->parent = parser->active_collection;
176 parser->active_collection = collection;
Jiri Kosinadde58452006-12-08 18:40:44 +0100177
178 if (type == HID_COLLECTION_APPLICATION)
179 parser->device->maxapplication++;
180
181 return 0;
182}
183
184/*
185 * Close a collection.
186 */
187
188static int close_collection(struct hid_parser *parser)
189{
190 if (!parser->collection_stack_ptr) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100191 hid_err(parser->device, "collection stack underflow\n");
Sachin Kamata6fbaac2012-09-17 16:41:56 +0530192 return -EINVAL;
Jiri Kosinadde58452006-12-08 18:40:44 +0100193 }
194 parser->collection_stack_ptr--;
Peter Huttererc53431e2018-12-05 10:42:22 +1000195 if (parser->active_collection)
196 parser->active_collection = parser->active_collection->parent;
Jiri Kosinadde58452006-12-08 18:40:44 +0100197 return 0;
198}
199
200/*
201 * Climb up the stack, search for the specified collection type
202 * and return the usage.
203 */
204
205static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)
206{
Joe Perches504499f2010-12-09 19:29:08 -0800207 struct hid_collection *collection = parser->device->collection;
Jiri Kosinadde58452006-12-08 18:40:44 +0100208 int n;
Joe Perches504499f2010-12-09 19:29:08 -0800209
210 for (n = parser->collection_stack_ptr - 1; n >= 0; n--) {
211 unsigned index = parser->collection_stack[n];
212 if (collection[index].type == type)
213 return collection[index].usage;
214 }
Jiri Kosinadde58452006-12-08 18:40:44 +0100215 return 0; /* we know nothing about this usage type */
216}
217
218/*
219 * Add a usage to the temporary parser table.
220 */
221
222static int hid_add_usage(struct hid_parser *parser, unsigned usage)
223{
224 if (parser->local.usage_index >= HID_MAX_USAGES) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100225 hid_err(parser->device, "usage index exceeded\n");
Jiri Kosinadde58452006-12-08 18:40:44 +0100226 return -1;
227 }
228 parser->local.usage[parser->local.usage_index] = usage;
229 parser->local.collection_index[parser->local.usage_index] =
230 parser->collection_stack_ptr ?
231 parser->collection_stack[parser->collection_stack_ptr - 1] : 0;
232 parser->local.usage_index++;
233 return 0;
234}
235
236/*
237 * Register a new field for this report.
238 */
239
240static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsigned flags)
241{
242 struct hid_report *report;
243 struct hid_field *field;
Benjamin Tissoiresf07b3c12018-04-24 10:04:33 +0200244 unsigned int usages;
245 unsigned int offset;
246 unsigned int i;
247 unsigned int application;
Jiri Kosinadde58452006-12-08 18:40:44 +0100248
Benjamin Tissoiresf07b3c12018-04-24 10:04:33 +0200249 application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION);
250
251 report = hid_register_report(parser->device, report_type,
252 parser->global.report_id, application);
Joe Perchesa3789a12010-12-09 19:29:07 -0800253 if (!report) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100254 hid_err(parser->device, "hid_register_report failed\n");
Jiri Kosinadde58452006-12-08 18:40:44 +0100255 return -1;
256 }
257
Jiri Kosinabb2e1972012-05-14 15:02:56 +0200258 /* Handle both signed and unsigned cases properly */
srinivas pandruvada0cd516c2012-05-10 16:45:31 -0700259 if ((parser->global.logical_minimum < 0 &&
260 parser->global.logical_maximum <
261 parser->global.logical_minimum) ||
262 (parser->global.logical_minimum >= 0 &&
263 (__u32)parser->global.logical_maximum <
264 (__u32)parser->global.logical_minimum)) {
265 dbg_hid("logical range invalid 0x%x 0x%x\n",
266 parser->global.logical_minimum,
267 parser->global.logical_maximum);
Jiri Kosinadde58452006-12-08 18:40:44 +0100268 return -1;
269 }
270
271 offset = report->size;
272 report->size += parser->global.report_size * parser->global.report_count;
273
274 if (!parser->local.usage_index) /* Ignore padding fields */
275 return 0;
276
Benjamin Tissoirescc6b54a2013-09-11 21:56:57 +0200277 usages = max_t(unsigned, parser->local.usage_index,
278 parser->global.report_count);
Jiri Kosinadde58452006-12-08 18:40:44 +0100279
Joe Perchesa3789a12010-12-09 19:29:07 -0800280 field = hid_register_field(report, usages, parser->global.report_count);
281 if (!field)
Jiri Kosinadde58452006-12-08 18:40:44 +0100282 return 0;
283
284 field->physical = hid_lookup_collection(parser, HID_COLLECTION_PHYSICAL);
285 field->logical = hid_lookup_collection(parser, HID_COLLECTION_LOGICAL);
Benjamin Tissoiresf07b3c12018-04-24 10:04:33 +0200286 field->application = application;
Jiri Kosinadde58452006-12-08 18:40:44 +0100287
288 for (i = 0; i < usages; i++) {
Benjamin Tissoirescc6b54a2013-09-11 21:56:57 +0200289 unsigned j = i;
Jiri Kosinadde58452006-12-08 18:40:44 +0100290 /* Duplicate the last usage we parsed if we have excess values */
291 if (i >= parser->local.usage_index)
292 j = parser->local.usage_index - 1;
293 field->usage[i].hid = parser->local.usage[j];
294 field->usage[i].collection_index =
295 parser->local.collection_index[j];
Benjamin Tissoirescc6b54a2013-09-11 21:56:57 +0200296 field->usage[i].usage_index = i;
Peter Hutterer5a4abb32018-12-05 10:42:23 +1000297 field->usage[i].resolution_multiplier = 1;
Jiri Kosinadde58452006-12-08 18:40:44 +0100298 }
299
300 field->maxusage = usages;
301 field->flags = flags;
302 field->report_offset = offset;
303 field->report_type = report_type;
304 field->report_size = parser->global.report_size;
305 field->report_count = parser->global.report_count;
306 field->logical_minimum = parser->global.logical_minimum;
307 field->logical_maximum = parser->global.logical_maximum;
308 field->physical_minimum = parser->global.physical_minimum;
309 field->physical_maximum = parser->global.physical_maximum;
310 field->unit_exponent = parser->global.unit_exponent;
311 field->unit = parser->global.unit;
312
313 return 0;
314}
315
316/*
317 * Read data value from item.
318 */
319
320static u32 item_udata(struct hid_item *item)
321{
322 switch (item->size) {
Jiri Slaby880d29f2008-06-18 23:55:41 +0200323 case 1: return item->data.u8;
324 case 2: return item->data.u16;
325 case 4: return item->data.u32;
Jiri Kosinadde58452006-12-08 18:40:44 +0100326 }
327 return 0;
328}
329
330static s32 item_sdata(struct hid_item *item)
331{
332 switch (item->size) {
Jiri Slaby880d29f2008-06-18 23:55:41 +0200333 case 1: return item->data.s8;
334 case 2: return item->data.s16;
335 case 4: return item->data.s32;
Jiri Kosinadde58452006-12-08 18:40:44 +0100336 }
337 return 0;
338}
339
340/*
341 * Process a global item.
342 */
343
344static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
345{
Nikolai Kondrashovad0e669b2013-10-13 15:09:52 +0300346 __s32 raw_value;
Jiri Kosinadde58452006-12-08 18:40:44 +0100347 switch (item->tag) {
Jiri Slaby880d29f2008-06-18 23:55:41 +0200348 case HID_GLOBAL_ITEM_TAG_PUSH:
Jiri Kosinadde58452006-12-08 18:40:44 +0100349
Jiri Slaby880d29f2008-06-18 23:55:41 +0200350 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100351 hid_err(parser->device, "global environment stack overflow\n");
Jiri Kosinadde58452006-12-08 18:40:44 +0100352 return -1;
Jiri Slaby880d29f2008-06-18 23:55:41 +0200353 }
354
355 memcpy(parser->global_stack + parser->global_stack_ptr++,
356 &parser->global, sizeof(struct hid_global));
357 return 0;
358
359 case HID_GLOBAL_ITEM_TAG_POP:
360
361 if (!parser->global_stack_ptr) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100362 hid_err(parser->device, "global environment stack underflow\n");
Jiri Slaby880d29f2008-06-18 23:55:41 +0200363 return -1;
364 }
365
366 memcpy(&parser->global, parser->global_stack +
367 --parser->global_stack_ptr, sizeof(struct hid_global));
368 return 0;
369
370 case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
371 parser->global.usage_page = item_udata(item);
372 return 0;
373
374 case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
375 parser->global.logical_minimum = item_sdata(item);
376 return 0;
377
378 case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
379 if (parser->global.logical_minimum < 0)
380 parser->global.logical_maximum = item_sdata(item);
381 else
382 parser->global.logical_maximum = item_udata(item);
383 return 0;
384
385 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
386 parser->global.physical_minimum = item_sdata(item);
387 return 0;
388
389 case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
390 if (parser->global.physical_minimum < 0)
391 parser->global.physical_maximum = item_sdata(item);
392 else
393 parser->global.physical_maximum = item_udata(item);
394 return 0;
395
396 case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
Nikolai Kondrashovad0e669b2013-10-13 15:09:52 +0300397 /* Many devices provide unit exponent as a two's complement
398 * nibble due to the common misunderstanding of HID
399 * specification 1.11, 6.2.2.7 Global Items. Attempt to handle
400 * both this and the standard encoding. */
401 raw_value = item_sdata(item);
Benjamin Tissoires77463832012-11-14 16:59:15 +0100402 if (!(raw_value & 0xfffffff0))
403 parser->global.unit_exponent = hid_snto32(raw_value, 4);
404 else
405 parser->global.unit_exponent = raw_value;
Jiri Slaby880d29f2008-06-18 23:55:41 +0200406 return 0;
407
408 case HID_GLOBAL_ITEM_TAG_UNIT:
409 parser->global.unit = item_udata(item);
410 return 0;
411
412 case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
413 parser->global.report_size = item_udata(item);
Song, Hongyan71f6fa92018-08-03 14:45:59 +0800414 if (parser->global.report_size > 256) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100415 hid_err(parser->device, "invalid report_size %d\n",
Jiri Slaby880d29f2008-06-18 23:55:41 +0200416 parser->global.report_size);
417 return -1;
418 }
419 return 0;
420
421 case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
422 parser->global.report_count = item_udata(item);
423 if (parser->global.report_count > HID_MAX_USAGES) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100424 hid_err(parser->device, "invalid report_count %d\n",
Jiri Slaby880d29f2008-06-18 23:55:41 +0200425 parser->global.report_count);
426 return -1;
427 }
428 return 0;
429
430 case HID_GLOBAL_ITEM_TAG_REPORT_ID:
431 parser->global.report_id = item_udata(item);
Kees Cook43622022013-08-28 22:29:55 +0200432 if (parser->global.report_id == 0 ||
433 parser->global.report_id >= HID_MAX_IDS) {
434 hid_err(parser->device, "report_id %u is invalid\n",
435 parser->global.report_id);
Jiri Slaby880d29f2008-06-18 23:55:41 +0200436 return -1;
437 }
438 return 0;
439
440 default:
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100441 hid_err(parser->device, "unknown global tag 0x%x\n", item->tag);
Jiri Slaby880d29f2008-06-18 23:55:41 +0200442 return -1;
Jiri Kosinadde58452006-12-08 18:40:44 +0100443 }
444}
445
446/*
447 * Process a local item.
448 */
449
450static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
451{
452 __u32 data;
453 unsigned n;
Benjamin Tissoiresba532192015-07-24 12:02:22 -0400454 __u32 count;
Jiri Kosinadde58452006-12-08 18:40:44 +0100455
Jiri Kosinadde58452006-12-08 18:40:44 +0100456 data = item_udata(item);
457
458 switch (item->tag) {
Jiri Slaby880d29f2008-06-18 23:55:41 +0200459 case HID_LOCAL_ITEM_TAG_DELIMITER:
Jiri Kosinadde58452006-12-08 18:40:44 +0100460
Jiri Slaby880d29f2008-06-18 23:55:41 +0200461 if (data) {
462 /*
463 * We treat items before the first delimiter
464 * as global to all usage sets (branch 0).
465 * In the moment we process only these global
466 * items and the first delimiter set.
467 */
468 if (parser->local.delimiter_depth != 0) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100469 hid_err(parser->device, "nested delimiters\n");
Jiri Slaby880d29f2008-06-18 23:55:41 +0200470 return -1;
Jiri Kosinadde58452006-12-08 18:40:44 +0100471 }
Jiri Slaby880d29f2008-06-18 23:55:41 +0200472 parser->local.delimiter_depth++;
473 parser->local.delimiter_branch++;
474 } else {
475 if (parser->local.delimiter_depth < 1) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +0100476 hid_err(parser->device, "bogus close delimiter\n");
Jiri Slaby880d29f2008-06-18 23:55:41 +0200477 return -1;
Jiri Kosinadde58452006-12-08 18:40:44 +0100478 }
Jiri Slaby880d29f2008-06-18 23:55:41 +0200479 parser->local.delimiter_depth--;
480 }
Paul Chavent38ead6e2013-07-07 17:43:56 +0200481 return 0;
Jiri Kosinadde58452006-12-08 18:40:44 +0100482
Jiri Slaby880d29f2008-06-18 23:55:41 +0200483 case HID_LOCAL_ITEM_TAG_USAGE:
Jiri Kosinadde58452006-12-08 18:40:44 +0100484
Jiri Slaby880d29f2008-06-18 23:55:41 +0200485 if (parser->local.delimiter_branch > 1) {
486 dbg_hid("alternative usage ignored\n");
Jiri Kosinadde58452006-12-08 18:40:44 +0100487 return 0;
Jiri Slaby880d29f2008-06-18 23:55:41 +0200488 }
Jiri Kosinadde58452006-12-08 18:40:44 +0100489
Jiri Slaby880d29f2008-06-18 23:55:41 +0200490 if (item->size <= 2)
491 data = (parser->global.usage_page << 16) + data;
Jiri Kosinadde58452006-12-08 18:40:44 +0100492
Jiri Slaby880d29f2008-06-18 23:55:41 +0200493 return hid_add_usage(parser, data);
494
495 case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
496
497 if (parser->local.delimiter_branch > 1) {
498 dbg_hid("alternative usage ignored\n");
499 return 0;
500 }
501
502 if (item->size <= 2)
503 data = (parser->global.usage_page << 16) + data;
504
505 parser->local.usage_minimum = data;
506 return 0;
507
508 case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
509
510 if (parser->local.delimiter_branch > 1) {
511 dbg_hid("alternative usage ignored\n");
512 return 0;
513 }
514
515 if (item->size <= 2)
516 data = (parser->global.usage_page << 16) + data;
517
Benjamin Tissoiresba532192015-07-24 12:02:22 -0400518 count = data - parser->local.usage_minimum;
519 if (count + parser->local.usage_index >= HID_MAX_USAGES) {
520 /*
521 * We do not warn if the name is not set, we are
522 * actually pre-scanning the device.
523 */
524 if (dev_name(&parser->device->dev))
525 hid_warn(parser->device,
526 "ignoring exceeding usage max\n");
527 data = HID_MAX_USAGES - parser->local.usage_index +
528 parser->local.usage_minimum - 1;
529 if (data <= 0) {
530 hid_err(parser->device,
531 "no more usage index available\n");
532 return -1;
533 }
534 }
535
Jiri Slaby880d29f2008-06-18 23:55:41 +0200536 for (n = parser->local.usage_minimum; n <= data; n++)
537 if (hid_add_usage(parser, n)) {
538 dbg_hid("hid_add_usage failed\n");
539 return -1;
Jiri Kosinadde58452006-12-08 18:40:44 +0100540 }
Jiri Slaby880d29f2008-06-18 23:55:41 +0200541 return 0;
Jiri Kosinadde58452006-12-08 18:40:44 +0100542
Jiri Slaby880d29f2008-06-18 23:55:41 +0200543 default:
Jiri Kosinadde58452006-12-08 18:40:44 +0100544
Jiri Slaby880d29f2008-06-18 23:55:41 +0200545 dbg_hid("unknown local item tag 0x%x\n", item->tag);
546 return 0;
Jiri Kosinadde58452006-12-08 18:40:44 +0100547 }
548 return 0;
549}
550
551/*
552 * Process a main item.
553 */
554
555static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
556{
557 __u32 data;
558 int ret;
559
560 data = item_udata(item);
561
562 switch (item->tag) {
Jiri Slaby880d29f2008-06-18 23:55:41 +0200563 case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
564 ret = open_collection(parser, data & 0xff);
565 break;
566 case HID_MAIN_ITEM_TAG_END_COLLECTION:
567 ret = close_collection(parser);
568 break;
569 case HID_MAIN_ITEM_TAG_INPUT:
570 ret = hid_add_field(parser, HID_INPUT_REPORT, data);
571 break;
572 case HID_MAIN_ITEM_TAG_OUTPUT:
573 ret = hid_add_field(parser, HID_OUTPUT_REPORT, data);
574 break;
575 case HID_MAIN_ITEM_TAG_FEATURE:
576 ret = hid_add_field(parser, HID_FEATURE_REPORT, data);
577 break;
578 default:
Hans de Goede7cb47742017-12-06 17:54:38 +0100579 hid_warn(parser->device, "unknown main item tag 0x%x\n", item->tag);
Jiri Slaby880d29f2008-06-18 23:55:41 +0200580 ret = 0;
Jiri Kosinadde58452006-12-08 18:40:44 +0100581 }
582
583 memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */
584
585 return ret;
586}
587
588/*
589 * Process a reserved item.
590 */
591
592static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item)
593{
Jiri Kosina58037eb2007-05-30 15:07:13 +0200594 dbg_hid("reserved item type, tag 0x%x\n", item->tag);
Jiri Kosinadde58452006-12-08 18:40:44 +0100595 return 0;
596}
597
598/*
599 * Free a report and all registered fields. The field->usage and
600 * field->value table's are allocated behind the field, so we need
601 * only to free(field) itself.
602 */
603
604static void hid_free_report(struct hid_report *report)
605{
606 unsigned n;
607
608 for (n = 0; n < report->maxfield; n++)
609 kfree(report->field[n]);
610 kfree(report);
611}
612
613/*
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200614 * Close report. This function returns the device
615 * state to the point prior to hid_open_report().
Jiri Kosinadde58452006-12-08 18:40:44 +0100616 */
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200617static void hid_close_report(struct hid_device *device)
Jiri Kosinadde58452006-12-08 18:40:44 +0100618{
Jiri Slaby85cdaf52008-05-16 11:49:15 +0200619 unsigned i, j;
Jiri Kosinadde58452006-12-08 18:40:44 +0100620
621 for (i = 0; i < HID_REPORT_TYPES; i++) {
622 struct hid_report_enum *report_enum = device->report_enum + i;
623
Kees Cook43622022013-08-28 22:29:55 +0200624 for (j = 0; j < HID_MAX_IDS; j++) {
Jiri Kosinadde58452006-12-08 18:40:44 +0100625 struct hid_report *report = report_enum->report_id_hash[j];
626 if (report)
627 hid_free_report(report);
628 }
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200629 memset(report_enum, 0, sizeof(*report_enum));
630 INIT_LIST_HEAD(&report_enum->report_list);
Jiri Kosinadde58452006-12-08 18:40:44 +0100631 }
632
633 kfree(device->rdesc);
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200634 device->rdesc = NULL;
635 device->rsize = 0;
636
Jiri Kosina767fe782007-01-24 23:05:07 +0100637 kfree(device->collection);
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200638 device->collection = NULL;
639 device->collection_size = 0;
640 device->maxcollection = 0;
641 device->maxapplication = 0;
642
643 device->status &= ~HID_STAT_PARSED;
644}
645
646/*
647 * Free a device structure, all reports, and all fields.
648 */
649
650static void hid_device_release(struct device *dev)
651{
Geliang Tangee79a8f2015-12-27 17:25:21 +0800652 struct hid_device *hid = to_hid_device(dev);
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200653
654 hid_close_report(hid);
655 kfree(hid->dev_rdesc);
656 kfree(hid);
Jiri Kosinadde58452006-12-08 18:40:44 +0100657}
658
659/*
660 * Fetch a report description item from the data stream. We support long
661 * items, though they are not used yet.
662 */
663
664static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
665{
666 u8 b;
667
668 if ((end - start) <= 0)
669 return NULL;
670
671 b = *start++;
672
673 item->type = (b >> 2) & 3;
674 item->tag = (b >> 4) & 15;
675
676 if (item->tag == HID_ITEM_TAG_LONG) {
677
678 item->format = HID_ITEM_FORMAT_LONG;
679
680 if ((end - start) < 2)
681 return NULL;
682
683 item->size = *start++;
684 item->tag = *start++;
685
686 if ((end - start) < item->size)
687 return NULL;
688
689 item->data.longdata = start;
690 start += item->size;
691 return start;
692 }
693
694 item->format = HID_ITEM_FORMAT_SHORT;
695 item->size = b & 3;
696
697 switch (item->size) {
Jiri Slaby880d29f2008-06-18 23:55:41 +0200698 case 0:
699 return start;
Jiri Kosinadde58452006-12-08 18:40:44 +0100700
Jiri Slaby880d29f2008-06-18 23:55:41 +0200701 case 1:
702 if ((end - start) < 1)
703 return NULL;
704 item->data.u8 = *start++;
705 return start;
Jiri Kosinadde58452006-12-08 18:40:44 +0100706
Jiri Slaby880d29f2008-06-18 23:55:41 +0200707 case 2:
708 if ((end - start) < 2)
709 return NULL;
710 item->data.u16 = get_unaligned_le16(start);
711 start = (__u8 *)((__le16 *)start + 1);
712 return start;
Jiri Kosinadde58452006-12-08 18:40:44 +0100713
Jiri Slaby880d29f2008-06-18 23:55:41 +0200714 case 3:
715 item->size++;
716 if ((end - start) < 4)
717 return NULL;
718 item->data.u32 = get_unaligned_le32(start);
719 start = (__u8 *)((__le32 *)start + 1);
720 return start;
Jiri Kosinadde58452006-12-08 18:40:44 +0100721 }
722
723 return NULL;
724}
725
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200726static void hid_scan_input_usage(struct hid_parser *parser, u32 usage)
Henrik Rydberg734c6602012-04-23 12:07:03 +0200727{
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200728 struct hid_device *hid = parser->device;
729
Henrik Rydberg4fa3a582012-05-01 08:40:01 +0200730 if (usage == HID_DG_CONTACTID)
731 hid->group = HID_GROUP_MULTITOUCH;
Henrik Rydberg734c6602012-04-23 12:07:03 +0200732}
733
Benjamin Tissoiresf961bd32013-08-22 14:51:08 +0200734static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)
735{
736 if (usage == 0xff0000c5 && parser->global.report_count == 256 &&
737 parser->global.report_size == 8)
738 parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
739}
740
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200741static void hid_scan_collection(struct hid_parser *parser, unsigned type)
742{
743 struct hid_device *hid = parser->device;
Andrew Duggane39f2d52014-12-12 10:17:26 -0800744 int i;
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200745
746 if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
747 type == HID_COLLECTION_PHYSICAL)
748 hid->group = HID_GROUP_SENSOR_HUB;
Alan Wube3b1632014-11-03 18:26:12 -0800749
750 if (hid->vendor == USB_VENDOR_ID_MICROSOFT &&
Dennis Chen0a76ac82017-01-19 06:32:09 -0500751 hid->product == USB_DEVICE_ID_MS_POWER_COVER &&
Alan Wube3b1632014-11-03 18:26:12 -0800752 hid->group == HID_GROUP_MULTITOUCH)
753 hid->group = HID_GROUP_GENERIC;
Andrew Duggane39f2d52014-12-12 10:17:26 -0800754
755 if ((parser->global.usage_page << 16) == HID_UP_GENDESK)
756 for (i = 0; i < parser->local.usage_index; i++)
757 if (parser->local.usage[i] == HID_GD_POINTER)
758 parser->scan_flags |= HID_SCAN_FLAG_GD_POINTER;
759
760 if ((parser->global.usage_page << 16) >= HID_UP_MSVENDOR)
761 parser->scan_flags |= HID_SCAN_FLAG_VENDOR_SPECIFIC;
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200762}
763
764static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
765{
766 __u32 data;
767 int i;
768
769 data = item_udata(item);
770
771 switch (item->tag) {
772 case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
773 hid_scan_collection(parser, data & 0xff);
774 break;
775 case HID_MAIN_ITEM_TAG_END_COLLECTION:
776 break;
777 case HID_MAIN_ITEM_TAG_INPUT:
Benjamin Tissoirese24d0d32014-03-31 13:27:10 -0400778 /* ignore constant inputs, they will be ignored by hid-input */
779 if (data & HID_MAIN_ITEM_CONSTANT)
780 break;
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200781 for (i = 0; i < parser->local.usage_index; i++)
782 hid_scan_input_usage(parser, parser->local.usage[i]);
783 break;
784 case HID_MAIN_ITEM_TAG_OUTPUT:
785 break;
786 case HID_MAIN_ITEM_TAG_FEATURE:
Benjamin Tissoiresf961bd32013-08-22 14:51:08 +0200787 for (i = 0; i < parser->local.usage_index; i++)
788 hid_scan_feature_usage(parser, parser->local.usage[i]);
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200789 break;
790 }
791
792 /* Reset the local parser environment */
793 memset(&parser->local, 0, sizeof(parser->local));
794
795 return 0;
796}
797
Henrik Rydberg734c6602012-04-23 12:07:03 +0200798/*
799 * Scan a report descriptor before the device is added to the bus.
800 * Sets device groups and other properties that determine what driver
801 * to load.
802 */
803static int hid_scan_report(struct hid_device *hid)
804{
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200805 struct hid_parser *parser;
806 struct hid_item item;
Henrik Rydberg734c6602012-04-23 12:07:03 +0200807 __u8 *start = hid->dev_rdesc;
808 __u8 *end = start + hid->dev_rsize;
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200809 static int (*dispatch_type[])(struct hid_parser *parser,
810 struct hid_item *item) = {
811 hid_scan_main,
812 hid_parser_global,
813 hid_parser_local,
814 hid_parser_reserved
815 };
Henrik Rydberg734c6602012-04-23 12:07:03 +0200816
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200817 parser = vzalloc(sizeof(struct hid_parser));
818 if (!parser)
819 return -ENOMEM;
820
821 parser->device = hid;
Henrik Rydberg734c6602012-04-23 12:07:03 +0200822 hid->group = HID_GROUP_GENERIC;
Henrik Rydberg734c6602012-04-23 12:07:03 +0200823
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200824 /*
825 * The parsing is simpler than the one in hid_open_report() as we should
826 * be robust against hid errors. Those errors will be raised by
827 * hid_open_report() anyway.
828 */
829 while ((start = fetch_item(start, end, &item)) != NULL)
830 dispatch_type[item.type](parser, &item);
831
Benjamin Tissoiresf961bd32013-08-22 14:51:08 +0200832 /*
833 * Handle special flags set during scanning.
834 */
835 if ((parser->scan_flags & HID_SCAN_FLAG_MT_WIN_8) &&
836 (hid->group == HID_GROUP_MULTITOUCH))
837 hid->group = HID_GROUP_MULTITOUCH_WIN_8;
838
Benjamin Tissoiresba391e52014-05-21 11:15:56 -0400839 /*
Benjamin Tissoires29b47392014-07-24 12:52:23 -0700840 * Vendor specific handlings
841 */
842 switch (hid->vendor) {
843 case USB_VENDOR_ID_WACOM:
844 hid->group = HID_GROUP_WACOM;
845 break;
Benjamin Tissoiresc241c5e2014-09-30 13:18:23 -0400846 case USB_VENDOR_ID_SYNAPTICS:
Jiri Kosina84379d82017-04-11 11:10:16 +0200847 if (hid->group == HID_GROUP_GENERIC)
Andrew Duggane39f2d52014-12-12 10:17:26 -0800848 if ((parser->scan_flags & HID_SCAN_FLAG_VENDOR_SPECIFIC)
849 && (parser->scan_flags & HID_SCAN_FLAG_GD_POINTER))
850 /*
851 * hid-rmi should take care of them,
852 * not hid-generic
853 */
Jiri Kosina0ca4cd72017-06-09 13:15:37 +0200854 hid->group = HID_GROUP_RMI;
Benjamin Tissoiresc241c5e2014-09-30 13:18:23 -0400855 break;
Benjamin Tissoires29b47392014-07-24 12:52:23 -0700856 }
857
Benjamin Tissoires08a8a7c2018-07-13 16:13:50 +0200858 kfree(parser->collection_stack);
Benjamin Tissoires3dc8fc02013-08-22 14:51:07 +0200859 vfree(parser);
Henrik Rydberg734c6602012-04-23 12:07:03 +0200860 return 0;
861}
862
Jiri Slaby85cdaf52008-05-16 11:49:15 +0200863/**
864 * hid_parse_report - parse device report
865 *
866 * @device: hid device
867 * @start: report start
868 * @size: report size
869 *
Henrik Rydberga7197c2e2012-04-22 14:21:40 +0200870 * Allocate the device report as read by the bus driver. This function should
871 * only be called from parse() in ll drivers.
872 */
873int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size)
874{
875 hid->dev_rdesc = kmemdup(start, size, GFP_KERNEL);
876 if (!hid->dev_rdesc)
877 return -ENOMEM;
878 hid->dev_rsize = size;
879 return 0;
880}
881EXPORT_SYMBOL_GPL(hid_parse_report);
882
Kees Cook331415f2013-09-11 21:56:50 +0200883static const char * const hid_report_names[] = {
884 "HID_INPUT_REPORT",
885 "HID_OUTPUT_REPORT",
886 "HID_FEATURE_REPORT",
887};
888/**
889 * hid_validate_values - validate existing device report's value indexes
890 *
891 * @device: hid device
892 * @type: which report type to examine
893 * @id: which report ID to examine (0 for first)
894 * @field_index: which report field to examine
895 * @report_counts: expected number of values
896 *
897 * Validate the number of values in a given field of a given report, after
898 * parsing.
899 */
900struct hid_report *hid_validate_values(struct hid_device *hid,
901 unsigned int type, unsigned int id,
902 unsigned int field_index,
903 unsigned int report_counts)
904{
905 struct hid_report *report;
906
907 if (type > HID_FEATURE_REPORT) {
908 hid_err(hid, "invalid HID report type %u\n", type);
909 return NULL;
910 }
911
912 if (id >= HID_MAX_IDS) {
913 hid_err(hid, "invalid HID report id %u\n", id);
914 return NULL;
915 }
916
917 /*
918 * Explicitly not using hid_get_report() here since it depends on
919 * ->numbered being checked, which may not always be the case when
920 * drivers go to access report values.
921 */
Kees Cook1b15d2e2014-04-17 13:22:09 -0700922 if (id == 0) {
923 /*
924 * Validating on id 0 means we should examine the first
925 * report in the list.
926 */
927 report = list_entry(
928 hid->report_enum[type].report_list.next,
929 struct hid_report, list);
930 } else {
931 report = hid->report_enum[type].report_id_hash[id];
932 }
Kees Cook331415f2013-09-11 21:56:50 +0200933 if (!report) {
934 hid_err(hid, "missing %s %u\n", hid_report_names[type], id);
935 return NULL;
936 }
937 if (report->maxfield <= field_index) {
938 hid_err(hid, "not enough fields in %s %u\n",
939 hid_report_names[type], id);
940 return NULL;
941 }
942 if (report->field[field_index]->report_count < report_counts) {
943 hid_err(hid, "not enough values in %s %u field %u\n",
944 hid_report_names[type], id, field_index);
945 return NULL;
946 }
947 return report;
948}
949EXPORT_SYMBOL_GPL(hid_validate_values);
950
Peter Hutterer5a4abb32018-12-05 10:42:23 +1000951static int hid_calculate_multiplier(struct hid_device *hid,
952 struct hid_field *multiplier)
953{
954 int m;
955 __s32 v = *multiplier->value;
956 __s32 lmin = multiplier->logical_minimum;
957 __s32 lmax = multiplier->logical_maximum;
958 __s32 pmin = multiplier->physical_minimum;
959 __s32 pmax = multiplier->physical_maximum;
960
961 /*
962 * "Because OS implementations will generally divide the control's
963 * reported count by the Effective Resolution Multiplier, designers
964 * should take care not to establish a potential Effective
965 * Resolution Multiplier of zero."
966 * HID Usage Table, v1.12, Section 4.3.1, p31
967 */
968 if (lmax - lmin == 0)
969 return 1;
970 /*
971 * Handling the unit exponent is left as an exercise to whoever
972 * finds a device where that exponent is not 0.
973 */
974 m = ((v - lmin)/(lmax - lmin) * (pmax - pmin) + pmin);
975 if (unlikely(multiplier->unit_exponent != 0)) {
976 hid_warn(hid,
977 "unsupported Resolution Multiplier unit exponent %d\n",
978 multiplier->unit_exponent);
979 }
980
981 /* There are no devices with an effective multiplier > 255 */
982 if (unlikely(m == 0 || m > 255 || m < -255)) {
983 hid_warn(hid, "unsupported Resolution Multiplier %d\n", m);
984 m = 1;
985 }
986
987 return m;
988}
989
990static void hid_apply_multiplier_to_field(struct hid_device *hid,
991 struct hid_field *field,
992 struct hid_collection *multiplier_collection,
993 int effective_multiplier)
994{
995 struct hid_collection *collection;
996 struct hid_usage *usage;
997 int i;
998
999 /*
1000 * If multiplier_collection is NULL, the multiplier applies
1001 * to all fields in the report.
1002 * Otherwise, it is the Logical Collection the multiplier applies to
1003 * but our field may be in a subcollection of that collection.
1004 */
1005 for (i = 0; i < field->maxusage; i++) {
1006 usage = &field->usage[i];
1007
1008 collection = &hid->collection[usage->collection_index];
1009 while (collection && collection != multiplier_collection)
1010 collection = collection->parent;
1011
1012 if (collection || multiplier_collection == NULL)
1013 usage->resolution_multiplier = effective_multiplier;
1014
1015 }
1016}
1017
1018static void hid_apply_multiplier(struct hid_device *hid,
1019 struct hid_field *multiplier)
1020{
1021 struct hid_report_enum *rep_enum;
1022 struct hid_report *rep;
1023 struct hid_field *field;
1024 struct hid_collection *multiplier_collection;
1025 int effective_multiplier;
1026 int i;
1027
1028 /*
1029 * "The Resolution Multiplier control must be contained in the same
1030 * Logical Collection as the control(s) to which it is to be applied.
1031 * If no Resolution Multiplier is defined, then the Resolution
1032 * Multiplier defaults to 1. If more than one control exists in a
1033 * Logical Collection, the Resolution Multiplier is associated with
1034 * all controls in the collection. If no Logical Collection is
1035 * defined, the Resolution Multiplier is associated with all
1036 * controls in the report."
1037 * HID Usage Table, v1.12, Section 4.3.1, p30
1038 *
1039 * Thus, search from the current collection upwards until we find a
1040 * logical collection. Then search all fields for that same parent
1041 * collection. Those are the fields the multiplier applies to.
1042 *
1043 * If we have more than one multiplier, it will overwrite the
1044 * applicable fields later.
1045 */
1046 multiplier_collection = &hid->collection[multiplier->usage->collection_index];
1047 while (multiplier_collection &&
1048 multiplier_collection->type != HID_COLLECTION_LOGICAL)
1049 multiplier_collection = multiplier_collection->parent;
1050
1051 effective_multiplier = hid_calculate_multiplier(hid, multiplier);
1052
1053 rep_enum = &hid->report_enum[HID_INPUT_REPORT];
1054 list_for_each_entry(rep, &rep_enum->report_list, list) {
1055 for (i = 0; i < rep->maxfield; i++) {
1056 field = rep->field[i];
1057 hid_apply_multiplier_to_field(hid, field,
1058 multiplier_collection,
1059 effective_multiplier);
1060 }
1061 }
1062}
1063
1064/*
1065 * hid_setup_resolution_multiplier - set up all resolution multipliers
1066 *
1067 * @device: hid device
1068 *
1069 * Search for all Resolution Multiplier Feature Reports and apply their
1070 * value to all matching Input items. This only updates the internal struct
1071 * fields.
1072 *
1073 * The Resolution Multiplier is applied by the hardware. If the multiplier
1074 * is anything other than 1, the hardware will send pre-multiplied events
1075 * so that the same physical interaction generates an accumulated
1076 * accumulated_value = value * * multiplier
1077 * This may be achieved by sending
1078 * - "value * multiplier" for each event, or
1079 * - "value" but "multiplier" times as frequently, or
1080 * - a combination of the above
1081 * The only guarantee is that the same physical interaction always generates
1082 * an accumulated 'value * multiplier'.
1083 *
1084 * This function must be called before any event processing and after
1085 * any SetRequest to the Resolution Multiplier.
1086 */
1087void hid_setup_resolution_multiplier(struct hid_device *hid)
1088{
1089 struct hid_report_enum *rep_enum;
1090 struct hid_report *rep;
1091 struct hid_usage *usage;
1092 int i, j;
1093
1094 rep_enum = &hid->report_enum[HID_FEATURE_REPORT];
1095 list_for_each_entry(rep, &rep_enum->report_list, list) {
1096 for (i = 0; i < rep->maxfield; i++) {
1097 /* Ignore if report count is out of bounds. */
1098 if (rep->field[i]->report_count < 1)
1099 continue;
1100
1101 for (j = 0; j < rep->field[i]->maxusage; j++) {
1102 usage = &rep->field[i]->usage[j];
1103 if (usage->hid == HID_GD_RESOLUTION_MULTIPLIER)
1104 hid_apply_multiplier(hid,
1105 rep->field[i]);
1106 }
1107 }
1108 }
1109}
1110EXPORT_SYMBOL_GPL(hid_setup_resolution_multiplier);
1111
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001112/**
1113 * hid_open_report - open a driver-specific device report
1114 *
1115 * @device: hid device
1116 *
Jiri Kosinadde58452006-12-08 18:40:44 +01001117 * Parse a report description into a hid_device structure. Reports are
1118 * enumerated, fields are attached to these reports.
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001119 * 0 returned on success, otherwise nonzero error value.
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001120 *
1121 * This function (or the equivalent hid_parse() macro) should only be
1122 * called from probe() in drivers, before starting the device.
Jiri Kosinadde58452006-12-08 18:40:44 +01001123 */
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001124int hid_open_report(struct hid_device *device)
Jiri Kosinadde58452006-12-08 18:40:44 +01001125{
Jiri Kosinadde58452006-12-08 18:40:44 +01001126 struct hid_parser *parser;
1127 struct hid_item item;
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001128 unsigned int size;
1129 __u8 *start;
Kevin Daughtridge86e6b772012-09-20 12:00:32 -07001130 __u8 *buf;
Jiri Kosinadde58452006-12-08 18:40:44 +01001131 __u8 *end;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001132 int ret;
Jiri Kosinadde58452006-12-08 18:40:44 +01001133 static int (*dispatch_type[])(struct hid_parser *parser,
1134 struct hid_item *item) = {
1135 hid_parser_main,
1136 hid_parser_global,
1137 hid_parser_local,
1138 hid_parser_reserved
1139 };
1140
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001141 if (WARN_ON(device->status & HID_STAT_PARSED))
1142 return -EBUSY;
1143
1144 start = device->dev_rdesc;
1145 if (WARN_ON(!start))
1146 return -ENODEV;
1147 size = device->dev_rsize;
1148
Kevin Daughtridge86e6b772012-09-20 12:00:32 -07001149 buf = kmemdup(start, size, GFP_KERNEL);
1150 if (buf == NULL)
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001151 return -ENOMEM;
Kevin Daughtridge86e6b772012-09-20 12:00:32 -07001152
1153 if (device->driver->report_fixup)
1154 start = device->driver->report_fixup(device, buf, &size);
1155 else
1156 start = buf;
1157
1158 start = kmemdup(start, size, GFP_KERNEL);
1159 kfree(buf);
1160 if (start == NULL)
1161 return -ENOMEM;
1162
1163 device->rdesc = start;
Jiri Kosinadde58452006-12-08 18:40:44 +01001164 device->rsize = size;
1165
Joe Perchesfe258022010-12-09 19:29:04 -08001166 parser = vzalloc(sizeof(struct hid_parser));
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001167 if (!parser) {
1168 ret = -ENOMEM;
Gustavo A. R. Silvab034ed52018-08-29 10:22:09 -05001169 goto alloc_err;
Jiri Kosinadde58452006-12-08 18:40:44 +01001170 }
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001171
Jiri Kosinadde58452006-12-08 18:40:44 +01001172 parser->device = device;
1173
1174 end = start + size;
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001175
1176 device->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
1177 sizeof(struct hid_collection), GFP_KERNEL);
1178 if (!device->collection) {
1179 ret = -ENOMEM;
1180 goto err;
1181 }
1182 device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
1183
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001184 ret = -EINVAL;
Jiri Kosinadde58452006-12-08 18:40:44 +01001185 while ((start = fetch_item(start, end, &item)) != NULL) {
1186
1187 if (item.format != HID_ITEM_FORMAT_SHORT) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001188 hid_err(device, "unexpected long global item\n");
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001189 goto err;
Jiri Kosinadde58452006-12-08 18:40:44 +01001190 }
1191
1192 if (dispatch_type[item.type](parser, &item)) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001193 hid_err(device, "item %u %u %u %u parsing failed\n",
Joe Perches4291ee32010-12-09 19:29:03 -08001194 item.format, (unsigned)item.size,
1195 (unsigned)item.type, (unsigned)item.tag);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001196 goto err;
Jiri Kosinadde58452006-12-08 18:40:44 +01001197 }
1198
1199 if (start == end) {
1200 if (parser->collection_stack_ptr) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001201 hid_err(device, "unbalanced collection at end of report description\n");
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001202 goto err;
Jiri Kosinadde58452006-12-08 18:40:44 +01001203 }
1204 if (parser->local.delimiter_depth) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001205 hid_err(device, "unbalanced delimiter at end of report description\n");
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001206 goto err;
Jiri Kosinadde58452006-12-08 18:40:44 +01001207 }
Peter Hutterer5a4abb32018-12-05 10:42:23 +10001208
1209 /*
1210 * fetch initial values in case the device's
1211 * default multiplier isn't the recommended 1
1212 */
1213 hid_setup_resolution_multiplier(device);
1214
Stefan Agnerb2dd9f22018-08-28 13:29:54 +02001215 kfree(parser->collection_stack);
Jiri Kosina47a80ed2007-03-12 14:55:12 +01001216 vfree(parser);
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001217 device->status |= HID_STAT_PARSED;
Peter Hutterer5a4abb32018-12-05 10:42:23 +10001218
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001219 return 0;
Jiri Kosinadde58452006-12-08 18:40:44 +01001220 }
1221 }
1222
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001223 hid_err(device, "item fetching failed at offset %d\n", (int)(end - start));
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001224err:
Stefan Agnerb2dd9f22018-08-28 13:29:54 +02001225 kfree(parser->collection_stack);
Gustavo A. R. Silvab034ed52018-08-29 10:22:09 -05001226alloc_err:
Jiri Kosina47a80ed2007-03-12 14:55:12 +01001227 vfree(parser);
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001228 hid_close_report(device);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001229 return ret;
Jiri Kosinadde58452006-12-08 18:40:44 +01001230}
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02001231EXPORT_SYMBOL_GPL(hid_open_report);
Jiri Kosinadde58452006-12-08 18:40:44 +01001232
1233/*
1234 * Convert a signed n-bit integer to signed 32-bit integer. Common
1235 * cases are done through the compiler, the screwed things has to be
1236 * done by hand.
1237 */
1238
1239static s32 snto32(__u32 value, unsigned n)
1240{
1241 switch (n) {
Jiri Slaby880d29f2008-06-18 23:55:41 +02001242 case 8: return ((__s8)value);
1243 case 16: return ((__s16)value);
1244 case 32: return ((__s32)value);
Jiri Kosinadde58452006-12-08 18:40:44 +01001245 }
Andy Shevchenko08585e42017-06-13 12:22:22 +03001246 return value & (1 << (n - 1)) ? value | (~0U << n) : value;
Jiri Kosinadde58452006-12-08 18:40:44 +01001247}
1248
Benjamin Tissoires77463832012-11-14 16:59:15 +01001249s32 hid_snto32(__u32 value, unsigned n)
1250{
1251 return snto32(value, n);
1252}
1253EXPORT_SYMBOL_GPL(hid_snto32);
1254
Jiri Kosinadde58452006-12-08 18:40:44 +01001255/*
1256 * Convert a signed 32-bit integer to a signed n-bit integer.
1257 */
1258
1259static u32 s32ton(__s32 value, unsigned n)
1260{
1261 s32 a = value >> (n - 1);
1262 if (a && a != -1)
1263 return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1;
1264 return value & ((1 << n) - 1);
1265}
1266
1267/*
1268 * Extract/implement a data field from/to a little endian report (bit array).
1269 *
1270 * Code sort-of follows HID spec:
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001271 * http://www.usb.org/developers/hidpage/HID1_11.pdf
Jiri Kosinadde58452006-12-08 18:40:44 +01001272 *
1273 * While the USB HID spec allows unlimited length bit fields in "report
1274 * descriptors", most devices never use more than 16 bits.
1275 * One model of UPS is claimed to report "LINEV" as a 32-bit field.
1276 * Search linux-kernel and linux-usb-devel archives for "hid-core extract".
1277 */
1278
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001279static u32 __extract(u8 *report, unsigned offset, int n)
Jiri Kosinadde58452006-12-08 18:40:44 +01001280{
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001281 unsigned int idx = offset / 8;
1282 unsigned int bit_nr = 0;
1283 unsigned int bit_shift = offset % 8;
1284 int bits_to_copy = 8 - bit_shift;
1285 u32 value = 0;
1286 u32 mask = n < 32 ? (1U << n) - 1 : ~0U;
Jiri Kosinadde58452006-12-08 18:40:44 +01001287
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001288 while (n > 0) {
1289 value |= ((u32)report[idx] >> bit_shift) << bit_nr;
1290 n -= bits_to_copy;
1291 bit_nr += bits_to_copy;
1292 bits_to_copy = 8;
1293 bit_shift = 0;
1294 idx++;
1295 }
1296
1297 return value & mask;
1298}
1299
1300u32 hid_field_extract(const struct hid_device *hid, u8 *report,
1301 unsigned offset, unsigned n)
1302{
1303 if (n > 32) {
Goffredo Baroncelli04fba782015-05-30 11:00:26 +02001304 hid_warn(hid, "hid_field_extract() called with n (%d) > 32! (%s)\n",
Joe Perches4291ee32010-12-09 19:29:03 -08001305 n, current->comm);
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001306 n = 32;
1307 }
Jiri Kosinadde58452006-12-08 18:40:44 +01001308
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001309 return __extract(report, offset, n);
Jiri Kosinadde58452006-12-08 18:40:44 +01001310}
Goffredo Baroncelli04fba782015-05-30 11:00:26 +02001311EXPORT_SYMBOL_GPL(hid_field_extract);
Jiri Kosinadde58452006-12-08 18:40:44 +01001312
1313/*
1314 * "implement" : set bits in a little endian bit stream.
1315 * Same concepts as "extract" (see comments above).
1316 * The data mangled in the bit stream remains in little endian
1317 * order the whole time. It make more sense to talk about
1318 * endianness of register values by considering a register
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001319 * a "cached" copy of the little endian bit stream.
Jiri Kosinadde58452006-12-08 18:40:44 +01001320 */
Jiri Kosinadde58452006-12-08 18:40:44 +01001321
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001322static void __implement(u8 *report, unsigned offset, int n, u32 value)
1323{
1324 unsigned int idx = offset / 8;
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001325 unsigned int bit_shift = offset % 8;
1326 int bits_to_set = 8 - bit_shift;
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001327
1328 while (n - bits_to_set >= 0) {
Dmitry Torokhov95d1c892016-04-06 10:19:58 -07001329 report[idx] &= ~(0xff << bit_shift);
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001330 report[idx] |= value << bit_shift;
1331 value >>= bits_to_set;
1332 n -= bits_to_set;
1333 bits_to_set = 8;
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001334 bit_shift = 0;
1335 idx++;
1336 }
1337
1338 /* last nibble */
1339 if (n) {
Dmitry Torokhov95d1c892016-04-06 10:19:58 -07001340 u8 bit_mask = ((1U << n) - 1);
1341 report[idx] &= ~(bit_mask << bit_shift);
1342 report[idx] |= value << bit_shift;
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001343 }
1344}
1345
1346static void implement(const struct hid_device *hid, u8 *report,
1347 unsigned offset, unsigned n, u32 value)
1348{
Dmitry Torokhov95d1c892016-04-06 10:19:58 -07001349 if (unlikely(n > 32)) {
Joe Perches4291ee32010-12-09 19:29:03 -08001350 hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n",
1351 __func__, n, current->comm);
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001352 n = 32;
Dmitry Torokhov95d1c892016-04-06 10:19:58 -07001353 } else if (n < 32) {
1354 u32 m = (1U << n) - 1;
Jiri Kosinadde58452006-12-08 18:40:44 +01001355
Dmitry Torokhov95d1c892016-04-06 10:19:58 -07001356 if (unlikely(value > m)) {
1357 hid_warn(hid,
1358 "%s() called with too large value %d (n: %d)! (%s)\n",
1359 __func__, value, n, current->comm);
1360 WARN_ON(1);
1361 value &= m;
1362 }
1363 }
Jiri Kosinadde58452006-12-08 18:40:44 +01001364
Dmitry Torokhov5137b3542016-01-18 22:40:37 -08001365 __implement(report, offset, n, value);
Jiri Kosinadde58452006-12-08 18:40:44 +01001366}
1367
1368/*
1369 * Search an array for a value.
1370 */
1371
Joe Perches16ee4cc2010-12-09 19:29:05 -08001372static int search(__s32 *array, __s32 value, unsigned n)
Jiri Kosinadde58452006-12-08 18:40:44 +01001373{
1374 while (n--) {
1375 if (*array++ == value)
1376 return 0;
1377 }
1378 return -1;
1379}
1380
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001381/**
1382 * hid_match_report - check if driver's raw_event should be called
1383 *
1384 * @hid: hid device
1385 * @report_type: type to match against
1386 *
1387 * compare hid->driver->report_table->report_type to report->type
1388 */
1389static int hid_match_report(struct hid_device *hid, struct hid_report *report)
Jiri Kosinadde58452006-12-08 18:40:44 +01001390{
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001391 const struct hid_report_id *id = hid->driver->report_table;
1392
1393 if (!id) /* NULL means all */
1394 return 1;
1395
1396 for (; id->report_type != HID_TERMINATOR; id++)
1397 if (id->report_type == HID_ANY_ID ||
1398 id->report_type == report->type)
1399 return 1;
1400 return 0;
1401}
1402
1403/**
1404 * hid_match_usage - check if driver's event should be called
1405 *
1406 * @hid: hid device
1407 * @usage: usage to match against
1408 *
1409 * compare hid->driver->usage_table->usage_{type,code} to
1410 * usage->usage_{type,code}
1411 */
1412static int hid_match_usage(struct hid_device *hid, struct hid_usage *usage)
1413{
1414 const struct hid_usage_id *id = hid->driver->usage_table;
1415
1416 if (!id) /* NULL means all */
1417 return 1;
1418
1419 for (; id->usage_type != HID_ANY_ID - 1; id++)
1420 if ((id->usage_hid == HID_ANY_ID ||
1421 id->usage_hid == usage->hid) &&
1422 (id->usage_type == HID_ANY_ID ||
1423 id->usage_type == usage->type) &&
1424 (id->usage_code == HID_ANY_ID ||
1425 id->usage_code == usage->code))
1426 return 1;
1427 return 0;
1428}
1429
1430static void hid_process_event(struct hid_device *hid, struct hid_field *field,
1431 struct hid_usage *usage, __s32 value, int interrupt)
1432{
1433 struct hid_driver *hdrv = hid->driver;
1434 int ret;
1435
Henrik Rydberg9bfc8da2012-09-01 21:47:11 +02001436 if (!list_empty(&hid->debug_list))
1437 hid_dump_input(hid, usage, value);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001438
1439 if (hdrv && hdrv->event && hid_match_usage(hid, usage)) {
1440 ret = hdrv->event(hid, field, usage, value);
1441 if (ret != 0) {
1442 if (ret < 0)
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001443 hid_err(hid, "%s's event failed with %d\n",
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001444 hdrv->name, ret);
1445 return;
1446 }
1447 }
1448
Jiri Kosinadde58452006-12-08 18:40:44 +01001449 if (hid->claimed & HID_CLAIMED_INPUT)
1450 hidinput_hid_event(hid, field, usage, value);
Jiri Kosinaaa938f72006-12-08 18:41:10 +01001451 if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event)
1452 hid->hiddev_hid_event(hid, field, usage, value);
Jiri Kosinadde58452006-12-08 18:40:44 +01001453}
1454
1455/*
1456 * Analyse a received field, and fetch the data from it. The field
1457 * content is stored for next report processing (we do differential
1458 * reporting to the layer).
1459 */
1460
Adrian Bunkabdff0f2008-03-31 01:53:56 +02001461static void hid_input_field(struct hid_device *hid, struct hid_field *field,
1462 __u8 *data, int interrupt)
Jiri Kosinadde58452006-12-08 18:40:44 +01001463{
1464 unsigned n;
1465 unsigned count = field->report_count;
1466 unsigned offset = field->report_offset;
1467 unsigned size = field->report_size;
1468 __s32 min = field->logical_minimum;
1469 __s32 max = field->logical_maximum;
1470 __s32 *value;
1471
Kees Cook6da2ec52018-06-12 13:55:00 -07001472 value = kmalloc_array(count, sizeof(__s32), GFP_ATOMIC);
Joe Perchesa3789a12010-12-09 19:29:07 -08001473 if (!value)
Jiri Kosinadde58452006-12-08 18:40:44 +01001474 return;
1475
1476 for (n = 0; n < count; n++) {
1477
Joe Perches4291ee32010-12-09 19:29:03 -08001478 value[n] = min < 0 ?
Goffredo Baroncelli04fba782015-05-30 11:00:26 +02001479 snto32(hid_field_extract(hid, data, offset + n * size,
1480 size), size) :
1481 hid_field_extract(hid, data, offset + n * size, size);
Jiri Kosinadde58452006-12-08 18:40:44 +01001482
Joe Perches4291ee32010-12-09 19:29:03 -08001483 /* Ignore report if ErrorRollOver */
1484 if (!(field->flags & HID_MAIN_ITEM_VARIABLE) &&
1485 value[n] >= min && value[n] <= max &&
Benjamin Tissoires50220de2016-01-19 12:34:58 +01001486 value[n] - min < field->maxusage &&
Joe Perches4291ee32010-12-09 19:29:03 -08001487 field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1)
1488 goto exit;
Jiri Kosinadde58452006-12-08 18:40:44 +01001489 }
1490
1491 for (n = 0; n < count; n++) {
1492
1493 if (HID_MAIN_ITEM_VARIABLE & field->flags) {
1494 hid_process_event(hid, field, &field->usage[n], value[n], interrupt);
1495 continue;
1496 }
1497
1498 if (field->value[n] >= min && field->value[n] <= max
Benjamin Tissoires50220de2016-01-19 12:34:58 +01001499 && field->value[n] - min < field->maxusage
Jiri Kosinadde58452006-12-08 18:40:44 +01001500 && field->usage[field->value[n] - min].hid
1501 && search(value, field->value[n], count))
1502 hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt);
1503
1504 if (value[n] >= min && value[n] <= max
Benjamin Tissoires50220de2016-01-19 12:34:58 +01001505 && value[n] - min < field->maxusage
Jiri Kosinadde58452006-12-08 18:40:44 +01001506 && field->usage[value[n] - min].hid
1507 && search(field->value, value[n], count))
1508 hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt);
1509 }
1510
1511 memcpy(field->value, value, count * sizeof(__s32));
1512exit:
1513 kfree(value);
1514}
Jiri Kosinadde58452006-12-08 18:40:44 +01001515
1516/*
1517 * Output the field into the report.
1518 */
1519
Joe Perches4291ee32010-12-09 19:29:03 -08001520static void hid_output_field(const struct hid_device *hid,
1521 struct hid_field *field, __u8 *data)
Jiri Kosinadde58452006-12-08 18:40:44 +01001522{
1523 unsigned count = field->report_count;
1524 unsigned offset = field->report_offset;
1525 unsigned size = field->report_size;
1526 unsigned n;
1527
1528 for (n = 0; n < count; n++) {
1529 if (field->logical_minimum < 0) /* signed values */
Joe Perches4291ee32010-12-09 19:29:03 -08001530 implement(hid, data, offset + n * size, size,
1531 s32ton(field->value[n], size));
Jiri Kosinadde58452006-12-08 18:40:44 +01001532 else /* unsigned values */
Joe Perches4291ee32010-12-09 19:29:03 -08001533 implement(hid, data, offset + n * size, size,
1534 field->value[n]);
Jiri Kosinadde58452006-12-08 18:40:44 +01001535 }
1536}
1537
1538/*
Jiri Kosina27ce4052013-07-10 19:56:27 +02001539 * Create a report. 'data' has to be allocated using
1540 * hid_alloc_report_buf() so that it has proper size.
Jiri Kosinadde58452006-12-08 18:40:44 +01001541 */
1542
Jiri Kosina229695e2006-12-08 18:40:53 +01001543void hid_output_report(struct hid_report *report, __u8 *data)
Jiri Kosinadde58452006-12-08 18:40:44 +01001544{
1545 unsigned n;
1546
1547 if (report->id > 0)
1548 *data++ = report->id;
1549
Pete Zaitcev75c28df2010-04-12 12:16:11 -06001550 memset(data, 0, ((report->size - 1) >> 3) + 1);
Jiri Kosinadde58452006-12-08 18:40:44 +01001551 for (n = 0; n < report->maxfield; n++)
Joe Perches4291ee32010-12-09 19:29:03 -08001552 hid_output_field(report->device, report->field[n], data);
Jiri Kosinadde58452006-12-08 18:40:44 +01001553}
Jiri Kosina229695e2006-12-08 18:40:53 +01001554EXPORT_SYMBOL_GPL(hid_output_report);
Jiri Kosinadde58452006-12-08 18:40:44 +01001555
1556/*
Jiri Kosina27ce4052013-07-10 19:56:27 +02001557 * Allocator for buffer that is going to be passed to hid_output_report()
1558 */
1559u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags)
1560{
1561 /*
1562 * 7 extra bytes are necessary to achieve proper functionality
1563 * of implement() working on 8 byte chunks
1564 */
1565
Aaron Ma6de0b132018-01-08 10:41:41 +08001566 u32 len = hid_report_len(report) + 7;
Jiri Kosina27ce4052013-07-10 19:56:27 +02001567
1568 return kmalloc(len, flags);
1569}
1570EXPORT_SYMBOL_GPL(hid_alloc_report_buf);
1571
1572/*
Jiri Kosinadde58452006-12-08 18:40:44 +01001573 * Set a field value. The report this field belongs to has to be
1574 * created and transferred to the device, to set this value in the
1575 * device.
1576 */
1577
1578int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
1579{
Kees Cookbe67b682013-08-28 22:32:01 +02001580 unsigned size;
1581
1582 if (!field)
1583 return -1;
1584
1585 size = field->report_size;
Jiri Kosinadde58452006-12-08 18:40:44 +01001586
Jiri Kosinacd667ce2009-06-12 15:20:57 +02001587 hid_dump_input(field->report->device, field->usage + offset, value);
Jiri Kosinadde58452006-12-08 18:40:44 +01001588
1589 if (offset >= field->report_count) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001590 hid_err(field->report->device, "offset (%d) exceeds report_count (%d)\n",
1591 offset, field->report_count);
Jiri Kosinadde58452006-12-08 18:40:44 +01001592 return -1;
1593 }
1594 if (field->logical_minimum < 0) {
1595 if (value != snto32(s32ton(value, size), size)) {
Jiri Kosina8c3d52f2011-12-15 11:00:38 +01001596 hid_err(field->report->device, "value %d is out of range\n", value);
Jiri Kosinadde58452006-12-08 18:40:44 +01001597 return -1;
1598 }
1599 }
1600 field->value[offset] = value;
1601 return 0;
1602}
Jiri Kosina229695e2006-12-08 18:40:53 +01001603EXPORT_SYMBOL_GPL(hid_set_field);
Jiri Kosinadde58452006-12-08 18:40:44 +01001604
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001605static struct hid_report *hid_get_report(struct hid_report_enum *report_enum,
1606 const u8 *data)
1607{
1608 struct hid_report *report;
1609 unsigned int n = 0; /* Normally report number is 0 */
1610
1611 /* Device uses numbered reports, data[0] is report number */
1612 if (report_enum->numbered)
1613 n = *data;
1614
1615 report = report_enum->report_id_hash[n];
1616 if (report == NULL)
1617 dbg_hid("undefined report_id %u received\n", n);
1618
1619 return report;
1620}
1621
Benjamin Tissoires4fa5a7f2014-02-10 12:58:48 -05001622/*
1623 * Implement a generic .request() callback, using .raw_request()
1624 * DO NOT USE in hid drivers directly, but through hid_hw_request instead.
1625 */
1626void __hid_request(struct hid_device *hid, struct hid_report *report,
1627 int reqtype)
1628{
1629 char *buf;
1630 int ret;
Aaron Ma6de0b132018-01-08 10:41:41 +08001631 u32 len;
Benjamin Tissoires4fa5a7f2014-02-10 12:58:48 -05001632
Benjamin Tissoires4fa5a7f2014-02-10 12:58:48 -05001633 buf = hid_alloc_report_buf(report, GFP_KERNEL);
1634 if (!buf)
1635 return;
1636
1637 len = hid_report_len(report);
1638
1639 if (reqtype == HID_REQ_SET_REPORT)
1640 hid_output_report(report, buf);
1641
1642 ret = hid->ll_driver->raw_request(hid, report->id, buf, len,
1643 report->type, reqtype);
1644 if (ret < 0) {
1645 dbg_hid("unable to complete request: %d\n", ret);
1646 goto out;
1647 }
1648
1649 if (reqtype == HID_REQ_GET_REPORT)
1650 hid_input_report(hid, report->type, buf, ret, 0);
1651
1652out:
1653 kfree(buf);
1654}
1655EXPORT_SYMBOL_GPL(__hid_request);
1656
Aaron Ma6de0b132018-01-08 10:41:41 +08001657int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, u32 size,
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001658 int interrupt)
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001659{
1660 struct hid_report_enum *report_enum = hid->report_enum + type;
1661 struct hid_report *report;
Benjamin Tissoires6d85d032013-01-31 17:22:23 +01001662 struct hid_driver *hdrv;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001663 unsigned int a;
Aaron Ma6de0b132018-01-08 10:41:41 +08001664 u32 rsize, csize = size;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001665 u8 *cdata = data;
Jiri Kosinab6787242012-04-27 00:56:08 +02001666 int ret = 0;
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001667
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001668 report = hid_get_report(report_enum, data);
1669 if (!report)
Jiri Kosinab6787242012-04-27 00:56:08 +02001670 goto out;
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001671
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001672 if (report_enum->numbered) {
1673 cdata++;
1674 csize--;
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001675 }
1676
1677 rsize = ((report->size - 1) >> 3) + 1;
1678
Armando Visconti966922f2011-05-19 21:41:22 +02001679 if (rsize > HID_MAX_BUFFER_SIZE)
1680 rsize = HID_MAX_BUFFER_SIZE;
1681
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001682 if (csize < rsize) {
1683 dbg_hid("report %d is too short, (%d < %d)\n", report->id,
1684 csize, rsize);
1685 memset(cdata + csize, 0, rsize - csize);
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001686 }
1687
1688 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
1689 hid->hiddev_report_event(hid, report);
Jiri Kosinab6787242012-04-27 00:56:08 +02001690 if (hid->claimed & HID_CLAIMED_HIDRAW) {
1691 ret = hidraw_report_event(hid, data, size);
1692 if (ret)
1693 goto out;
1694 }
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001695
Benjamin Tissoirescc6b54a2013-09-11 21:56:57 +02001696 if (hid->claimed != HID_CLAIMED_HIDRAW && report->maxfield) {
Matthieu CASTETb94e3c92012-06-28 16:53:11 +02001697 for (a = 0; a < report->maxfield; a++)
1698 hid_input_field(hid, report->field[a], cdata, interrupt);
Benjamin Tissoires6d85d032013-01-31 17:22:23 +01001699 hdrv = hid->driver;
1700 if (hdrv && hdrv->report)
1701 hdrv->report(hid, report);
Matthieu CASTETb94e3c92012-06-28 16:53:11 +02001702 }
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001703
1704 if (hid->claimed & HID_CLAIMED_INPUT)
1705 hidinput_report_event(hid, report);
Jiri Kosinab6787242012-04-27 00:56:08 +02001706out:
1707 return ret;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001708}
1709EXPORT_SYMBOL_GPL(hid_report_raw_event);
1710
1711/**
1712 * hid_input_report - report data from lower layer (usb, bt...)
1713 *
1714 * @hid: hid device
1715 * @type: HID report type (HID_*_REPORT)
1716 * @data: report contents
1717 * @size: size of data parameter
Jiri Kosinaff9b00a2009-10-01 16:03:13 +02001718 * @interrupt: distinguish between interrupt and control transfers
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001719 *
1720 * This is data entry for lower layers.
1721 */
Aaron Ma6de0b132018-01-08 10:41:41 +08001722int hid_input_report(struct hid_device *hid, int type, u8 *data, u32 size, int interrupt)
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001723{
Julia Lawall76c317d2009-07-19 17:26:13 +02001724 struct hid_report_enum *report_enum;
1725 struct hid_driver *hdrv;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001726 struct hid_report *report;
Jiri Kosina45dc1ac2011-08-10 14:02:59 +02001727 int ret = 0;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001728
David Herrmann4ea54542011-08-10 14:02:07 +02001729 if (!hid)
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001730 return -ENODEV;
David Herrmann4ea54542011-08-10 14:02:07 +02001731
Andrew de los Reyesc849a612013-02-18 09:20:21 -08001732 if (down_trylock(&hid->driver_input_lock))
David Herrmann4ea54542011-08-10 14:02:07 +02001733 return -EBUSY;
1734
1735 if (!hid->driver) {
1736 ret = -ENODEV;
1737 goto unlock;
1738 }
Julia Lawall76c317d2009-07-19 17:26:13 +02001739 report_enum = hid->report_enum + type;
1740 hdrv = hid->driver;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001741
1742 if (!size) {
1743 dbg_hid("empty report\n");
David Herrmann4ea54542011-08-10 14:02:07 +02001744 ret = -1;
1745 goto unlock;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001746 }
1747
Matthieu CASTETb94e3c92012-06-28 16:53:11 +02001748 /* Avoid unnecessary overhead if debugfs is disabled */
Benjamin Tissoiresa5f04b92013-04-17 19:38:13 +02001749 if (!list_empty(&hid->debug_list))
1750 hid_dump_report(hid, type, data, size);
Matthieu CASTETb94e3c92012-06-28 16:53:11 +02001751
Jiri Kosinaf77e3472010-03-18 14:11:53 +01001752 report = hid_get_report(report_enum, data);
1753
David Herrmann4ea54542011-08-10 14:02:07 +02001754 if (!report) {
1755 ret = -1;
1756 goto unlock;
1757 }
Jiri Kosinaf77e3472010-03-18 14:11:53 +01001758
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001759 if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) {
1760 ret = hdrv->raw_event(hid, report, data, size);
Felix Rueegg556483e2013-10-08 19:33:47 +02001761 if (ret < 0)
David Herrmann4ea54542011-08-10 14:02:07 +02001762 goto unlock;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02001763 }
1764
Jiri Kosinab6787242012-04-27 00:56:08 +02001765 ret = hid_report_raw_event(hid, type, data, size, interrupt);
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001766
David Herrmann4ea54542011-08-10 14:02:07 +02001767unlock:
Andrew de los Reyesc849a612013-02-18 09:20:21 -08001768 up(&hid->driver_input_lock);
Jiri Kosina45dc1ac2011-08-10 14:02:59 +02001769 return ret;
Jiri Kosinaaa8de2f2006-12-08 18:41:17 +01001770}
1771EXPORT_SYMBOL_GPL(hid_input_report);
1772
Benjamin Tissoiresd5d3e202017-11-20 11:48:41 +01001773bool hid_match_one_id(const struct hid_device *hdev,
1774 const struct hid_device_id *id)
Jiri Kosina0f37cd02008-08-20 19:13:52 +02001775{
Henrik Rydberg7431fb72012-04-23 12:07:04 +02001776 return (id->bus == HID_BUS_ANY || id->bus == hdev->bus) &&
Henrik Rydberg4d53b802012-04-23 12:07:02 +02001777 (id->group == HID_GROUP_ANY || id->group == hdev->group) &&
Jiri Kosina0f37cd02008-08-20 19:13:52 +02001778 (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
1779 (id->product == HID_ANY_ID || id->product == hdev->product);
1780}
1781
Benjamin Tissoiresd5d3e202017-11-20 11:48:41 +01001782const struct hid_device_id *hid_match_id(const struct hid_device *hdev,
Jiri Kosina0f37cd02008-08-20 19:13:52 +02001783 const struct hid_device_id *id)
1784{
1785 for (; id->bus; id++)
1786 if (hid_match_one_id(hdev, id))
1787 return id;
1788
1789 return NULL;
1790}
1791
1792static const struct hid_device_id hid_hiddev_list[] = {
Richard Hughesc0bd6a42008-08-27 11:19:37 +02001793 { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS) },
1794 { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1) },
Jiri Kosina0f37cd02008-08-20 19:13:52 +02001795 { }
1796};
1797
1798static bool hid_hiddev(struct hid_device *hdev)
1799{
1800 return !!hid_match_id(hdev, hid_hiddev_list);
1801}
1802
Alan Ott6d3bfb72011-01-23 22:50:18 -05001803
1804static ssize_t
1805read_report_descriptor(struct file *filp, struct kobject *kobj,
1806 struct bin_attribute *attr,
1807 char *buf, loff_t off, size_t count)
1808{
Geliang Tang2cf83832015-12-27 17:25:24 +08001809 struct device *dev = kobj_to_dev(kobj);
Geliang Tangee79a8f2015-12-27 17:25:21 +08001810 struct hid_device *hdev = to_hid_device(dev);
Alan Ott6d3bfb72011-01-23 22:50:18 -05001811
1812 if (off >= hdev->rsize)
1813 return 0;
1814
1815 if (off + count > hdev->rsize)
1816 count = hdev->rsize - off;
1817
1818 memcpy(buf, hdev->rdesc + off, count);
1819
1820 return count;
1821}
1822
Olivier Gaya8774172015-02-17 14:00:03 +01001823static ssize_t
1824show_country(struct device *dev, struct device_attribute *attr,
1825 char *buf)
1826{
Geliang Tangee79a8f2015-12-27 17:25:21 +08001827 struct hid_device *hdev = to_hid_device(dev);
Olivier Gaya8774172015-02-17 14:00:03 +01001828
1829 return sprintf(buf, "%02x\n", hdev->country & 0xff);
1830}
1831
Alan Ott6d3bfb72011-01-23 22:50:18 -05001832static struct bin_attribute dev_bin_attr_report_desc = {
1833 .attr = { .name = "report_descriptor", .mode = 0444 },
1834 .read = read_report_descriptor,
1835 .size = HID_MAX_DESCRIPTOR_SIZE,
1836};
1837
Bhumika Goyalad8378e2017-08-21 17:13:09 +05301838static const struct device_attribute dev_attr_country = {
Olivier Gaya8774172015-02-17 14:00:03 +01001839 .attr = { .name = "country", .mode = 0444 },
1840 .show = show_country,
1841};
1842
Jiri Slaby93c10132008-06-27 00:04:24 +02001843int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
1844{
1845 static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
1846 "Joystick", "Gamepad", "Keyboard", "Keypad",
1847 "Multi-Axis Controller"
1848 };
1849 const char *type, *bus;
Richard Purdie79b568b2015-09-18 16:31:33 -07001850 char buf[64] = "";
Jiri Slaby93c10132008-06-27 00:04:24 +02001851 unsigned int i;
1852 int len;
Alan Ott6d3bfb72011-01-23 22:50:18 -05001853 int ret;
Jiri Slaby93c10132008-06-27 00:04:24 +02001854
Bastien Nocerab5e5a372010-04-16 17:19:50 +01001855 if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
1856 connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
Daniel Mack3a343ee2010-07-12 19:28:27 +02001857 if (hdev->quirks & HID_QUIRK_HIDINPUT_FORCE)
1858 connect_mask |= HID_CONNECT_HIDINPUT_FORCE;
Jiri Slaby93c10132008-06-27 00:04:24 +02001859 if (hdev->bus != BUS_USB)
1860 connect_mask &= ~HID_CONNECT_HIDDEV;
Jiri Kosina0f37cd02008-08-20 19:13:52 +02001861 if (hid_hiddev(hdev))
1862 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
Jiri Slaby93c10132008-06-27 00:04:24 +02001863
1864 if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
1865 connect_mask & HID_CONNECT_HIDINPUT_FORCE))
1866 hdev->claimed |= HID_CLAIMED_INPUT;
Benjamin Tissoiresb77c3922011-09-21 16:56:54 +02001867
Jiri Slaby93c10132008-06-27 00:04:24 +02001868 if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect &&
1869 !hdev->hiddev_connect(hdev,
1870 connect_mask & HID_CONNECT_HIDDEV_FORCE))
1871 hdev->claimed |= HID_CLAIMED_HIDDEV;
1872 if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev))
1873 hdev->claimed |= HID_CLAIMED_HIDRAW;
1874
Benjamin Tissoires7704ac92014-09-23 12:08:08 -04001875 if (connect_mask & HID_CONNECT_DRIVER)
1876 hdev->claimed |= HID_CLAIMED_DRIVER;
1877
David Herrmann4bc19f62012-07-20 11:49:09 +02001878 /* Drivers with the ->raw_event callback set are not required to connect
1879 * to any other listener. */
1880 if (!hdev->claimed && !hdev->driver->raw_event) {
1881 hid_err(hdev, "device has no listeners, quitting\n");
Jiri Slaby93c10132008-06-27 00:04:24 +02001882 return -ENODEV;
1883 }
1884
1885 if ((hdev->claimed & HID_CLAIMED_INPUT) &&
1886 (connect_mask & HID_CONNECT_FF) && hdev->ff_init)
1887 hdev->ff_init(hdev);
1888
1889 len = 0;
1890 if (hdev->claimed & HID_CLAIMED_INPUT)
1891 len += sprintf(buf + len, "input");
1892 if (hdev->claimed & HID_CLAIMED_HIDDEV)
1893 len += sprintf(buf + len, "%shiddev%d", len ? "," : "",
Jaejoong Kim733aca92017-03-03 17:54:01 +09001894 ((struct hiddev *)hdev->hiddev)->minor);
Jiri Slaby93c10132008-06-27 00:04:24 +02001895 if (hdev->claimed & HID_CLAIMED_HIDRAW)
1896 len += sprintf(buf + len, "%shidraw%d", len ? "," : "",
1897 ((struct hidraw *)hdev->hidraw)->minor);
1898
1899 type = "Device";
1900 for (i = 0; i < hdev->maxcollection; i++) {
1901 struct hid_collection *col = &hdev->collection[i];
1902 if (col->type == HID_COLLECTION_APPLICATION &&
1903 (col->usage & HID_USAGE_PAGE) == HID_UP_GENDESK &&
1904 (col->usage & 0xffff) < ARRAY_SIZE(types)) {
1905 type = types[col->usage & 0xffff];
1906 break;
1907 }
1908 }
1909
1910 switch (hdev->bus) {
1911 case BUS_USB:
1912 bus = "USB";
1913 break;
1914 case BUS_BLUETOOTH:
1915 bus = "BLUETOOTH";
1916 break;
Daniel Martin067807272015-09-17 17:02:22 +02001917 case BUS_I2C:
1918 bus = "I2C";
1919 break;
Jiri Slaby93c10132008-06-27 00:04:24 +02001920 default:
1921 bus = "<UNKNOWN>";
1922 }
1923
Olivier Gaya8774172015-02-17 14:00:03 +01001924 ret = device_create_file(&hdev->dev, &dev_attr_country);
1925 if (ret)
1926 hid_warn(hdev,
1927 "can't create sysfs country code attribute err: %d\n", ret);
1928
Joe Perches4291ee32010-12-09 19:29:03 -08001929 hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
1930 buf, bus, hdev->version >> 8, hdev->version & 0xff,
1931 type, hdev->name, hdev->phys);
Jiri Slaby93c10132008-06-27 00:04:24 +02001932
1933 return 0;
1934}
1935EXPORT_SYMBOL_GPL(hid_connect);
1936
Jiri Kosinac4c259b2009-09-15 16:27:45 +02001937void hid_disconnect(struct hid_device *hdev)
1938{
Olivier Gaya8774172015-02-17 14:00:03 +01001939 device_remove_file(&hdev->dev, &dev_attr_country);
Jiri Kosinac4c259b2009-09-15 16:27:45 +02001940 if (hdev->claimed & HID_CLAIMED_INPUT)
1941 hidinput_disconnect(hdev);
1942 if (hdev->claimed & HID_CLAIMED_HIDDEV)
1943 hdev->hiddev_disconnect(hdev);
1944 if (hdev->claimed & HID_CLAIMED_HIDRAW)
1945 hidraw_disconnect(hdev);
Benjamin Tissoires9c5c6ed2014-11-03 15:33:32 -05001946 hdev->claimed = 0;
Jiri Kosinac4c259b2009-09-15 16:27:45 +02001947}
1948EXPORT_SYMBOL_GPL(hid_disconnect);
1949
Dmitry Torokhovaaac0822017-06-06 23:59:34 -07001950/**
1951 * hid_hw_start - start underlying HW
1952 * @hdev: hid device
1953 * @connect_mask: which outputs to connect, see HID_CONNECT_*
1954 *
1955 * Call this in probe function *after* hid_parse. This will setup HW
1956 * buffers and start the device (if not defeirred to device open).
1957 * hid_hw_stop must be called if this was successful.
1958 */
1959int hid_hw_start(struct hid_device *hdev, unsigned int connect_mask)
1960{
1961 int error;
1962
1963 error = hdev->ll_driver->start(hdev);
1964 if (error)
1965 return error;
1966
1967 if (connect_mask) {
1968 error = hid_connect(hdev, connect_mask);
1969 if (error) {
1970 hdev->ll_driver->stop(hdev);
1971 return error;
1972 }
1973 }
1974
1975 return 0;
1976}
1977EXPORT_SYMBOL_GPL(hid_hw_start);
1978
1979/**
1980 * hid_hw_stop - stop underlying HW
1981 * @hdev: hid device
1982 *
1983 * This is usually called from remove function or from probe when something
1984 * failed and hid_hw_start was called already.
1985 */
1986void hid_hw_stop(struct hid_device *hdev)
1987{
1988 hid_disconnect(hdev);
1989 hdev->ll_driver->stop(hdev);
1990}
1991EXPORT_SYMBOL_GPL(hid_hw_stop);
1992
1993/**
1994 * hid_hw_open - signal underlying HW to start delivering events
1995 * @hdev: hid device
1996 *
1997 * Tell underlying HW to start delivering events from the device.
1998 * This function should be called sometime after successful call
Hisao Tanabed6c70a82018-05-05 17:41:13 +09001999 * to hid_hw_start().
Dmitry Torokhovaaac0822017-06-06 23:59:34 -07002000 */
2001int hid_hw_open(struct hid_device *hdev)
2002{
2003 int ret;
2004
2005 ret = mutex_lock_killable(&hdev->ll_open_lock);
2006 if (ret)
2007 return ret;
2008
2009 if (!hdev->ll_open_count++) {
2010 ret = hdev->ll_driver->open(hdev);
2011 if (ret)
2012 hdev->ll_open_count--;
2013 }
2014
2015 mutex_unlock(&hdev->ll_open_lock);
2016 return ret;
2017}
2018EXPORT_SYMBOL_GPL(hid_hw_open);
2019
2020/**
2021 * hid_hw_close - signal underlaying HW to stop delivering events
2022 *
2023 * @hdev: hid device
2024 *
2025 * This function indicates that we are not interested in the events
2026 * from this device anymore. Delivery of events may or may not stop,
2027 * depending on the number of users still outstanding.
2028 */
2029void hid_hw_close(struct hid_device *hdev)
2030{
2031 mutex_lock(&hdev->ll_open_lock);
2032 if (!--hdev->ll_open_count)
2033 hdev->ll_driver->close(hdev);
2034 mutex_unlock(&hdev->ll_open_lock);
2035}
2036EXPORT_SYMBOL_GPL(hid_hw_close);
2037
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002038struct hid_dynid {
2039 struct list_head list;
2040 struct hid_device_id id;
2041};
2042
2043/**
2044 * store_new_id - add a new HID device ID to this driver and re-probe devices
2045 * @driver: target device driver
2046 * @buf: buffer for scanning device ID data
2047 * @count: input size
2048 *
2049 * Adds a new dynamic hid device ID to this driver,
2050 * and causes the driver to probe for all devices again.
2051 */
Greg Kroah-Hartmanc2810322017-06-09 11:03:04 +02002052static ssize_t new_id_store(struct device_driver *drv, const char *buf,
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002053 size_t count)
2054{
Geliang Tangba91a962015-12-27 17:25:22 +08002055 struct hid_driver *hdrv = to_hid_driver(drv);
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002056 struct hid_dynid *dynid;
2057 __u32 bus, vendor, product;
2058 unsigned long driver_data = 0;
2059 int ret;
2060
2061 ret = sscanf(buf, "%x %x %x %lx",
2062 &bus, &vendor, &product, &driver_data);
2063 if (ret < 3)
2064 return -EINVAL;
2065
2066 dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
2067 if (!dynid)
2068 return -ENOMEM;
2069
2070 dynid->id.bus = bus;
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002071 dynid->id.group = HID_GROUP_ANY;
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002072 dynid->id.vendor = vendor;
2073 dynid->id.product = product;
2074 dynid->id.driver_data = driver_data;
2075
2076 spin_lock(&hdrv->dyn_lock);
2077 list_add_tail(&dynid->list, &hdrv->dyn_list);
2078 spin_unlock(&hdrv->dyn_lock);
2079
Alan Sterncef9bc52012-01-24 13:34:41 -05002080 ret = driver_attach(&hdrv->driver);
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002081
2082 return ret ? : count;
2083}
Greg Kroah-Hartmanc2810322017-06-09 11:03:04 +02002084static DRIVER_ATTR_WO(new_id);
2085
2086static struct attribute *hid_drv_attrs[] = {
2087 &driver_attr_new_id.attr,
2088 NULL,
2089};
2090ATTRIBUTE_GROUPS(hid_drv);
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002091
2092static void hid_free_dynids(struct hid_driver *hdrv)
2093{
2094 struct hid_dynid *dynid, *n;
2095
2096 spin_lock(&hdrv->dyn_lock);
2097 list_for_each_entry_safe(dynid, n, &hdrv->dyn_list, list) {
2098 list_del(&dynid->list);
2099 kfree(dynid);
2100 }
2101 spin_unlock(&hdrv->dyn_lock);
2102}
2103
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002104const struct hid_device_id *hid_match_device(struct hid_device *hdev,
2105 struct hid_driver *hdrv)
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002106{
2107 struct hid_dynid *dynid;
2108
2109 spin_lock(&hdrv->dyn_lock);
2110 list_for_each_entry(dynid, &hdrv->dyn_list, list) {
2111 if (hid_match_one_id(hdev, &dynid->id)) {
2112 spin_unlock(&hdrv->dyn_lock);
2113 return &dynid->id;
2114 }
2115 }
2116 spin_unlock(&hdrv->dyn_lock);
2117
2118 return hid_match_id(hdev, hdrv->id_table);
2119}
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002120EXPORT_SYMBOL_GPL(hid_match_device);
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002121
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002122static int hid_bus_match(struct device *dev, struct device_driver *drv)
2123{
Geliang Tangba91a962015-12-27 17:25:22 +08002124 struct hid_driver *hdrv = to_hid_driver(drv);
Geliang Tangee79a8f2015-12-27 17:25:21 +08002125 struct hid_device *hdev = to_hid_device(dev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002126
Henrik Rydberg070748e2012-04-23 12:07:05 +02002127 return hid_match_device(hdev, hdrv) != NULL;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002128}
2129
Daniel M. Lambea1a8861f2018-07-17 22:35:36 +01002130/**
2131 * hid_compare_device_paths - check if both devices share the same path
2132 * @hdev_a: hid device
2133 * @hdev_b: hid device
2134 * @separator: char to use as separator
2135 *
2136 * Check if two devices share the same path up to the last occurrence of
2137 * the separator char. Both paths must exist (i.e., zero-length paths
2138 * don't match).
2139 */
2140bool hid_compare_device_paths(struct hid_device *hdev_a,
2141 struct hid_device *hdev_b, char separator)
2142{
2143 int n1 = strrchr(hdev_a->phys, separator) - hdev_a->phys;
2144 int n2 = strrchr(hdev_b->phys, separator) - hdev_b->phys;
2145
2146 if (n1 != n2 || n1 <= 0 || n2 <= 0)
2147 return false;
2148
2149 return !strncmp(hdev_a->phys, hdev_b->phys, n1);
2150}
2151EXPORT_SYMBOL_GPL(hid_compare_device_paths);
2152
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002153static int hid_device_probe(struct device *dev)
2154{
Geliang Tangba91a962015-12-27 17:25:22 +08002155 struct hid_driver *hdrv = to_hid_driver(dev->driver);
Geliang Tangee79a8f2015-12-27 17:25:21 +08002156 struct hid_device *hdev = to_hid_device(dev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002157 const struct hid_device_id *id;
2158 int ret = 0;
2159
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002160 if (down_interruptible(&hdev->driver_input_lock)) {
2161 ret = -EINTR;
Binoy Jayan6f68f0a2017-06-14 12:59:51 +05302162 goto end;
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002163 }
2164 hdev->io_started = false;
David Herrmann4ea54542011-08-10 14:02:07 +02002165
Benjamin Tissoires8f732852018-05-31 13:49:29 +02002166 clear_bit(ffs(HID_STAT_REPROBED), &hdev->status);
2167
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002168 if (!hdev->driver) {
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002169 id = hid_match_device(hdev, hdrv);
Dan Carpenterba623a72011-08-24 14:27:46 +03002170 if (id == NULL) {
Henrik Rydberg4fa3a582012-05-01 08:40:01 +02002171 ret = -ENODEV;
2172 goto unlock;
Dan Carpenterba623a72011-08-24 14:27:46 +03002173 }
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002174
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002175 if (hdrv->match) {
2176 if (!hdrv->match(hdev, hid_ignore_special_drivers)) {
2177 ret = -ENODEV;
2178 goto unlock;
2179 }
2180 } else {
2181 /*
2182 * hid-generic implements .match(), so if
2183 * hid_ignore_special_drivers is set, we can safely
2184 * return.
2185 */
2186 if (hid_ignore_special_drivers) {
2187 ret = -ENODEV;
2188 goto unlock;
2189 }
2190 }
2191
Benjamin Tissoires2904e682018-03-20 12:04:51 +01002192 /* reset the quirks that has been previously set */
2193 hdev->quirks = hid_lookup_quirk(hdev);
Jiri Slabyc500c972008-05-16 11:49:16 +02002194 hdev->driver = hdrv;
2195 if (hdrv->probe) {
2196 ret = hdrv->probe(hdev, id);
2197 } else { /* default probe */
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002198 ret = hid_open_report(hdev);
Jiri Slabyc500c972008-05-16 11:49:16 +02002199 if (!ret)
Jiri Slaby93c10132008-06-27 00:04:24 +02002200 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002201 }
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002202 if (ret) {
2203 hid_close_report(hdev);
Jiri Slabyc500c972008-05-16 11:49:16 +02002204 hdev->driver = NULL;
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002205 }
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002206 }
Dan Carpenterba623a72011-08-24 14:27:46 +03002207unlock:
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002208 if (!hdev->io_started)
2209 up(&hdev->driver_input_lock);
Binoy Jayan6f68f0a2017-06-14 12:59:51 +05302210end:
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002211 return ret;
2212}
2213
2214static int hid_device_remove(struct device *dev)
2215{
Geliang Tangee79a8f2015-12-27 17:25:21 +08002216 struct hid_device *hdev = to_hid_device(dev);
David Herrmann4ea54542011-08-10 14:02:07 +02002217 struct hid_driver *hdrv;
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002218 int ret = 0;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002219
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002220 if (down_interruptible(&hdev->driver_input_lock)) {
2221 ret = -EINTR;
Binoy Jayan6f68f0a2017-06-14 12:59:51 +05302222 goto end;
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002223 }
2224 hdev->io_started = false;
David Herrmann4ea54542011-08-10 14:02:07 +02002225
2226 hdrv = hdev->driver;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002227 if (hdrv) {
2228 if (hdrv->remove)
2229 hdrv->remove(hdev);
Jiri Slabyc500c972008-05-16 11:49:16 +02002230 else /* default remove */
2231 hid_hw_stop(hdev);
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002232 hid_close_report(hdev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002233 hdev->driver = NULL;
2234 }
2235
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002236 if (!hdev->io_started)
2237 up(&hdev->driver_input_lock);
Binoy Jayan6f68f0a2017-06-14 12:59:51 +05302238end:
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002239 return ret;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002240}
2241
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002242static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
2243 char *buf)
2244{
2245 struct hid_device *hdev = container_of(dev, struct hid_device, dev);
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002246
Rasmus Villemoesdfa0c5f2015-11-14 22:08:08 +01002247 return scnprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
2248 hdev->bus, hdev->group, hdev->vendor, hdev->product);
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002249}
Greg Kroah-Hartman0d4260e2013-08-23 14:24:38 -07002250static DEVICE_ATTR_RO(modalias);
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002251
Greg Kroah-Hartman0d4260e2013-08-23 14:24:38 -07002252static struct attribute *hid_dev_attrs[] = {
2253 &dev_attr_modalias.attr,
2254 NULL,
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002255};
Andy Lutomirski54f32fd2015-11-19 08:19:31 -08002256static struct bin_attribute *hid_dev_bin_attrs[] = {
2257 &dev_bin_attr_report_desc,
2258 NULL
2259};
2260static const struct attribute_group hid_dev_group = {
2261 .attrs = hid_dev_attrs,
2262 .bin_attrs = hid_dev_bin_attrs,
2263};
2264__ATTRIBUTE_GROUPS(hid_dev);
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002265
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002266static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
2267{
Dennis Chend193c162017-01-19 06:32:10 -05002268 struct hid_device *hdev = to_hid_device(dev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002269
2270 if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X",
2271 hdev->bus, hdev->vendor, hdev->product))
2272 return -ENOMEM;
2273
2274 if (add_uevent_var(env, "HID_NAME=%s", hdev->name))
2275 return -ENOMEM;
2276
2277 if (add_uevent_var(env, "HID_PHYS=%s", hdev->phys))
2278 return -ENOMEM;
2279
2280 if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq))
2281 return -ENOMEM;
2282
Henrik Rydberg4d53b802012-04-23 12:07:02 +02002283 if (add_uevent_var(env, "MODALIAS=hid:b%04Xg%04Xv%08Xp%08X",
2284 hdev->bus, hdev->group, hdev->vendor, hdev->product))
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002285 return -ENOMEM;
2286
2287 return 0;
2288}
2289
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002290struct bus_type hid_bus_type = {
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002291 .name = "hid",
Greg Kroah-Hartman0d4260e2013-08-23 14:24:38 -07002292 .dev_groups = hid_dev_groups,
Greg Kroah-Hartmanc2810322017-06-09 11:03:04 +02002293 .drv_groups = hid_drv_groups,
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002294 .match = hid_bus_match,
2295 .probe = hid_device_probe,
2296 .remove = hid_device_remove,
2297 .uevent = hid_uevent,
2298};
Benjamin Tissoiresd5d3e202017-11-20 11:48:41 +01002299EXPORT_SYMBOL(hid_bus_type);
Jiri Slabyd458a9d2008-05-16 11:49:20 +02002300
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002301int hid_add_device(struct hid_device *hdev)
2302{
2303 static atomic_t id = ATOMIC_INIT(0);
2304 int ret;
2305
2306 if (WARN_ON(hdev->status & HID_STAT_ADDED))
2307 return -EBUSY;
2308
Benjamin Tissoiresd5d3e202017-11-20 11:48:41 +01002309 hdev->quirks = hid_lookup_quirk(hdev);
2310
Jiri Slabyd458a9d2008-05-16 11:49:20 +02002311 /* we need to kill them here, otherwise they will stay allocated to
2312 * wait for coming driver */
Lamarque V. Souza4529eef2012-12-06 12:39:55 -02002313 if (hid_ignore(hdev))
Jiri Slabyd458a9d2008-05-16 11:49:20 +02002314 return -ENODEV;
2315
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002316 /*
Benjamin Tissoires3c867262014-02-20 15:24:49 -05002317 * Check for the mandatory transport channel.
2318 */
2319 if (!hdev->ll_driver->raw_request) {
2320 hid_err(hdev, "transport driver missing .raw_request()\n");
2321 return -EINVAL;
2322 }
2323
2324 /*
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002325 * Read the device report descriptor once and use as template
2326 * for the driver-specific modifications.
2327 */
2328 ret = hdev->ll_driver->parse(hdev);
2329 if (ret)
2330 return ret;
2331 if (!hdev->dev_rdesc)
2332 return -ENODEV;
2333
Henrik Rydberg734c6602012-04-23 12:07:03 +02002334 /*
2335 * Scan generic devices for group information
2336 */
Benjamin Tissoires4392bf32016-02-12 17:10:37 +01002337 if (hid_ignore_special_drivers) {
2338 hdev->group = HID_GROUP_GENERIC;
2339 } else if (!hdev->group &&
Benjamin Tissoires6e65d9d2017-11-20 11:48:42 +01002340 !(hdev->quirks & HID_QUIRK_HAVE_SPECIAL_DRIVER)) {
Henrik Rydberg734c6602012-04-23 12:07:03 +02002341 ret = hid_scan_report(hdev);
2342 if (ret)
2343 hid_warn(hdev, "bad device descriptor (%d)\n", ret);
2344 }
2345
Kay Sievers6bbe5862008-10-31 00:12:32 +01002346 /* XXX hack, any other cleaner solution after the driver core
2347 * is converted to allow more than 20 bytes as the device name? */
2348 dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
2349 hdev->vendor, hdev->product, atomic_inc_return(&id));
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002350
Bruno Prémont4da361b2010-03-15 14:55:40 +01002351 hid_debug_register(hdev, dev_name(&hdev->dev));
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002352 ret = device_add(&hdev->dev);
2353 if (!ret)
2354 hdev->status |= HID_STAT_ADDED;
Bruno Prémont4da361b2010-03-15 14:55:40 +01002355 else
2356 hid_debug_unregister(hdev);
Jiri Kosinaa635f9d2009-06-12 15:20:55 +02002357
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002358 return ret;
2359}
2360EXPORT_SYMBOL_GPL(hid_add_device);
2361
2362/**
2363 * hid_allocate_device - allocate new hid device descriptor
2364 *
2365 * Allocate and initialize hid device, so that hid_destroy_device might be
2366 * used to free it.
2367 *
2368 * New hid_device pointer is returned on success, otherwise ERR_PTR encoded
2369 * error value.
2370 */
2371struct hid_device *hid_allocate_device(void)
2372{
2373 struct hid_device *hdev;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002374 int ret = -ENOMEM;
2375
2376 hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
2377 if (hdev == NULL)
2378 return ERR_PTR(ret);
2379
2380 device_initialize(&hdev->dev);
2381 hdev->dev.release = hid_device_release;
2382 hdev->dev.bus = &hid_bus_type;
Fu, Zhonghui64bebef2015-09-24 14:06:31 +08002383 device_enable_async_suspend(&hdev->dev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002384
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002385 hid_close_report(hdev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002386
Jiri Kosinacd667ce2009-06-12 15:20:57 +02002387 init_waitqueue_head(&hdev->debug_wait);
2388 INIT_LIST_HEAD(&hdev->debug_list);
Jiri Kosina1deb9d32013-05-06 13:05:50 +02002389 spin_lock_init(&hdev->debug_list_lock);
Andrew de los Reyesc849a612013-02-18 09:20:21 -08002390 sema_init(&hdev->driver_input_lock, 1);
Dmitry Torokhovaaac0822017-06-06 23:59:34 -07002391 mutex_init(&hdev->ll_open_lock);
Jiri Kosinacd667ce2009-06-12 15:20:57 +02002392
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002393 return hdev;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002394}
2395EXPORT_SYMBOL_GPL(hid_allocate_device);
2396
2397static void hid_remove_device(struct hid_device *hdev)
2398{
2399 if (hdev->status & HID_STAT_ADDED) {
2400 device_del(&hdev->dev);
Jiri Kosinaa635f9d2009-06-12 15:20:55 +02002401 hid_debug_unregister(hdev);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002402 hdev->status &= ~HID_STAT_ADDED;
2403 }
Henrik Rydberga7197c2e2012-04-22 14:21:40 +02002404 kfree(hdev->dev_rdesc);
2405 hdev->dev_rdesc = NULL;
2406 hdev->dev_rsize = 0;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002407}
2408
2409/**
2410 * hid_destroy_device - free previously allocated device
2411 *
2412 * @hdev: hid device
2413 *
2414 * If you allocate hid_device through hid_allocate_device, you should ever
2415 * free by this function.
2416 */
2417void hid_destroy_device(struct hid_device *hdev)
2418{
2419 hid_remove_device(hdev);
2420 put_device(&hdev->dev);
2421}
2422EXPORT_SYMBOL_GPL(hid_destroy_device);
2423
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002424
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002425static int __hid_bus_reprobe_drivers(struct device *dev, void *data)
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002426{
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002427 struct hid_driver *hdrv = data;
2428 struct hid_device *hdev = to_hid_device(dev);
2429
2430 if (hdev->driver == hdrv &&
Benjamin Tissoires8f732852018-05-31 13:49:29 +02002431 !hdrv->match(hdev, hid_ignore_special_drivers) &&
2432 !test_and_set_bit(ffs(HID_STAT_REPROBED), &hdev->status))
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002433 return device_reprobe(dev);
2434
2435 return 0;
2436}
2437
2438static int __hid_bus_driver_added(struct device_driver *drv, void *data)
2439{
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002440 struct hid_driver *hdrv = to_hid_driver(drv);
2441
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002442 if (hdrv->match) {
2443 bus_for_each_dev(&hid_bus_type, NULL, hdrv,
2444 __hid_bus_reprobe_drivers);
2445 }
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002446
2447 return 0;
2448}
2449
2450static int __bus_removed_driver(struct device_driver *drv, void *data)
2451{
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002452 return bus_rescan_devices(&hid_bus_type);
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002453}
2454
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002455int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
2456 const char *mod_name)
2457{
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002458 int ret;
2459
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002460 hdrv->driver.name = hdrv->name;
2461 hdrv->driver.bus = &hid_bus_type;
2462 hdrv->driver.owner = owner;
2463 hdrv->driver.mod_name = mod_name;
2464
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002465 INIT_LIST_HEAD(&hdrv->dyn_list);
2466 spin_lock_init(&hdrv->dyn_lock);
2467
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002468 ret = driver_register(&hdrv->driver);
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002469
Benjamin Tissoiresc17a7472017-12-08 15:29:44 +01002470 if (ret == 0)
2471 bus_for_each_drv(&hid_bus_type, NULL, NULL,
2472 __hid_bus_driver_added);
2473
2474 return ret;
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002475}
2476EXPORT_SYMBOL_GPL(__hid_register_driver);
2477
2478void hid_unregister_driver(struct hid_driver *hdrv)
2479{
2480 driver_unregister(&hdrv->driver);
Jiri Slaby3a6f82f2008-11-24 16:20:09 +01002481 hid_free_dynids(hdrv);
Benjamin Tissoirese04a0442017-11-20 11:48:44 +01002482
2483 bus_for_each_drv(&hid_bus_type, NULL, hdrv, __bus_removed_driver);
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002484}
2485EXPORT_SYMBOL_GPL(hid_unregister_driver);
2486
Oliver Neukum0361a282008-12-17 15:38:03 +01002487int hid_check_keys_pressed(struct hid_device *hid)
2488{
2489 struct hid_input *hidinput;
2490 int i;
2491
Jiri Kosinae5288eb2009-05-02 00:02:57 +02002492 if (!(hid->claimed & HID_CLAIMED_INPUT))
2493 return 0;
2494
Oliver Neukum0361a282008-12-17 15:38:03 +01002495 list_for_each_entry(hidinput, &hid->inputs, list) {
2496 for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++)
2497 if (hidinput->input->key[i])
2498 return 1;
2499 }
2500
2501 return 0;
2502}
2503
2504EXPORT_SYMBOL_GPL(hid_check_keys_pressed);
2505
Jiri Kosina86166b72007-05-14 09:57:40 +02002506static int __init hid_init(void)
2507{
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002508 int ret;
2509
Jiri Kosinaa635f9d2009-06-12 15:20:55 +02002510 if (hid_debug)
Joe Perches4291ee32010-12-09 19:29:03 -08002511 pr_warn("hid_debug is now used solely for parser and driver debugging.\n"
2512 "debugfs is now used for inspecting the device (report descriptor, reports)\n");
Jiri Kosinaa635f9d2009-06-12 15:20:55 +02002513
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002514 ret = bus_register(&hid_bus_type);
2515 if (ret) {
Joe Perches4291ee32010-12-09 19:29:03 -08002516 pr_err("can't register hid bus\n");
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002517 goto err;
2518 }
2519
2520 ret = hidraw_init();
2521 if (ret)
2522 goto err_bus;
2523
Jiri Kosinaa635f9d2009-06-12 15:20:55 +02002524 hid_debug_init();
2525
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002526 return 0;
2527err_bus:
2528 bus_unregister(&hid_bus_type);
2529err:
2530 return ret;
Jiri Kosina86166b72007-05-14 09:57:40 +02002531}
2532
2533static void __exit hid_exit(void)
2534{
Jiri Kosinaa635f9d2009-06-12 15:20:55 +02002535 hid_debug_exit();
Jiri Kosina86166b72007-05-14 09:57:40 +02002536 hidraw_exit();
Jiri Slaby85cdaf52008-05-16 11:49:15 +02002537 bus_unregister(&hid_bus_type);
Benjamin Tissoiresd5d3e202017-11-20 11:48:41 +01002538 hid_quirks_exit(HID_BUS_ANY);
Jiri Kosina86166b72007-05-14 09:57:40 +02002539}
2540
2541module_init(hid_init);
2542module_exit(hid_exit);
2543
Jiri Kosina88adb722009-10-02 18:29:34 +02002544MODULE_AUTHOR("Andreas Gal");
2545MODULE_AUTHOR("Vojtech Pavlik");
2546MODULE_AUTHOR("Jiri Kosina");
Grant Grundler7021b602017-01-05 11:07:04 -08002547MODULE_LICENSE("GPL");