Lines Matching refs:parser

122 static int open_collection(struct hid_parser *parser, unsigned type)  in open_collection()  argument
127 usage = parser->local.usage[0]; in open_collection()
129 if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) { in open_collection()
130 hid_err(parser->device, "collection stack overflow\n"); in open_collection()
134 if (parser->device->maxcollection == parser->device->collection_size) { in open_collection()
136 parser->device->collection_size * 2, GFP_KERNEL); in open_collection()
138 hid_err(parser->device, "failed to reallocate collection array\n"); in open_collection()
141 memcpy(collection, parser->device->collection, in open_collection()
143 parser->device->collection_size); in open_collection()
144 memset(collection + parser->device->collection_size, 0, in open_collection()
146 parser->device->collection_size); in open_collection()
147 kfree(parser->device->collection); in open_collection()
148 parser->device->collection = collection; in open_collection()
149 parser->device->collection_size *= 2; in open_collection()
152 parser->collection_stack[parser->collection_stack_ptr++] = in open_collection()
153 parser->device->maxcollection; in open_collection()
155 collection = parser->device->collection + in open_collection()
156 parser->device->maxcollection++; in open_collection()
159 collection->level = parser->collection_stack_ptr - 1; in open_collection()
162 parser->device->maxapplication++; in open_collection()
171 static int close_collection(struct hid_parser *parser) in close_collection() argument
173 if (!parser->collection_stack_ptr) { in close_collection()
174 hid_err(parser->device, "collection stack underflow\n"); in close_collection()
177 parser->collection_stack_ptr--; in close_collection()
186 static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type) in hid_lookup_collection() argument
188 struct hid_collection *collection = parser->device->collection; in hid_lookup_collection()
191 for (n = parser->collection_stack_ptr - 1; n >= 0; n--) { in hid_lookup_collection()
192 unsigned index = parser->collection_stack[n]; in hid_lookup_collection()
203 static int hid_add_usage(struct hid_parser *parser, unsigned usage) in hid_add_usage() argument
205 if (parser->local.usage_index >= HID_MAX_USAGES) { in hid_add_usage()
206 hid_err(parser->device, "usage index exceeded\n"); in hid_add_usage()
209 parser->local.usage[parser->local.usage_index] = usage; in hid_add_usage()
210 parser->local.collection_index[parser->local.usage_index] = in hid_add_usage()
211 parser->collection_stack_ptr ? in hid_add_usage()
212 parser->collection_stack[parser->collection_stack_ptr - 1] : 0; in hid_add_usage()
213 parser->local.usage_index++; in hid_add_usage()
221 static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsigned flags) in hid_add_field() argument
229 report = hid_register_report(parser->device, report_type, parser->global.report_id); in hid_add_field()
231 hid_err(parser->device, "hid_register_report failed\n"); in hid_add_field()
236 if ((parser->global.logical_minimum < 0 && in hid_add_field()
237 parser->global.logical_maximum < in hid_add_field()
238 parser->global.logical_minimum) || in hid_add_field()
239 (parser->global.logical_minimum >= 0 && in hid_add_field()
240 (__u32)parser->global.logical_maximum < in hid_add_field()
241 (__u32)parser->global.logical_minimum)) { in hid_add_field()
243 parser->global.logical_minimum, in hid_add_field()
244 parser->global.logical_maximum); in hid_add_field()
249 report->size += parser->global.report_size * parser->global.report_count; in hid_add_field()
251 if (!parser->local.usage_index) /* Ignore padding fields */ in hid_add_field()
254 usages = max_t(unsigned, parser->local.usage_index, in hid_add_field()
255 parser->global.report_count); in hid_add_field()
257 field = hid_register_field(report, usages, parser->global.report_count); in hid_add_field()
261 field->physical = hid_lookup_collection(parser, HID_COLLECTION_PHYSICAL); in hid_add_field()
262 field->logical = hid_lookup_collection(parser, HID_COLLECTION_LOGICAL); in hid_add_field()
263 field->application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION); in hid_add_field()
268 if (i >= parser->local.usage_index) in hid_add_field()
269 j = parser->local.usage_index - 1; in hid_add_field()
270 field->usage[i].hid = parser->local.usage[j]; in hid_add_field()
272 parser->local.collection_index[j]; in hid_add_field()
280 field->report_size = parser->global.report_size; in hid_add_field()
281 field->report_count = parser->global.report_count; in hid_add_field()
282 field->logical_minimum = parser->global.logical_minimum; in hid_add_field()
283 field->logical_maximum = parser->global.logical_maximum; in hid_add_field()
284 field->physical_minimum = parser->global.physical_minimum; in hid_add_field()
285 field->physical_maximum = parser->global.physical_maximum; in hid_add_field()
286 field->unit_exponent = parser->global.unit_exponent; in hid_add_field()
287 field->unit = parser->global.unit; in hid_add_field()
320 static int hid_parser_global(struct hid_parser *parser, struct hid_item *item) in hid_parser_global() argument
326 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) { in hid_parser_global()
327 hid_err(parser->device, "global environment stack overflow\n"); in hid_parser_global()
331 memcpy(parser->global_stack + parser->global_stack_ptr++, in hid_parser_global()
332 &parser->global, sizeof(struct hid_global)); in hid_parser_global()
337 if (!parser->global_stack_ptr) { in hid_parser_global()
338 hid_err(parser->device, "global environment stack underflow\n"); in hid_parser_global()
342 memcpy(&parser->global, parser->global_stack + in hid_parser_global()
343 --parser->global_stack_ptr, sizeof(struct hid_global)); in hid_parser_global()
347 parser->global.usage_page = item_udata(item); in hid_parser_global()
351 parser->global.logical_minimum = item_sdata(item); in hid_parser_global()
355 if (parser->global.logical_minimum < 0) in hid_parser_global()
356 parser->global.logical_maximum = item_sdata(item); in hid_parser_global()
358 parser->global.logical_maximum = item_udata(item); in hid_parser_global()
362 parser->global.physical_minimum = item_sdata(item); in hid_parser_global()
366 if (parser->global.physical_minimum < 0) in hid_parser_global()
367 parser->global.physical_maximum = item_sdata(item); in hid_parser_global()
369 parser->global.physical_maximum = item_udata(item); in hid_parser_global()
379 parser->global.unit_exponent = hid_snto32(raw_value, 4); in hid_parser_global()
381 parser->global.unit_exponent = raw_value; in hid_parser_global()
385 parser->global.unit = item_udata(item); in hid_parser_global()
389 parser->global.report_size = item_udata(item); in hid_parser_global()
390 if (parser->global.report_size > 128) { in hid_parser_global()
391 hid_err(parser->device, "invalid report_size %d\n", in hid_parser_global()
392 parser->global.report_size); in hid_parser_global()
398 parser->global.report_count = item_udata(item); in hid_parser_global()
399 if (parser->global.report_count > HID_MAX_USAGES) { in hid_parser_global()
400 hid_err(parser->device, "invalid report_count %d\n", in hid_parser_global()
401 parser->global.report_count); in hid_parser_global()
407 parser->global.report_id = item_udata(item); in hid_parser_global()
408 if (parser->global.report_id == 0 || in hid_parser_global()
409 parser->global.report_id >= HID_MAX_IDS) { in hid_parser_global()
410 hid_err(parser->device, "report_id %u is invalid\n", in hid_parser_global()
411 parser->global.report_id); in hid_parser_global()
417 hid_err(parser->device, "unknown global tag 0x%x\n", item->tag); in hid_parser_global()
426 static int hid_parser_local(struct hid_parser *parser, struct hid_item *item) in hid_parser_local() argument
444 if (parser->local.delimiter_depth != 0) { in hid_parser_local()
445 hid_err(parser->device, "nested delimiters\n"); in hid_parser_local()
448 parser->local.delimiter_depth++; in hid_parser_local()
449 parser->local.delimiter_branch++; in hid_parser_local()
451 if (parser->local.delimiter_depth < 1) { in hid_parser_local()
452 hid_err(parser->device, "bogus close delimiter\n"); in hid_parser_local()
455 parser->local.delimiter_depth--; in hid_parser_local()
461 if (parser->local.delimiter_branch > 1) { in hid_parser_local()
467 data = (parser->global.usage_page << 16) + data; in hid_parser_local()
469 return hid_add_usage(parser, data); in hid_parser_local()
473 if (parser->local.delimiter_branch > 1) { in hid_parser_local()
479 data = (parser->global.usage_page << 16) + data; in hid_parser_local()
481 parser->local.usage_minimum = data; in hid_parser_local()
486 if (parser->local.delimiter_branch > 1) { in hid_parser_local()
492 data = (parser->global.usage_page << 16) + data; in hid_parser_local()
494 count = data - parser->local.usage_minimum; in hid_parser_local()
495 if (count + parser->local.usage_index >= HID_MAX_USAGES) { in hid_parser_local()
500 if (dev_name(&parser->device->dev)) in hid_parser_local()
501 hid_warn(parser->device, in hid_parser_local()
503 data = HID_MAX_USAGES - parser->local.usage_index + in hid_parser_local()
504 parser->local.usage_minimum - 1; in hid_parser_local()
506 hid_err(parser->device, in hid_parser_local()
512 for (n = parser->local.usage_minimum; n <= data; n++) in hid_parser_local()
513 if (hid_add_usage(parser, n)) { in hid_parser_local()
531 static int hid_parser_main(struct hid_parser *parser, struct hid_item *item) in hid_parser_main() argument
540 ret = open_collection(parser, data & 0xff); in hid_parser_main()
543 ret = close_collection(parser); in hid_parser_main()
546 ret = hid_add_field(parser, HID_INPUT_REPORT, data); in hid_parser_main()
549 ret = hid_add_field(parser, HID_OUTPUT_REPORT, data); in hid_parser_main()
552 ret = hid_add_field(parser, HID_FEATURE_REPORT, data); in hid_parser_main()
555 hid_err(parser->device, "unknown main item tag 0x%x\n", item->tag); in hid_parser_main()
559 memset(&parser->local, 0, sizeof(parser->local)); /* Reset the local parser environment */ in hid_parser_main()
568 static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item) in hid_parser_reserved() argument
702 static void hid_scan_input_usage(struct hid_parser *parser, u32 usage) in hid_scan_input_usage() argument
704 struct hid_device *hid = parser->device; in hid_scan_input_usage()
710 static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage) in hid_scan_feature_usage() argument
712 if (usage == 0xff0000c5 && parser->global.report_count == 256 && in hid_scan_feature_usage()
713 parser->global.report_size == 8) in hid_scan_feature_usage()
714 parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8; in hid_scan_feature_usage()
717 static void hid_scan_collection(struct hid_parser *parser, unsigned type) in hid_scan_collection() argument
719 struct hid_device *hid = parser->device; in hid_scan_collection()
722 if (((parser->global.usage_page << 16) == HID_UP_SENSOR) && in hid_scan_collection()
735 if ((parser->global.usage_page << 16) == HID_UP_GENDESK) in hid_scan_collection()
736 for (i = 0; i < parser->local.usage_index; i++) in hid_scan_collection()
737 if (parser->local.usage[i] == HID_GD_POINTER) in hid_scan_collection()
738 parser->scan_flags |= HID_SCAN_FLAG_GD_POINTER; in hid_scan_collection()
740 if ((parser->global.usage_page << 16) >= HID_UP_MSVENDOR) in hid_scan_collection()
741 parser->scan_flags |= HID_SCAN_FLAG_VENDOR_SPECIFIC; in hid_scan_collection()
744 static int hid_scan_main(struct hid_parser *parser, struct hid_item *item) in hid_scan_main() argument
753 hid_scan_collection(parser, data & 0xff); in hid_scan_main()
761 for (i = 0; i < parser->local.usage_index; i++) in hid_scan_main()
762 hid_scan_input_usage(parser, parser->local.usage[i]); in hid_scan_main()
767 for (i = 0; i < parser->local.usage_index; i++) in hid_scan_main()
768 hid_scan_feature_usage(parser, parser->local.usage[i]); in hid_scan_main()
773 memset(&parser->local, 0, sizeof(parser->local)); in hid_scan_main()
785 struct hid_parser *parser; in hid_scan_report() local
789 static int (*dispatch_type[])(struct hid_parser *parser, in hid_scan_report()
797 parser = vzalloc(sizeof(struct hid_parser)); in hid_scan_report()
798 if (!parser) in hid_scan_report()
801 parser->device = hid; in hid_scan_report()
810 dispatch_type[item.type](parser, &item); in hid_scan_report()
815 if ((parser->scan_flags & HID_SCAN_FLAG_MT_WIN_8) && in hid_scan_report()
828 if ((parser->scan_flags & HID_SCAN_FLAG_VENDOR_SPECIFIC) in hid_scan_report()
829 && (parser->scan_flags & HID_SCAN_FLAG_GD_POINTER)) in hid_scan_report()
838 vfree(parser); in hid_scan_report()
944 struct hid_parser *parser; in hid_open_report() local
951 static int (*dispatch_type[])(struct hid_parser *parser, in hid_open_report()
984 parser = vzalloc(sizeof(struct hid_parser)); in hid_open_report()
985 if (!parser) { in hid_open_report()
990 parser->device = device; in hid_open_report()
1010 if (dispatch_type[item.type](parser, &item)) { in hid_open_report()
1018 if (parser->collection_stack_ptr) { in hid_open_report()
1022 if (parser->local.delimiter_depth) { in hid_open_report()
1026 vfree(parser); in hid_open_report()
1034 vfree(parser); in hid_open_report()