LCOV - code coverage report
Current view: top level - drivers/hid - hid-core.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 772 0.0 %
Date: 2014-02-18 Functions: 0 54 0.0 %
Branches: 0 692 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  HID support for Linux
       3                 :            :  *
       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
       7                 :            :  *  Copyright (c) 2006-2012 Jiri Kosina
       8                 :            :  */
       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                 :            : 
      17                 :            : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      18                 :            : 
      19                 :            : #include <linux/module.h>
      20                 :            : #include <linux/slab.h>
      21                 :            : #include <linux/init.h>
      22                 :            : #include <linux/kernel.h>
      23                 :            : #include <linux/list.h>
      24                 :            : #include <linux/mm.h>
      25                 :            : #include <linux/spinlock.h>
      26                 :            : #include <asm/unaligned.h>
      27                 :            : #include <asm/byteorder.h>
      28                 :            : #include <linux/input.h>
      29                 :            : #include <linux/wait.h>
      30                 :            : #include <linux/vmalloc.h>
      31                 :            : #include <linux/sched.h>
      32                 :            : #include <linux/semaphore.h>
      33                 :            : 
      34                 :            : #include <linux/hid.h>
      35                 :            : #include <linux/hiddev.h>
      36                 :            : #include <linux/hid-debug.h>
      37                 :            : #include <linux/hidraw.h>
      38                 :            : 
      39                 :            : #include "hid-ids.h"
      40                 :            : 
      41                 :            : /*
      42                 :            :  * Version Information
      43                 :            :  */
      44                 :            : 
      45                 :            : #define DRIVER_DESC "HID core driver"
      46                 :            : #define DRIVER_LICENSE "GPL"
      47                 :            : 
      48                 :            : int hid_debug = 0;
      49                 :            : module_param_named(debug, hid_debug, int, 0600);
      50                 :            : MODULE_PARM_DESC(debug, "toggle HID debugging messages");
      51                 :            : EXPORT_SYMBOL_GPL(hid_debug);
      52                 :            : 
      53                 :            : static int hid_ignore_special_drivers = 0;
      54                 :            : module_param_named(ignore_special_drivers, hid_ignore_special_drivers, int, 0600);
      55                 :            : MODULE_PARM_DESC(debug, "Ignore any special drivers and handle all devices by generic driver");
      56                 :            : 
      57                 :            : /*
      58                 :            :  * Register a new report for a device.
      59                 :            :  */
      60                 :            : 
      61                 :          0 : struct hid_report *hid_register_report(struct hid_device *device, unsigned type, unsigned id)
      62                 :            : {
      63                 :          0 :         struct hid_report_enum *report_enum = device->report_enum + type;
      64                 :            :         struct hid_report *report;
      65                 :            : 
      66         [ #  # ]:          0 :         if (id >= HID_MAX_IDS)
      67                 :            :                 return NULL;
      68         [ #  # ]:          0 :         if (report_enum->report_id_hash[id])
      69                 :            :                 return report_enum->report_id_hash[id];
      70                 :            : 
      71                 :            :         report = kzalloc(sizeof(struct hid_report), GFP_KERNEL);
      72         [ #  # ]:          0 :         if (!report)
      73                 :            :                 return NULL;
      74                 :            : 
      75         [ #  # ]:          0 :         if (id != 0)
      76                 :          0 :                 report_enum->numbered = 1;
      77                 :            : 
      78                 :          0 :         report->id = id;
      79                 :          0 :         report->type = type;
      80                 :          0 :         report->size = 0;
      81                 :          0 :         report->device = device;
      82                 :          0 :         report_enum->report_id_hash[id] = report;
      83                 :            : 
      84                 :          0 :         list_add_tail(&report->list, &report_enum->report_list);
      85                 :            : 
      86                 :          0 :         return report;
      87                 :            : }
      88                 :            : EXPORT_SYMBOL_GPL(hid_register_report);
      89                 :            : 
      90                 :            : /*
      91                 :            :  * Register a new field for this report.
      92                 :            :  */
      93                 :            : 
      94                 :          0 : static struct hid_field *hid_register_field(struct hid_report *report, unsigned usages, unsigned values)
      95                 :            : {
      96                 :            :         struct hid_field *field;
      97                 :            : 
      98         [ #  # ]:          0 :         if (report->maxfield == HID_MAX_FIELDS) {
      99                 :          0 :                 hid_err(report->device, "too many fields in report\n");
     100                 :          0 :                 return NULL;
     101                 :            :         }
     102                 :            : 
     103                 :          0 :         field = kzalloc((sizeof(struct hid_field) +
     104                 :          0 :                          usages * sizeof(struct hid_usage) +
     105                 :            :                          values * sizeof(unsigned)), GFP_KERNEL);
     106         [ #  # ]:          0 :         if (!field)
     107                 :            :                 return NULL;
     108                 :            : 
     109                 :          0 :         field->index = report->maxfield++;
     110                 :          0 :         report->field[field->index] = field;
     111                 :          0 :         field->usage = (struct hid_usage *)(field + 1);
     112                 :          0 :         field->value = (s32 *)(field->usage + usages);
     113                 :          0 :         field->report = report;
     114                 :            : 
     115                 :          0 :         return field;
     116                 :            : }
     117                 :            : 
     118                 :            : /*
     119                 :            :  * Open a collection. The type/usage is pushed on the stack.
     120                 :            :  */
     121                 :            : 
     122                 :          0 : static int open_collection(struct hid_parser *parser, unsigned type)
     123                 :            : {
     124                 :            :         struct hid_collection *collection;
     125                 :            :         unsigned usage;
     126                 :            : 
     127                 :          0 :         usage = parser->local.usage[0];
     128                 :            : 
     129         [ #  # ]:          0 :         if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) {
     130                 :          0 :                 hid_err(parser->device, "collection stack overflow\n");
     131                 :          0 :                 return -EINVAL;
     132                 :            :         }
     133                 :            : 
     134         [ #  # ]:          0 :         if (parser->device->maxcollection == parser->device->collection_size) {
     135                 :          0 :                 collection = kmalloc(sizeof(struct hid_collection) *
     136                 :            :                                 parser->device->collection_size * 2, GFP_KERNEL);
     137         [ #  # ]:          0 :                 if (collection == NULL) {
     138                 :          0 :                         hid_err(parser->device, "failed to reallocate collection array\n");
     139                 :          0 :                         return -ENOMEM;
     140                 :            :                 }
     141                 :          0 :                 memcpy(collection, parser->device->collection,
     142                 :            :                         sizeof(struct hid_collection) *
     143                 :          0 :                         parser->device->collection_size);
     144         [ #  # ]:          0 :                 memset(collection + parser->device->collection_size, 0,
     145                 :            :                         sizeof(struct hid_collection) *
     146                 :            :                         parser->device->collection_size);
     147                 :          0 :                 kfree(parser->device->collection);
     148                 :          0 :                 parser->device->collection = collection;
     149                 :          0 :                 parser->device->collection_size *= 2;
     150                 :            :         }
     151                 :            : 
     152                 :          0 :         parser->collection_stack[parser->collection_stack_ptr++] =
     153                 :          0 :                 parser->device->maxcollection;
     154                 :            : 
     155                 :          0 :         collection = parser->device->collection +
     156                 :          0 :                 parser->device->maxcollection++;
     157                 :          0 :         collection->type = type;
     158                 :          0 :         collection->usage = usage;
     159                 :          0 :         collection->level = parser->collection_stack_ptr - 1;
     160                 :            : 
     161         [ #  # ]:          0 :         if (type == HID_COLLECTION_APPLICATION)
     162                 :          0 :                 parser->device->maxapplication++;
     163                 :            : 
     164                 :            :         return 0;
     165                 :            : }
     166                 :            : 
     167                 :            : /*
     168                 :            :  * Close a collection.
     169                 :            :  */
     170                 :            : 
     171                 :            : static int close_collection(struct hid_parser *parser)
     172                 :            : {
     173         [ #  # ]:          0 :         if (!parser->collection_stack_ptr) {
     174                 :          0 :                 hid_err(parser->device, "collection stack underflow\n");
     175                 :            :                 return -EINVAL;
     176                 :            :         }
     177                 :          0 :         parser->collection_stack_ptr--;
     178                 :            :         return 0;
     179                 :            : }
     180                 :            : 
     181                 :            : /*
     182                 :            :  * Climb up the stack, search for the specified collection type
     183                 :            :  * and return the usage.
     184                 :            :  */
     185                 :            : 
     186                 :            : static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type)
     187                 :            : {
     188                 :          0 :         struct hid_collection *collection = parser->device->collection;
     189                 :            :         int n;
     190                 :            : 
     191 [ #  # ][ #  # ]:          0 :         for (n = parser->collection_stack_ptr - 1; n >= 0; n--) {
                 [ #  # ]
     192                 :          0 :                 unsigned index = parser->collection_stack[n];
     193 [ #  # ][ #  # ]:          0 :                 if (collection[index].type == type)
                 [ #  # ]
     194                 :          0 :                         return collection[index].usage;
     195                 :            :         }
     196                 :            :         return 0; /* we know nothing about this usage type */
     197                 :            : }
     198                 :            : 
     199                 :            : /*
     200                 :            :  * Add a usage to the temporary parser table.
     201                 :            :  */
     202                 :            : 
     203                 :          0 : static int hid_add_usage(struct hid_parser *parser, unsigned usage)
     204                 :            : {
     205         [ #  # ]:          0 :         if (parser->local.usage_index >= HID_MAX_USAGES) {
     206                 :          0 :                 hid_err(parser->device, "usage index exceeded\n");
     207                 :          0 :                 return -1;
     208                 :            :         }
     209                 :          0 :         parser->local.usage[parser->local.usage_index] = usage;
     210                 :          0 :         parser->local.collection_index[parser->local.usage_index] =
     211                 :          0 :                 parser->collection_stack_ptr ?
     212         [ #  # ]:          0 :                 parser->collection_stack[parser->collection_stack_ptr - 1] : 0;
     213                 :          0 :         parser->local.usage_index++;
     214                 :          0 :         return 0;
     215                 :            : }
     216                 :            : 
     217                 :            : /*
     218                 :            :  * Register a new field for this report.
     219                 :            :  */
     220                 :            : 
     221                 :          0 : static int hid_add_field(struct hid_parser *parser, unsigned report_type, unsigned flags)
     222                 :            : {
     223                 :            :         struct hid_report *report;
     224                 :            :         struct hid_field *field;
     225                 :            :         unsigned usages;
     226                 :            :         unsigned offset;
     227                 :            :         unsigned i;
     228                 :            : 
     229                 :          0 :         report = hid_register_report(parser->device, report_type, parser->global.report_id);
     230         [ #  # ]:          0 :         if (!report) {
     231                 :          0 :                 hid_err(parser->device, "hid_register_report failed\n");
     232                 :          0 :                 return -1;
     233                 :            :         }
     234                 :            : 
     235                 :            :         /* Handle both signed and unsigned cases properly */
     236 [ #  # ][ #  # ]:          0 :         if ((parser->global.logical_minimum < 0 &&
     237                 :          0 :                 parser->global.logical_maximum <
     238         [ #  # ]:          0 :                 parser->global.logical_minimum) ||
     239         [ #  # ]:          0 :                 (parser->global.logical_minimum >= 0 &&
     240                 :          0 :                 (__u32)parser->global.logical_maximum <
     241                 :          0 :                 (__u32)parser->global.logical_minimum)) {
     242         [ #  # ]:          0 :                 dbg_hid("logical range invalid 0x%x 0x%x\n",
     243                 :            :                         parser->global.logical_minimum,
     244                 :            :                         parser->global.logical_maximum);
     245                 :            :                 return -1;
     246                 :            :         }
     247                 :            : 
     248                 :          0 :         offset = report->size;
     249                 :          0 :         report->size += parser->global.report_size * parser->global.report_count;
     250                 :            : 
     251         [ #  # ]:          0 :         if (!parser->local.usage_index) /* Ignore padding fields */
     252                 :            :                 return 0;
     253                 :            : 
     254                 :          0 :         usages = max_t(unsigned, parser->local.usage_index,
     255                 :            :                                  parser->global.report_count);
     256                 :            : 
     257                 :          0 :         field = hid_register_field(report, usages, parser->global.report_count);
     258         [ #  # ]:          0 :         if (!field)
     259                 :            :                 return 0;
     260                 :            : 
     261                 :          0 :         field->physical = hid_lookup_collection(parser, HID_COLLECTION_PHYSICAL);
     262                 :          0 :         field->logical = hid_lookup_collection(parser, HID_COLLECTION_LOGICAL);
     263                 :          0 :         field->application = hid_lookup_collection(parser, HID_COLLECTION_APPLICATION);
     264                 :            : 
     265         [ #  # ]:          0 :         for (i = 0; i < usages; i++) {
     266                 :            :                 unsigned j = i;
     267                 :            :                 /* Duplicate the last usage we parsed if we have excess values */
     268         [ #  # ]:          0 :                 if (i >= parser->local.usage_index)
     269                 :          0 :                         j = parser->local.usage_index - 1;
     270                 :          0 :                 field->usage[i].hid = parser->local.usage[j];
     271                 :          0 :                 field->usage[i].collection_index =
     272                 :          0 :                         parser->local.collection_index[j];
     273                 :          0 :                 field->usage[i].usage_index = i;
     274                 :            :         }
     275                 :            : 
     276                 :          0 :         field->maxusage = usages;
     277                 :          0 :         field->flags = flags;
     278                 :          0 :         field->report_offset = offset;
     279                 :          0 :         field->report_type = report_type;
     280                 :          0 :         field->report_size = parser->global.report_size;
     281                 :          0 :         field->report_count = parser->global.report_count;
     282                 :          0 :         field->logical_minimum = parser->global.logical_minimum;
     283                 :          0 :         field->logical_maximum = parser->global.logical_maximum;
     284                 :          0 :         field->physical_minimum = parser->global.physical_minimum;
     285                 :          0 :         field->physical_maximum = parser->global.physical_maximum;
     286                 :          0 :         field->unit_exponent = parser->global.unit_exponent;
     287                 :          0 :         field->unit = parser->global.unit;
     288                 :            : 
     289                 :          0 :         return 0;
     290                 :            : }
     291                 :            : 
     292                 :            : /*
     293                 :            :  * Read data value from item.
     294                 :            :  */
     295                 :            : 
     296                 :            : static u32 item_udata(struct hid_item *item)
     297                 :            : {
     298   [ #  #  #  # ]:          0 :         switch (item->size) {
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
     299                 :          0 :         case 1: return item->data.u8;
     300                 :          0 :         case 2: return item->data.u16;
     301                 :          0 :         case 4: return item->data.u32;
     302                 :            :         }
     303                 :            :         return 0;
     304                 :            : }
     305                 :            : 
     306                 :            : static s32 item_sdata(struct hid_item *item)
     307                 :            : {
     308   [ #  #  #  # ]:          0 :         switch (item->size) {
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
           [ #  #  #  # ]
     309                 :          0 :         case 1: return item->data.s8;
     310                 :          0 :         case 2: return item->data.s16;
     311                 :          0 :         case 4: return item->data.s32;
     312                 :            :         }
     313                 :            :         return 0;
     314                 :            : }
     315                 :            : 
     316                 :            : /*
     317                 :            :  * Process a global item.
     318                 :            :  */
     319                 :            : 
     320                 :          0 : static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
     321                 :            : {
     322                 :            :         __s32 raw_value;
     323   [ #  #  #  #  :          0 :         switch (item->tag) {
          #  #  #  #  #  
             #  #  #  # ]
     324                 :            :         case HID_GLOBAL_ITEM_TAG_PUSH:
     325                 :            : 
     326         [ #  # ]:          0 :                 if (parser->global_stack_ptr == HID_GLOBAL_STACK_SIZE) {
     327                 :          0 :                         hid_err(parser->device, "global environment stack overflow\n");
     328                 :          0 :                         return -1;
     329                 :            :                 }
     330                 :            : 
     331                 :          0 :                 memcpy(parser->global_stack + parser->global_stack_ptr++,
     332                 :          0 :                         &parser->global, sizeof(struct hid_global));
     333                 :          0 :                 return 0;
     334                 :            : 
     335                 :            :         case HID_GLOBAL_ITEM_TAG_POP:
     336                 :            : 
     337         [ #  # ]:          0 :                 if (!parser->global_stack_ptr) {
     338                 :          0 :                         hid_err(parser->device, "global environment stack underflow\n");
     339                 :          0 :                         return -1;
     340                 :            :                 }
     341                 :            : 
     342                 :          0 :                 memcpy(&parser->global, parser->global_stack +
     343                 :            :                         --parser->global_stack_ptr, sizeof(struct hid_global));
     344                 :          0 :                 return 0;
     345                 :            : 
     346                 :            :         case HID_GLOBAL_ITEM_TAG_USAGE_PAGE:
     347                 :          0 :                 parser->global.usage_page = item_udata(item);
     348                 :          0 :                 return 0;
     349                 :            : 
     350                 :            :         case HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM:
     351                 :          0 :                 parser->global.logical_minimum = item_sdata(item);
     352                 :          0 :                 return 0;
     353                 :            : 
     354                 :            :         case HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM:
     355         [ #  # ]:          0 :                 if (parser->global.logical_minimum < 0)
     356                 :          0 :                         parser->global.logical_maximum = item_sdata(item);
     357                 :            :                 else
     358                 :          0 :                         parser->global.logical_maximum = item_udata(item);
     359                 :            :                 return 0;
     360                 :            : 
     361                 :            :         case HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM:
     362                 :          0 :                 parser->global.physical_minimum = item_sdata(item);
     363                 :          0 :                 return 0;
     364                 :            : 
     365                 :            :         case HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM:
     366         [ #  # ]:          0 :                 if (parser->global.physical_minimum < 0)
     367                 :          0 :                         parser->global.physical_maximum = item_sdata(item);
     368                 :            :                 else
     369                 :          0 :                         parser->global.physical_maximum = item_udata(item);
     370                 :            :                 return 0;
     371                 :            : 
     372                 :            :         case HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT:
     373                 :            :                 /* Many devices provide unit exponent as a two's complement
     374                 :            :                  * nibble due to the common misunderstanding of HID
     375                 :            :                  * specification 1.11, 6.2.2.7 Global Items. Attempt to handle
     376                 :            :                  * both this and the standard encoding. */
     377                 :            :                 raw_value = item_sdata(item);
     378         [ #  # ]:          0 :                 if (!(raw_value & 0xfffffff0))
     379                 :          0 :                         parser->global.unit_exponent = hid_snto32(raw_value, 4);
     380                 :            :                 else
     381                 :          0 :                         parser->global.unit_exponent = raw_value;
     382                 :            :                 return 0;
     383                 :            : 
     384                 :            :         case HID_GLOBAL_ITEM_TAG_UNIT:
     385                 :          0 :                 parser->global.unit = item_udata(item);
     386                 :          0 :                 return 0;
     387                 :            : 
     388                 :            :         case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
     389                 :          0 :                 parser->global.report_size = item_udata(item);
     390         [ #  # ]:          0 :                 if (parser->global.report_size > 128) {
     391                 :          0 :                         hid_err(parser->device, "invalid report_size %d\n",
     392                 :            :                                         parser->global.report_size);
     393                 :          0 :                         return -1;
     394                 :            :                 }
     395                 :            :                 return 0;
     396                 :            : 
     397                 :            :         case HID_GLOBAL_ITEM_TAG_REPORT_COUNT:
     398                 :          0 :                 parser->global.report_count = item_udata(item);
     399         [ #  # ]:          0 :                 if (parser->global.report_count > HID_MAX_USAGES) {
     400                 :          0 :                         hid_err(parser->device, "invalid report_count %d\n",
     401                 :            :                                         parser->global.report_count);
     402                 :          0 :                         return -1;
     403                 :            :                 }
     404                 :            :                 return 0;
     405                 :            : 
     406                 :            :         case HID_GLOBAL_ITEM_TAG_REPORT_ID:
     407                 :          0 :                 parser->global.report_id = item_udata(item);
     408         [ #  # ]:          0 :                 if (parser->global.report_id == 0 ||
     409                 :            :                     parser->global.report_id >= HID_MAX_IDS) {
     410                 :          0 :                         hid_err(parser->device, "report_id %u is invalid\n",
     411                 :            :                                 parser->global.report_id);
     412                 :          0 :                         return -1;
     413                 :            :                 }
     414                 :            :                 return 0;
     415                 :            : 
     416                 :            :         default:
     417                 :          0 :                 hid_err(parser->device, "unknown global tag 0x%x\n", item->tag);
     418                 :          0 :                 return -1;
     419                 :            :         }
     420                 :            : }
     421                 :            : 
     422                 :            : /*
     423                 :            :  * Process a local item.
     424                 :            :  */
     425                 :            : 
     426                 :          0 : static int hid_parser_local(struct hid_parser *parser, struct hid_item *item)
     427                 :            : {
     428                 :            :         __u32 data;
     429                 :            :         unsigned n;
     430                 :            : 
     431                 :            :         data = item_udata(item);
     432                 :            : 
     433   [ #  #  #  #  :          0 :         switch (item->tag) {
                      # ]
     434                 :            :         case HID_LOCAL_ITEM_TAG_DELIMITER:
     435                 :            : 
     436         [ #  # ]:          0 :                 if (data) {
     437                 :            :                         /*
     438                 :            :                          * We treat items before the first delimiter
     439                 :            :                          * as global to all usage sets (branch 0).
     440                 :            :                          * In the moment we process only these global
     441                 :            :                          * items and the first delimiter set.
     442                 :            :                          */
     443         [ #  # ]:          0 :                         if (parser->local.delimiter_depth != 0) {
     444                 :          0 :                                 hid_err(parser->device, "nested delimiters\n");
     445                 :          0 :                                 return -1;
     446                 :            :                         }
     447                 :          0 :                         parser->local.delimiter_depth++;
     448                 :          0 :                         parser->local.delimiter_branch++;
     449                 :            :                 } else {
     450         [ #  # ]:          0 :                         if (parser->local.delimiter_depth < 1) {
     451                 :          0 :                                 hid_err(parser->device, "bogus close delimiter\n");
     452                 :          0 :                                 return -1;
     453                 :            :                         }
     454                 :          0 :                         parser->local.delimiter_depth--;
     455                 :            :                 }
     456                 :            :                 return 0;
     457                 :            : 
     458                 :            :         case HID_LOCAL_ITEM_TAG_USAGE:
     459                 :            : 
     460         [ #  # ]:          0 :                 if (parser->local.delimiter_branch > 1) {
     461         [ #  # ]:          0 :                         dbg_hid("alternative usage ignored\n");
     462                 :            :                         return 0;
     463                 :            :                 }
     464                 :            : 
     465         [ #  # ]:          0 :                 if (item->size <= 2)
     466                 :          0 :                         data = (parser->global.usage_page << 16) + data;
     467                 :            : 
     468                 :          0 :                 return hid_add_usage(parser, data);
     469                 :            : 
     470                 :            :         case HID_LOCAL_ITEM_TAG_USAGE_MINIMUM:
     471                 :            : 
     472         [ #  # ]:          0 :                 if (parser->local.delimiter_branch > 1) {
     473         [ #  # ]:          0 :                         dbg_hid("alternative usage ignored\n");
     474                 :            :                         return 0;
     475                 :            :                 }
     476                 :            : 
     477         [ #  # ]:          0 :                 if (item->size <= 2)
     478                 :          0 :                         data = (parser->global.usage_page << 16) + data;
     479                 :            : 
     480                 :          0 :                 parser->local.usage_minimum = data;
     481                 :          0 :                 return 0;
     482                 :            : 
     483                 :            :         case HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM:
     484                 :            : 
     485         [ #  # ]:          0 :                 if (parser->local.delimiter_branch > 1) {
     486         [ #  # ]:          0 :                         dbg_hid("alternative usage ignored\n");
     487                 :            :                         return 0;
     488                 :            :                 }
     489                 :            : 
     490         [ #  # ]:          0 :                 if (item->size <= 2)
     491                 :          0 :                         data = (parser->global.usage_page << 16) + data;
     492                 :            : 
     493         [ #  # ]:          0 :                 for (n = parser->local.usage_minimum; n <= data; n++)
     494         [ #  # ]:          0 :                         if (hid_add_usage(parser, n)) {
     495         [ #  # ]:          0 :                                 dbg_hid("hid_add_usage failed\n");
     496                 :            :                                 return -1;
     497                 :            :                         }
     498                 :            :                 return 0;
     499                 :            : 
     500                 :            :         default:
     501                 :            : 
     502         [ #  # ]:          0 :                 dbg_hid("unknown local item tag 0x%x\n", item->tag);
     503                 :            :                 return 0;
     504                 :            :         }
     505                 :            :         return 0;
     506                 :            : }
     507                 :            : 
     508                 :            : /*
     509                 :            :  * Process a main item.
     510                 :            :  */
     511                 :            : 
     512                 :          0 : static int hid_parser_main(struct hid_parser *parser, struct hid_item *item)
     513                 :            : {
     514                 :            :         __u32 data;
     515                 :            :         int ret;
     516                 :            : 
     517                 :            :         data = item_udata(item);
     518                 :            : 
     519   [ #  #  #  #  :          0 :         switch (item->tag) {
                   #  # ]
     520                 :            :         case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
     521                 :          0 :                 ret = open_collection(parser, data & 0xff);
     522                 :          0 :                 break;
     523                 :            :         case HID_MAIN_ITEM_TAG_END_COLLECTION:
     524                 :            :                 ret = close_collection(parser);
     525                 :          0 :                 break;
     526                 :            :         case HID_MAIN_ITEM_TAG_INPUT:
     527                 :          0 :                 ret = hid_add_field(parser, HID_INPUT_REPORT, data);
     528                 :          0 :                 break;
     529                 :            :         case HID_MAIN_ITEM_TAG_OUTPUT:
     530                 :          0 :                 ret = hid_add_field(parser, HID_OUTPUT_REPORT, data);
     531                 :          0 :                 break;
     532                 :            :         case HID_MAIN_ITEM_TAG_FEATURE:
     533                 :          0 :                 ret = hid_add_field(parser, HID_FEATURE_REPORT, data);
     534                 :          0 :                 break;
     535                 :            :         default:
     536                 :          0 :                 hid_err(parser->device, "unknown main item tag 0x%x\n", item->tag);
     537                 :            :                 ret = 0;
     538                 :            :         }
     539                 :            : 
     540                 :          0 :         memset(&parser->local, 0, sizeof(parser->local));     /* Reset the local parser environment */
     541                 :            : 
     542                 :          0 :         return ret;
     543                 :            : }
     544                 :            : 
     545                 :            : /*
     546                 :            :  * Process a reserved item.
     547                 :            :  */
     548                 :            : 
     549                 :          0 : static int hid_parser_reserved(struct hid_parser *parser, struct hid_item *item)
     550                 :            : {
     551         [ #  # ]:          0 :         dbg_hid("reserved item type, tag 0x%x\n", item->tag);
     552                 :          0 :         return 0;
     553                 :            : }
     554                 :            : 
     555                 :            : /*
     556                 :            :  * Free a report and all registered fields. The field->usage and
     557                 :            :  * field->value table's are allocated behind the field, so we need
     558                 :            :  * only to free(field) itself.
     559                 :            :  */
     560                 :            : 
     561                 :          0 : static void hid_free_report(struct hid_report *report)
     562                 :            : {
     563                 :            :         unsigned n;
     564                 :            : 
     565         [ #  # ]:          0 :         for (n = 0; n < report->maxfield; n++)
     566                 :          0 :                 kfree(report->field[n]);
     567                 :          0 :         kfree(report);
     568                 :          0 : }
     569                 :            : 
     570                 :            : /*
     571                 :            :  * Close report. This function returns the device
     572                 :            :  * state to the point prior to hid_open_report().
     573                 :            :  */
     574                 :          0 : static void hid_close_report(struct hid_device *device)
     575                 :            : {
     576                 :            :         unsigned i, j;
     577                 :            : 
     578         [ #  # ]:          0 :         for (i = 0; i < HID_REPORT_TYPES; i++) {
     579                 :          0 :                 struct hid_report_enum *report_enum = device->report_enum + i;
     580                 :            : 
     581         [ #  # ]:          0 :                 for (j = 0; j < HID_MAX_IDS; j++) {
     582                 :          0 :                         struct hid_report *report = report_enum->report_id_hash[j];
     583         [ #  # ]:          0 :                         if (report)
     584                 :          0 :                                 hid_free_report(report);
     585                 :            :                 }
     586                 :          0 :                 memset(report_enum, 0, sizeof(*report_enum));
     587                 :          0 :                 INIT_LIST_HEAD(&report_enum->report_list);
     588                 :            :         }
     589                 :            : 
     590                 :          0 :         kfree(device->rdesc);
     591                 :          0 :         device->rdesc = NULL;
     592                 :          0 :         device->rsize = 0;
     593                 :            : 
     594                 :          0 :         kfree(device->collection);
     595                 :          0 :         device->collection = NULL;
     596                 :          0 :         device->collection_size = 0;
     597                 :          0 :         device->maxcollection = 0;
     598                 :          0 :         device->maxapplication = 0;
     599                 :            : 
     600                 :          0 :         device->status &= ~HID_STAT_PARSED;
     601                 :          0 : }
     602                 :            : 
     603                 :            : /*
     604                 :            :  * Free a device structure, all reports, and all fields.
     605                 :            :  */
     606                 :            : 
     607                 :          0 : static void hid_device_release(struct device *dev)
     608                 :            : {
     609                 :          0 :         struct hid_device *hid = container_of(dev, struct hid_device, dev);
     610                 :            : 
     611                 :          0 :         hid_close_report(hid);
     612                 :          0 :         kfree(hid->dev_rdesc);
     613                 :          0 :         kfree(hid);
     614                 :          0 : }
     615                 :            : 
     616                 :            : /*
     617                 :            :  * Fetch a report description item from the data stream. We support long
     618                 :            :  * items, though they are not used yet.
     619                 :            :  */
     620                 :            : 
     621                 :          0 : static u8 *fetch_item(__u8 *start, __u8 *end, struct hid_item *item)
     622                 :            : {
     623                 :            :         u8 b;
     624                 :            : 
     625         [ #  # ]:          0 :         if ((end - start) <= 0)
     626                 :            :                 return NULL;
     627                 :            : 
     628                 :          0 :         b = *start++;
     629                 :            : 
     630                 :          0 :         item->type = (b >> 2) & 3;
     631                 :          0 :         item->tag  = (b >> 4) & 15;
     632                 :            : 
     633         [ #  # ]:          0 :         if (item->tag == HID_ITEM_TAG_LONG) {
     634                 :            : 
     635                 :          0 :                 item->format = HID_ITEM_FORMAT_LONG;
     636                 :            : 
     637         [ #  # ]:          0 :                 if ((end - start) < 2)
     638                 :            :                         return NULL;
     639                 :            : 
     640                 :          0 :                 item->size = *start++;
     641                 :          0 :                 item->tag  = *start++;
     642                 :            : 
     643         [ #  # ]:          0 :                 if ((end - start) < item->size)
     644                 :            :                         return NULL;
     645                 :            : 
     646                 :          0 :                 item->data.longdata = start;
     647                 :          0 :                 start += item->size;
     648                 :          0 :                 return start;
     649                 :            :         }
     650                 :            : 
     651                 :          0 :         item->format = HID_ITEM_FORMAT_SHORT;
     652                 :          0 :         item->size = b & 3;
     653                 :            : 
     654   [ #  #  #  #  :          0 :         switch (item->size) {
                      # ]
     655                 :            :         case 0:
     656                 :          0 :                 return start;
     657                 :            : 
     658                 :            :         case 1:
     659         [ #  # ]:          0 :                 if ((end - start) < 1)
     660                 :            :                         return NULL;
     661                 :          0 :                 item->data.u8 = *start++;
     662                 :          0 :                 return start;
     663                 :            : 
     664                 :            :         case 2:
     665         [ #  # ]:          0 :                 if ((end - start) < 2)
     666                 :            :                         return NULL;
     667                 :          0 :                 item->data.u16 = get_unaligned_le16(start);
     668                 :            :                 start = (__u8 *)((__le16 *)start + 1);
     669                 :          0 :                 return start;
     670                 :            : 
     671                 :            :         case 3:
     672                 :          0 :                 item->size++;
     673         [ #  # ]:          0 :                 if ((end - start) < 4)
     674                 :            :                         return NULL;
     675                 :          0 :                 item->data.u32 = get_unaligned_le32(start);
     676                 :            :                 start = (__u8 *)((__le32 *)start + 1);
     677                 :          0 :                 return start;
     678                 :            :         }
     679                 :            : 
     680                 :            :         return NULL;
     681                 :            : }
     682                 :            : 
     683                 :            : static void hid_scan_input_usage(struct hid_parser *parser, u32 usage)
     684                 :            : {
     685                 :            :         struct hid_device *hid = parser->device;
     686                 :            : 
     687         [ #  # ]:          0 :         if (usage == HID_DG_CONTACTID)
     688                 :          0 :                 hid->group = HID_GROUP_MULTITOUCH;
     689                 :            : }
     690                 :            : 
     691                 :            : static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)
     692                 :            : {
     693 [ #  # ][ #  # ]:          0 :         if (usage == 0xff0000c5 && parser->global.report_count == 256 &&
                 [ #  # ]
     694                 :          0 :             parser->global.report_size == 8)
     695                 :          0 :                 parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
     696                 :            : }
     697                 :            : 
     698                 :            : static void hid_scan_collection(struct hid_parser *parser, unsigned type)
     699                 :            : {
     700                 :            :         struct hid_device *hid = parser->device;
     701                 :            : 
     702 [ #  # ][ #  # ]:          0 :         if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
     703                 :            :             type == HID_COLLECTION_PHYSICAL)
     704                 :          0 :                 hid->group = HID_GROUP_SENSOR_HUB;
     705                 :            : }
     706                 :            : 
     707                 :          0 : static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
     708                 :            : {
     709                 :            :         __u32 data;
     710                 :            :         int i;
     711                 :            : 
     712                 :            :         data = item_udata(item);
     713                 :            : 
     714   [ #  #  #  # ]:          0 :         switch (item->tag) {
     715                 :            :         case HID_MAIN_ITEM_TAG_BEGIN_COLLECTION:
     716                 :          0 :                 hid_scan_collection(parser, data & 0xff);
     717                 :            :                 break;
     718                 :            :         case HID_MAIN_ITEM_TAG_END_COLLECTION:
     719                 :            :                 break;
     720                 :            :         case HID_MAIN_ITEM_TAG_INPUT:
     721         [ #  # ]:          0 :                 for (i = 0; i < parser->local.usage_index; i++)
     722                 :          0 :                         hid_scan_input_usage(parser, parser->local.usage[i]);
     723                 :            :                 break;
     724                 :            :         case HID_MAIN_ITEM_TAG_OUTPUT:
     725                 :            :                 break;
     726                 :            :         case HID_MAIN_ITEM_TAG_FEATURE:
     727         [ #  # ]:          0 :                 for (i = 0; i < parser->local.usage_index; i++)
     728                 :          0 :                         hid_scan_feature_usage(parser, parser->local.usage[i]);
     729                 :            :                 break;
     730                 :            :         }
     731                 :            : 
     732                 :            :         /* Reset the local parser environment */
     733                 :          0 :         memset(&parser->local, 0, sizeof(parser->local));
     734                 :            : 
     735                 :          0 :         return 0;
     736                 :            : }
     737                 :            : 
     738                 :            : /*
     739                 :            :  * Scan a report descriptor before the device is added to the bus.
     740                 :            :  * Sets device groups and other properties that determine what driver
     741                 :            :  * to load.
     742                 :            :  */
     743                 :          0 : static int hid_scan_report(struct hid_device *hid)
     744                 :            : {
     745                 :            :         struct hid_parser *parser;
     746                 :            :         struct hid_item item;
     747                 :          0 :         __u8 *start = hid->dev_rdesc;
     748                 :          0 :         __u8 *end = start + hid->dev_rsize;
     749                 :            :         static int (*dispatch_type[])(struct hid_parser *parser,
     750                 :            :                                       struct hid_item *item) = {
     751                 :            :                 hid_scan_main,
     752                 :            :                 hid_parser_global,
     753                 :            :                 hid_parser_local,
     754                 :            :                 hid_parser_reserved
     755                 :            :         };
     756                 :            : 
     757                 :          0 :         parser = vzalloc(sizeof(struct hid_parser));
     758         [ #  # ]:          0 :         if (!parser)
     759                 :            :                 return -ENOMEM;
     760                 :            : 
     761                 :          0 :         parser->device = hid;
     762                 :          0 :         hid->group = HID_GROUP_GENERIC;
     763                 :            : 
     764                 :            :         /*
     765                 :            :          * The parsing is simpler than the one in hid_open_report() as we should
     766                 :            :          * be robust against hid errors. Those errors will be raised by
     767                 :            :          * hid_open_report() anyway.
     768                 :            :          */
     769         [ #  # ]:          0 :         while ((start = fetch_item(start, end, &item)) != NULL)
     770                 :          0 :                 dispatch_type[item.type](parser, &item);
     771                 :            : 
     772                 :            :         /*
     773                 :            :          * Handle special flags set during scanning.
     774                 :            :          */
     775 [ #  # ][ #  # ]:          0 :         if ((parser->scan_flags & HID_SCAN_FLAG_MT_WIN_8) &&
     776                 :          0 :             (hid->group == HID_GROUP_MULTITOUCH))
     777                 :          0 :                 hid->group = HID_GROUP_MULTITOUCH_WIN_8;
     778                 :            : 
     779                 :          0 :         vfree(parser);
     780                 :          0 :         return 0;
     781                 :            : }
     782                 :            : 
     783                 :            : /**
     784                 :            :  * hid_parse_report - parse device report
     785                 :            :  *
     786                 :            :  * @device: hid device
     787                 :            :  * @start: report start
     788                 :            :  * @size: report size
     789                 :            :  *
     790                 :            :  * Allocate the device report as read by the bus driver. This function should
     791                 :            :  * only be called from parse() in ll drivers.
     792                 :            :  */
     793                 :          0 : int hid_parse_report(struct hid_device *hid, __u8 *start, unsigned size)
     794                 :            : {
     795                 :          0 :         hid->dev_rdesc = kmemdup(start, size, GFP_KERNEL);
     796         [ #  # ]:          0 :         if (!hid->dev_rdesc)
     797                 :            :                 return -ENOMEM;
     798                 :          0 :         hid->dev_rsize = size;
     799                 :          0 :         return 0;
     800                 :            : }
     801                 :            : EXPORT_SYMBOL_GPL(hid_parse_report);
     802                 :            : 
     803                 :            : static const char * const hid_report_names[] = {
     804                 :            :         "HID_INPUT_REPORT",
     805                 :            :         "HID_OUTPUT_REPORT",
     806                 :            :         "HID_FEATURE_REPORT",
     807                 :            : };
     808                 :            : /**
     809                 :            :  * hid_validate_values - validate existing device report's value indexes
     810                 :            :  *
     811                 :            :  * @device: hid device
     812                 :            :  * @type: which report type to examine
     813                 :            :  * @id: which report ID to examine (0 for first)
     814                 :            :  * @field_index: which report field to examine
     815                 :            :  * @report_counts: expected number of values
     816                 :            :  *
     817                 :            :  * Validate the number of values in a given field of a given report, after
     818                 :            :  * parsing.
     819                 :            :  */
     820                 :          0 : struct hid_report *hid_validate_values(struct hid_device *hid,
     821                 :            :                                        unsigned int type, unsigned int id,
     822                 :            :                                        unsigned int field_index,
     823                 :            :                                        unsigned int report_counts)
     824                 :            : {
     825                 :            :         struct hid_report *report;
     826                 :            : 
     827         [ #  # ]:          0 :         if (type > HID_FEATURE_REPORT) {
     828                 :          0 :                 hid_err(hid, "invalid HID report type %u\n", type);
     829                 :          0 :                 return NULL;
     830                 :            :         }
     831                 :            : 
     832         [ #  # ]:          0 :         if (id >= HID_MAX_IDS) {
     833                 :          0 :                 hid_err(hid, "invalid HID report id %u\n", id);
     834                 :          0 :                 return NULL;
     835                 :            :         }
     836                 :            : 
     837                 :            :         /*
     838                 :            :          * Explicitly not using hid_get_report() here since it depends on
     839                 :            :          * ->numbered being checked, which may not always be the case when
     840                 :            :          * drivers go to access report values.
     841                 :            :          */
     842                 :          0 :         report = hid->report_enum[type].report_id_hash[id];
     843         [ #  # ]:          0 :         if (!report) {
     844                 :          0 :                 hid_err(hid, "missing %s %u\n", hid_report_names[type], id);
     845                 :          0 :                 return NULL;
     846                 :            :         }
     847         [ #  # ]:          0 :         if (report->maxfield <= field_index) {
     848                 :          0 :                 hid_err(hid, "not enough fields in %s %u\n",
     849                 :            :                         hid_report_names[type], id);
     850                 :          0 :                 return NULL;
     851                 :            :         }
     852         [ #  # ]:          0 :         if (report->field[field_index]->report_count < report_counts) {
     853                 :          0 :                 hid_err(hid, "not enough values in %s %u field %u\n",
     854                 :            :                         hid_report_names[type], id, field_index);
     855                 :          0 :                 return NULL;
     856                 :            :         }
     857                 :            :         return report;
     858                 :            : }
     859                 :            : EXPORT_SYMBOL_GPL(hid_validate_values);
     860                 :            : 
     861                 :            : /**
     862                 :            :  * hid_open_report - open a driver-specific device report
     863                 :            :  *
     864                 :            :  * @device: hid device
     865                 :            :  *
     866                 :            :  * Parse a report description into a hid_device structure. Reports are
     867                 :            :  * enumerated, fields are attached to these reports.
     868                 :            :  * 0 returned on success, otherwise nonzero error value.
     869                 :            :  *
     870                 :            :  * This function (or the equivalent hid_parse() macro) should only be
     871                 :            :  * called from probe() in drivers, before starting the device.
     872                 :            :  */
     873                 :          0 : int hid_open_report(struct hid_device *device)
     874                 :            : {
     875                 :            :         struct hid_parser *parser;
     876                 :            :         struct hid_item item;
     877                 :            :         unsigned int size;
     878                 :            :         __u8 *start;
     879                 :            :         __u8 *buf;
     880                 :            :         __u8 *end;
     881                 :            :         int ret;
     882                 :            :         static int (*dispatch_type[])(struct hid_parser *parser,
     883                 :            :                                       struct hid_item *item) = {
     884                 :            :                 hid_parser_main,
     885                 :            :                 hid_parser_global,
     886                 :            :                 hid_parser_local,
     887                 :            :                 hid_parser_reserved
     888                 :            :         };
     889                 :            : 
     890 [ #  # ][ #  # ]:          0 :         if (WARN_ON(device->status & HID_STAT_PARSED))
     891                 :            :                 return -EBUSY;
     892                 :            : 
     893                 :          0 :         start = device->dev_rdesc;
     894 [ #  # ][ #  # ]:          0 :         if (WARN_ON(!start))
     895                 :            :                 return -ENODEV;
     896                 :          0 :         size = device->dev_rsize;
     897                 :            : 
     898                 :          0 :         buf = kmemdup(start, size, GFP_KERNEL);
     899         [ #  # ]:          0 :         if (buf == NULL)
     900                 :            :                 return -ENOMEM;
     901                 :            : 
     902         [ #  # ]:          0 :         if (device->driver->report_fixup)
     903                 :          0 :                 start = device->driver->report_fixup(device, buf, &size);
     904                 :            :         else
     905                 :            :                 start = buf;
     906                 :            : 
     907                 :          0 :         start = kmemdup(start, size, GFP_KERNEL);
     908                 :          0 :         kfree(buf);
     909         [ #  # ]:          0 :         if (start == NULL)
     910                 :            :                 return -ENOMEM;
     911                 :            : 
     912                 :          0 :         device->rdesc = start;
     913                 :          0 :         device->rsize = size;
     914                 :            : 
     915                 :          0 :         parser = vzalloc(sizeof(struct hid_parser));
     916         [ #  # ]:          0 :         if (!parser) {
     917                 :            :                 ret = -ENOMEM;
     918                 :            :                 goto err;
     919                 :            :         }
     920                 :            : 
     921                 :          0 :         parser->device = device;
     922                 :            : 
     923                 :          0 :         end = start + size;
     924                 :            : 
     925                 :          0 :         device->collection = kcalloc(HID_DEFAULT_NUM_COLLECTIONS,
     926                 :            :                                      sizeof(struct hid_collection), GFP_KERNEL);
     927         [ #  # ]:          0 :         if (!device->collection) {
     928                 :            :                 ret = -ENOMEM;
     929                 :            :                 goto err;
     930                 :            :         }
     931                 :          0 :         device->collection_size = HID_DEFAULT_NUM_COLLECTIONS;
     932                 :            : 
     933                 :            :         ret = -EINVAL;
     934         [ #  # ]:          0 :         while ((start = fetch_item(start, end, &item)) != NULL) {
     935                 :            : 
     936         [ #  # ]:          0 :                 if (item.format != HID_ITEM_FORMAT_SHORT) {
     937                 :          0 :                         hid_err(device, "unexpected long global item\n");
     938                 :          0 :                         goto err;
     939                 :            :                 }
     940                 :            : 
     941         [ #  # ]:          0 :                 if (dispatch_type[item.type](parser, &item)) {
     942                 :          0 :                         hid_err(device, "item %u %u %u %u parsing failed\n",
     943                 :            :                                 item.format, (unsigned)item.size,
     944                 :            :                                 (unsigned)item.type, (unsigned)item.tag);
     945                 :          0 :                         goto err;
     946                 :            :                 }
     947                 :            : 
     948         [ #  # ]:          0 :                 if (start == end) {
     949         [ #  # ]:          0 :                         if (parser->collection_stack_ptr) {
     950                 :          0 :                                 hid_err(device, "unbalanced collection at end of report description\n");
     951                 :          0 :                                 goto err;
     952                 :            :                         }
     953         [ #  # ]:          0 :                         if (parser->local.delimiter_depth) {
     954                 :          0 :                                 hid_err(device, "unbalanced delimiter at end of report description\n");
     955                 :          0 :                                 goto err;
     956                 :            :                         }
     957                 :          0 :                         vfree(parser);
     958                 :          0 :                         device->status |= HID_STAT_PARSED;
     959                 :          0 :                         return 0;
     960                 :            :                 }
     961                 :            :         }
     962                 :            : 
     963                 :          0 :         hid_err(device, "item fetching failed at offset %d\n", (int)(end - start));
     964                 :            : err:
     965                 :          0 :         vfree(parser);
     966                 :          0 :         hid_close_report(device);
     967                 :          0 :         return ret;
     968                 :            : }
     969                 :            : EXPORT_SYMBOL_GPL(hid_open_report);
     970                 :            : 
     971                 :            : /*
     972                 :            :  * Convert a signed n-bit integer to signed 32-bit integer. Common
     973                 :            :  * cases are done through the compiler, the screwed things has to be
     974                 :            :  * done by hand.
     975                 :            :  */
     976                 :            : 
     977                 :            : static s32 snto32(__u32 value, unsigned n)
     978                 :            : {
     979   [ #  #  #  #  :          0 :         switch (n) {
             #  #  #  # ]
           [ #  #  #  # ]
     980                 :          0 :         case 8:  return ((__s8)value);
     981                 :          0 :         case 16: return ((__s16)value);
     982                 :          0 :         case 32: return ((__s32)value);
     983                 :            :         }
     984 [ #  # ][ #  # ]:          0 :         return value & (1 << (n - 1)) ? value | (-1 << n) : value;
         [ #  # ][ #  # ]
     985                 :            : }
     986                 :            : 
     987                 :          0 : s32 hid_snto32(__u32 value, unsigned n)
     988                 :            : {
     989                 :          0 :         return snto32(value, n);
     990                 :            : }
     991                 :            : EXPORT_SYMBOL_GPL(hid_snto32);
     992                 :            : 
     993                 :            : /*
     994                 :            :  * Convert a signed 32-bit integer to a signed n-bit integer.
     995                 :            :  */
     996                 :            : 
     997                 :            : static u32 s32ton(__s32 value, unsigned n)
     998                 :            : {
     999                 :          0 :         s32 a = value >> (n - 1);
    1000 [ #  # ][ #  # ]:          0 :         if (a && a != -1)
    1001 [ #  # ][ #  # ]:          0 :                 return value < 0 ? 1 << (n - 1) : (1 << (n - 1)) - 1;
    1002                 :          0 :         return value & ((1 << n) - 1);
    1003                 :            : }
    1004                 :            : 
    1005                 :            : /*
    1006                 :            :  * Extract/implement a data field from/to a little endian report (bit array).
    1007                 :            :  *
    1008                 :            :  * Code sort-of follows HID spec:
    1009                 :            :  *     http://www.usb.org/developers/devclass_docs/HID1_11.pdf
    1010                 :            :  *
    1011                 :            :  * While the USB HID spec allows unlimited length bit fields in "report
    1012                 :            :  * descriptors", most devices never use more than 16 bits.
    1013                 :            :  * One model of UPS is claimed to report "LINEV" as a 32-bit field.
    1014                 :            :  * Search linux-kernel and linux-usb-devel archives for "hid-core extract".
    1015                 :            :  */
    1016                 :            : 
    1017                 :          0 : static __u32 extract(const struct hid_device *hid, __u8 *report,
    1018                 :            :                      unsigned offset, unsigned n)
    1019                 :            : {
    1020                 :            :         u64 x;
    1021                 :            : 
    1022         [ #  # ]:          0 :         if (n > 32)
    1023                 :          0 :                 hid_warn(hid, "extract() called with n (%d) > 32! (%s)\n",
    1024                 :            :                          n, current->comm);
    1025                 :            : 
    1026                 :          0 :         report += offset >> 3;  /* adjust byte index */
    1027                 :          0 :         offset &= 7;            /* now only need bit offset into one byte */
    1028                 :            :         x = get_unaligned_le64(report);
    1029                 :          0 :         x = (x >> offset) & ((1ULL << n) - 1);  /* extract bit field */
    1030                 :          0 :         return (u32) x;
    1031                 :            : }
    1032                 :            : 
    1033                 :            : /*
    1034                 :            :  * "implement" : set bits in a little endian bit stream.
    1035                 :            :  * Same concepts as "extract" (see comments above).
    1036                 :            :  * The data mangled in the bit stream remains in little endian
    1037                 :            :  * order the whole time. It make more sense to talk about
    1038                 :            :  * endianness of register values by considering a register
    1039                 :            :  * a "cached" copy of the little endiad bit stream.
    1040                 :            :  */
    1041                 :          0 : static void implement(const struct hid_device *hid, __u8 *report,
    1042                 :            :                       unsigned offset, unsigned n, __u32 value)
    1043                 :            : {
    1044                 :            :         u64 x;
    1045                 :          0 :         u64 m = (1ULL << n) - 1;
    1046                 :            : 
    1047         [ #  # ]:          0 :         if (n > 32)
    1048                 :          0 :                 hid_warn(hid, "%s() called with n (%d) > 32! (%s)\n",
    1049                 :            :                          __func__, n, current->comm);
    1050                 :            : 
    1051         [ #  # ]:          0 :         if (value > m)
    1052                 :          0 :                 hid_warn(hid, "%s() called with too large value %d! (%s)\n",
    1053                 :            :                          __func__, value, current->comm);
    1054         [ #  # ]:          0 :         WARN_ON(value > m);
    1055                 :          0 :         value &= m;
    1056                 :            : 
    1057                 :          0 :         report += offset >> 3;
    1058                 :          0 :         offset &= 7;
    1059                 :            : 
    1060                 :            :         x = get_unaligned_le64(report);
    1061                 :          0 :         x &= ~(m << offset);
    1062                 :          0 :         x |= ((u64)value) << offset;
    1063                 :            :         put_unaligned_le64(x, report);
    1064                 :          0 : }
    1065                 :            : 
    1066                 :            : /*
    1067                 :            :  * Search an array for a value.
    1068                 :            :  */
    1069                 :            : 
    1070                 :            : static int search(__s32 *array, __s32 value, unsigned n)
    1071                 :            : {
    1072 [ #  # ][ #  # ]:          0 :         while (n--) {
    1073 [ #  # ][ #  # ]:          0 :                 if (*array++ == value)
    1074                 :            :                         return 0;
    1075                 :            :         }
    1076                 :            :         return -1;
    1077                 :            : }
    1078                 :            : 
    1079                 :            : /**
    1080                 :            :  * hid_match_report - check if driver's raw_event should be called
    1081                 :            :  *
    1082                 :            :  * @hid: hid device
    1083                 :            :  * @report_type: type to match against
    1084                 :            :  *
    1085                 :            :  * compare hid->driver->report_table->report_type to report->type
    1086                 :            :  */
    1087                 :            : static int hid_match_report(struct hid_device *hid, struct hid_report *report)
    1088                 :            : {
    1089                 :          0 :         const struct hid_report_id *id = hid->driver->report_table;
    1090                 :            : 
    1091         [ #  # ]:          0 :         if (!id) /* NULL means all */
    1092                 :            :                 return 1;
    1093                 :            : 
    1094         [ #  # ]:          0 :         for (; id->report_type != HID_TERMINATOR; id++)
    1095 [ #  # ][ #  # ]:          0 :                 if (id->report_type == HID_ANY_ID ||
    1096                 :          0 :                                 id->report_type == report->type)
    1097                 :            :                         return 1;
    1098                 :            :         return 0;
    1099                 :            : }
    1100                 :            : 
    1101                 :            : /**
    1102                 :            :  * hid_match_usage - check if driver's event should be called
    1103                 :            :  *
    1104                 :            :  * @hid: hid device
    1105                 :            :  * @usage: usage to match against
    1106                 :            :  *
    1107                 :            :  * compare hid->driver->usage_table->usage_{type,code} to
    1108                 :            :  * usage->usage_{type,code}
    1109                 :            :  */
    1110                 :          0 : static int hid_match_usage(struct hid_device *hid, struct hid_usage *usage)
    1111                 :            : {
    1112                 :          0 :         const struct hid_usage_id *id = hid->driver->usage_table;
    1113                 :            : 
    1114         [ #  # ]:          0 :         if (!id) /* NULL means all */
    1115                 :            :                 return 1;
    1116                 :            : 
    1117         [ #  # ]:          0 :         for (; id->usage_type != HID_ANY_ID - 1; id++)
    1118 [ #  # ][ #  # ]:          0 :                 if ((id->usage_hid == HID_ANY_ID ||
    1119         [ #  # ]:          0 :                                 id->usage_hid == usage->hid) &&
    1120         [ #  # ]:          0 :                                 (id->usage_type == HID_ANY_ID ||
    1121         [ #  # ]:          0 :                                 id->usage_type == usage->type) &&
    1122         [ #  # ]:          0 :                                 (id->usage_code == HID_ANY_ID ||
    1123                 :          0 :                                  id->usage_code == usage->code))
    1124                 :            :                         return 1;
    1125                 :            :         return 0;
    1126                 :            : }
    1127                 :            : 
    1128                 :          0 : static void hid_process_event(struct hid_device *hid, struct hid_field *field,
    1129                 :            :                 struct hid_usage *usage, __s32 value, int interrupt)
    1130                 :            : {
    1131                 :          0 :         struct hid_driver *hdrv = hid->driver;
    1132                 :            :         int ret;
    1133                 :            : 
    1134         [ #  # ]:          0 :         if (!list_empty(&hid->debug_list))
    1135                 :          0 :                 hid_dump_input(hid, usage, value);
    1136                 :            : 
    1137 [ #  # ][ #  # ]:          0 :         if (hdrv && hdrv->event && hid_match_usage(hid, usage)) {
                 [ #  # ]
    1138                 :          0 :                 ret = hdrv->event(hid, field, usage, value);
    1139         [ #  # ]:          0 :                 if (ret != 0) {
    1140         [ #  # ]:          0 :                         if (ret < 0)
    1141                 :          0 :                                 hid_err(hid, "%s's event failed with %d\n",
    1142                 :            :                                                 hdrv->name, ret);
    1143                 :          0 :                         return;
    1144                 :            :                 }
    1145                 :            :         }
    1146                 :            : 
    1147         [ #  # ]:          0 :         if (hid->claimed & HID_CLAIMED_INPUT)
    1148                 :          0 :                 hidinput_hid_event(hid, field, usage, value);
    1149 [ #  # ][ #  # ]:          0 :         if (hid->claimed & HID_CLAIMED_HIDDEV && interrupt && hid->hiddev_hid_event)
                 [ #  # ]
    1150                 :          0 :                 hid->hiddev_hid_event(hid, field, usage, value);
    1151                 :            : }
    1152                 :            : 
    1153                 :            : /*
    1154                 :            :  * Analyse a received field, and fetch the data from it. The field
    1155                 :            :  * content is stored for next report processing (we do differential
    1156                 :            :  * reporting to the layer).
    1157                 :            :  */
    1158                 :            : 
    1159                 :          0 : static void hid_input_field(struct hid_device *hid, struct hid_field *field,
    1160                 :            :                             __u8 *data, int interrupt)
    1161                 :            : {
    1162                 :            :         unsigned n;
    1163                 :          0 :         unsigned count = field->report_count;
    1164                 :          0 :         unsigned offset = field->report_offset;
    1165                 :          0 :         unsigned size = field->report_size;
    1166                 :          0 :         __s32 min = field->logical_minimum;
    1167                 :          0 :         __s32 max = field->logical_maximum;
    1168                 :            :         __s32 *value;
    1169                 :            : 
    1170                 :          0 :         value = kmalloc(sizeof(__s32) * count, GFP_ATOMIC);
    1171         [ #  # ]:          0 :         if (!value)
    1172                 :          0 :                 return;
    1173                 :            : 
    1174         [ #  # ]:          0 :         for (n = 0; n < count; n++) {
    1175                 :            : 
    1176         [ #  # ]:          0 :                 value[n] = min < 0 ?
    1177                 :          0 :                         snto32(extract(hid, data, offset + n * size, size),
    1178                 :            :                                size) :
    1179                 :          0 :                         extract(hid, data, offset + n * size, size);
    1180                 :            : 
    1181                 :            :                 /* Ignore report if ErrorRollOver */
    1182 [ #  # ][ #  # ]:          0 :                 if (!(field->flags & HID_MAIN_ITEM_VARIABLE) &&
    1183 [ #  # ][ #  # ]:          0 :                     value[n] >= min && value[n] <= max &&
    1184                 :          0 :                     field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1)
    1185                 :            :                         goto exit;
    1186                 :            :         }
    1187                 :            : 
    1188         [ #  # ]:          0 :         for (n = 0; n < count; n++) {
    1189                 :            : 
    1190         [ #  # ]:          0 :                 if (HID_MAIN_ITEM_VARIABLE & field->flags) {
    1191                 :          0 :                         hid_process_event(hid, field, &field->usage[n], value[n], interrupt);
    1192                 :          0 :                         continue;
    1193                 :            :                 }
    1194                 :            : 
    1195 [ #  # ][ #  # ]:          0 :                 if (field->value[n] >= min && field->value[n] <= max
    1196         [ #  # ]:          0 :                         && field->usage[field->value[n] - min].hid
    1197         [ #  # ]:          0 :                         && search(value, field->value[n], count))
    1198                 :          0 :                                 hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt);
    1199                 :            : 
    1200 [ #  # ][ #  # ]:          0 :                 if (value[n] >= min && value[n] <= max
    1201         [ #  # ]:          0 :                         && field->usage[value[n] - min].hid
    1202         [ #  # ]:          0 :                         && search(field->value, value[n], count))
    1203                 :          0 :                                 hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt);
    1204                 :            :         }
    1205                 :            : 
    1206                 :          0 :         memcpy(field->value, value, count * sizeof(__s32));
    1207                 :            : exit:
    1208                 :          0 :         kfree(value);
    1209                 :            : }
    1210                 :            : 
    1211                 :            : /*
    1212                 :            :  * Output the field into the report.
    1213                 :            :  */
    1214                 :            : 
    1215                 :          0 : static void hid_output_field(const struct hid_device *hid,
    1216                 :            :                              struct hid_field *field, __u8 *data)
    1217                 :            : {
    1218                 :          0 :         unsigned count = field->report_count;
    1219                 :          0 :         unsigned offset = field->report_offset;
    1220                 :          0 :         unsigned size = field->report_size;
    1221                 :            :         unsigned n;
    1222                 :            : 
    1223         [ #  # ]:          0 :         for (n = 0; n < count; n++) {
    1224         [ #  # ]:          0 :                 if (field->logical_minimum < 0)   /* signed values */
    1225                 :          0 :                         implement(hid, data, offset + n * size, size,
    1226                 :          0 :                                   s32ton(field->value[n], size));
    1227                 :            :                 else                            /* unsigned values */
    1228                 :          0 :                         implement(hid, data, offset + n * size, size,
    1229                 :          0 :                                   field->value[n]);
    1230                 :            :         }
    1231                 :          0 : }
    1232                 :            : 
    1233                 :            : /*
    1234                 :            :  * Create a report. 'data' has to be allocated using
    1235                 :            :  * hid_alloc_report_buf() so that it has proper size.
    1236                 :            :  */
    1237                 :            : 
    1238                 :          0 : void hid_output_report(struct hid_report *report, __u8 *data)
    1239                 :            : {
    1240                 :            :         unsigned n;
    1241                 :            : 
    1242         [ #  # ]:          0 :         if (report->id > 0)
    1243                 :          0 :                 *data++ = report->id;
    1244                 :            : 
    1245         [ #  # ]:          0 :         memset(data, 0, ((report->size - 1) >> 3) + 1);
    1246         [ #  # ]:          0 :         for (n = 0; n < report->maxfield; n++)
    1247                 :          0 :                 hid_output_field(report->device, report->field[n], data);
    1248                 :          0 : }
    1249                 :            : EXPORT_SYMBOL_GPL(hid_output_report);
    1250                 :            : 
    1251                 :            : /*
    1252                 :            :  * Allocator for buffer that is going to be passed to hid_output_report()
    1253                 :            :  */
    1254                 :          0 : u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags)
    1255                 :            : {
    1256                 :            :         /*
    1257                 :            :          * 7 extra bytes are necessary to achieve proper functionality
    1258                 :            :          * of implement() working on 8 byte chunks
    1259                 :            :          */
    1260                 :            : 
    1261                 :          0 :         int len = ((report->size - 1) >> 3) + 1 + (report->id > 0) + 7;
    1262                 :            : 
    1263                 :          0 :         return kmalloc(len, flags);
    1264                 :            : }
    1265                 :            : EXPORT_SYMBOL_GPL(hid_alloc_report_buf);
    1266                 :            : 
    1267                 :            : /*
    1268                 :            :  * Set a field value. The report this field belongs to has to be
    1269                 :            :  * created and transferred to the device, to set this value in the
    1270                 :            :  * device.
    1271                 :            :  */
    1272                 :            : 
    1273                 :          0 : int hid_set_field(struct hid_field *field, unsigned offset, __s32 value)
    1274                 :            : {
    1275                 :            :         unsigned size;
    1276                 :            : 
    1277         [ #  # ]:          0 :         if (!field)
    1278                 :            :                 return -1;
    1279                 :            : 
    1280                 :          0 :         size = field->report_size;
    1281                 :            : 
    1282                 :          0 :         hid_dump_input(field->report->device, field->usage + offset, value);
    1283                 :            : 
    1284         [ #  # ]:          0 :         if (offset >= field->report_count) {
    1285                 :          0 :                 hid_err(field->report->device, "offset (%d) exceeds report_count (%d)\n",
    1286                 :            :                                 offset, field->report_count);
    1287                 :          0 :                 return -1;
    1288                 :            :         }
    1289         [ #  # ]:          0 :         if (field->logical_minimum < 0) {
    1290         [ #  # ]:          0 :                 if (value != snto32(s32ton(value, size), size)) {
    1291                 :          0 :                         hid_err(field->report->device, "value %d is out of range\n", value);
    1292                 :          0 :                         return -1;
    1293                 :            :                 }
    1294                 :            :         }
    1295                 :          0 :         field->value[offset] = value;
    1296                 :          0 :         return 0;
    1297                 :            : }
    1298                 :            : EXPORT_SYMBOL_GPL(hid_set_field);
    1299                 :            : 
    1300                 :          0 : static struct hid_report *hid_get_report(struct hid_report_enum *report_enum,
    1301                 :            :                 const u8 *data)
    1302                 :            : {
    1303                 :            :         struct hid_report *report;
    1304                 :            :         unsigned int n = 0;     /* Normally report number is 0 */
    1305                 :            : 
    1306                 :            :         /* Device uses numbered reports, data[0] is report number */
    1307         [ #  # ]:          0 :         if (report_enum->numbered)
    1308                 :          0 :                 n = *data;
    1309                 :            : 
    1310                 :          0 :         report = report_enum->report_id_hash[n];
    1311         [ #  # ]:          0 :         if (report == NULL)
    1312         [ #  # ]:          0 :                 dbg_hid("undefined report_id %u received\n", n);
    1313                 :            : 
    1314                 :          0 :         return report;
    1315                 :            : }
    1316                 :            : 
    1317                 :          0 : int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
    1318                 :            :                 int interrupt)
    1319                 :            : {
    1320                 :          0 :         struct hid_report_enum *report_enum = hid->report_enum + type;
    1321                 :            :         struct hid_report *report;
    1322                 :            :         struct hid_driver *hdrv;
    1323                 :            :         unsigned int a;
    1324                 :            :         int rsize, csize = size;
    1325                 :            :         u8 *cdata = data;
    1326                 :            :         int ret = 0;
    1327                 :            : 
    1328                 :          0 :         report = hid_get_report(report_enum, data);
    1329         [ #  # ]:          0 :         if (!report)
    1330                 :            :                 goto out;
    1331                 :            : 
    1332         [ #  # ]:          0 :         if (report_enum->numbered) {
    1333                 :          0 :                 cdata++;
    1334                 :          0 :                 csize--;
    1335                 :            :         }
    1336                 :            : 
    1337                 :          0 :         rsize = ((report->size - 1) >> 3) + 1;
    1338                 :            : 
    1339         [ #  # ]:          0 :         if (rsize > HID_MAX_BUFFER_SIZE)
    1340                 :            :                 rsize = HID_MAX_BUFFER_SIZE;
    1341                 :            : 
    1342         [ #  # ]:          0 :         if (csize < rsize) {
    1343         [ #  # ]:          0 :                 dbg_hid("report %d is too short, (%d < %d)\n", report->id,
    1344                 :            :                                 csize, rsize);
    1345         [ #  # ]:          0 :                 memset(cdata + csize, 0, rsize - csize);
    1346                 :            :         }
    1347                 :            : 
    1348 [ #  # ][ #  # ]:          0 :         if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
    1349                 :          0 :                 hid->hiddev_report_event(hid, report);
    1350                 :          0 :         if (hid->claimed & HID_CLAIMED_HIDRAW) {
    1351                 :            :                 ret = hidraw_report_event(hid, data, size);
    1352                 :            :                 if (ret)
    1353                 :            :                         goto out;
    1354                 :            :         }
    1355                 :            : 
    1356 [ #  # ][ #  # ]:          0 :         if (hid->claimed != HID_CLAIMED_HIDRAW && report->maxfield) {
    1357         [ #  # ]:          0 :                 for (a = 0; a < report->maxfield; a++)
    1358                 :          0 :                         hid_input_field(hid, report->field[a], cdata, interrupt);
    1359                 :          0 :                 hdrv = hid->driver;
    1360 [ #  # ][ #  # ]:          0 :                 if (hdrv && hdrv->report)
    1361                 :          0 :                         hdrv->report(hid, report);
    1362                 :            :         }
    1363                 :            : 
    1364         [ #  # ]:          0 :         if (hid->claimed & HID_CLAIMED_INPUT)
    1365                 :          0 :                 hidinput_report_event(hid, report);
    1366                 :            : out:
    1367                 :          0 :         return ret;
    1368                 :            : }
    1369                 :            : EXPORT_SYMBOL_GPL(hid_report_raw_event);
    1370                 :            : 
    1371                 :            : /**
    1372                 :            :  * hid_input_report - report data from lower layer (usb, bt...)
    1373                 :            :  *
    1374                 :            :  * @hid: hid device
    1375                 :            :  * @type: HID report type (HID_*_REPORT)
    1376                 :            :  * @data: report contents
    1377                 :            :  * @size: size of data parameter
    1378                 :            :  * @interrupt: distinguish between interrupt and control transfers
    1379                 :            :  *
    1380                 :            :  * This is data entry for lower layers.
    1381                 :            :  */
    1382                 :          0 : int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int interrupt)
    1383                 :            : {
    1384                 :            :         struct hid_report_enum *report_enum;
    1385                 :            :         struct hid_driver *hdrv;
    1386                 :            :         struct hid_report *report;
    1387                 :            :         int ret = 0;
    1388                 :            : 
    1389         [ #  # ]:          0 :         if (!hid)
    1390                 :            :                 return -ENODEV;
    1391                 :            : 
    1392         [ #  # ]:          0 :         if (down_trylock(&hid->driver_input_lock))
    1393                 :            :                 return -EBUSY;
    1394                 :            : 
    1395         [ #  # ]:          0 :         if (!hid->driver) {
    1396                 :            :                 ret = -ENODEV;
    1397                 :            :                 goto unlock;
    1398                 :            :         }
    1399                 :          0 :         report_enum = hid->report_enum + type;
    1400                 :            :         hdrv = hid->driver;
    1401                 :            : 
    1402         [ #  # ]:          0 :         if (!size) {
    1403         [ #  # ]:          0 :                 dbg_hid("empty report\n");
    1404                 :            :                 ret = -1;
    1405                 :            :                 goto unlock;
    1406                 :            :         }
    1407                 :            : 
    1408                 :            :         /* Avoid unnecessary overhead if debugfs is disabled */
    1409         [ #  # ]:          0 :         if (!list_empty(&hid->debug_list))
    1410                 :          0 :                 hid_dump_report(hid, type, data, size);
    1411                 :            : 
    1412                 :          0 :         report = hid_get_report(report_enum, data);
    1413                 :            : 
    1414         [ #  # ]:          0 :         if (!report) {
    1415                 :            :                 ret = -1;
    1416                 :            :                 goto unlock;
    1417                 :            :         }
    1418                 :            : 
    1419 [ #  # ][ #  # ]:          0 :         if (hdrv && hdrv->raw_event && hid_match_report(hid, report)) {
                 [ #  # ]
    1420                 :          0 :                 ret = hdrv->raw_event(hid, report, data, size);
    1421         [ #  # ]:          0 :                 if (ret < 0)
    1422                 :            :                         goto unlock;
    1423                 :            :         }
    1424                 :            : 
    1425                 :          0 :         ret = hid_report_raw_event(hid, type, data, size, interrupt);
    1426                 :            : 
    1427                 :            : unlock:
    1428                 :          0 :         up(&hid->driver_input_lock);
    1429                 :          0 :         return ret;
    1430                 :            : }
    1431                 :            : EXPORT_SYMBOL_GPL(hid_input_report);
    1432                 :            : 
    1433                 :          0 : static bool hid_match_one_id(struct hid_device *hdev,
    1434                 :            :                 const struct hid_device_id *id)
    1435                 :            : {
    1436 [ #  # ][ #  # ]:          0 :         return (id->bus == HID_BUS_ANY || id->bus == hdev->bus) &&
    1437 [ #  # ][ #  # ]:          0 :                 (id->group == HID_GROUP_ANY || id->group == hdev->group) &&
    1438 [ #  # ][ #  # ]:          0 :                 (id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
                 [ #  # ]
    1439         [ #  # ]:          0 :                 (id->product == HID_ANY_ID || id->product == hdev->product);
    1440                 :            : }
    1441                 :            : 
    1442                 :          0 : const struct hid_device_id *hid_match_id(struct hid_device *hdev,
    1443                 :            :                 const struct hid_device_id *id)
    1444                 :            : {
    1445         [ #  # ]:          0 :         for (; id->bus; id++)
    1446         [ #  # ]:          0 :                 if (hid_match_one_id(hdev, id))
    1447                 :            :                         return id;
    1448                 :            : 
    1449                 :            :         return NULL;
    1450                 :            : }
    1451                 :            : 
    1452                 :            : static const struct hid_device_id hid_hiddev_list[] = {
    1453                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS) },
    1454                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1) },
    1455                 :            :         { }
    1456                 :            : };
    1457                 :            : 
    1458                 :            : static bool hid_hiddev(struct hid_device *hdev)
    1459                 :            : {
    1460                 :          0 :         return !!hid_match_id(hdev, hid_hiddev_list);
    1461                 :            : }
    1462                 :            : 
    1463                 :            : 
    1464                 :            : static ssize_t
    1465                 :          0 : read_report_descriptor(struct file *filp, struct kobject *kobj,
    1466                 :            :                 struct bin_attribute *attr,
    1467                 :            :                 char *buf, loff_t off, size_t count)
    1468                 :            : {
    1469                 :            :         struct device *dev = container_of(kobj, struct device, kobj);
    1470                 :            :         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    1471                 :            : 
    1472         [ #  # ]:          0 :         if (off >= hdev->rsize)
    1473                 :            :                 return 0;
    1474                 :            : 
    1475         [ #  # ]:          0 :         if (off + count > hdev->rsize)
    1476                 :          0 :                 count = hdev->rsize - off;
    1477                 :            : 
    1478                 :          0 :         memcpy(buf, hdev->rdesc + off, count);
    1479                 :            : 
    1480                 :          0 :         return count;
    1481                 :            : }
    1482                 :            : 
    1483                 :            : static struct bin_attribute dev_bin_attr_report_desc = {
    1484                 :            :         .attr = { .name = "report_descriptor", .mode = 0444 },
    1485                 :            :         .read = read_report_descriptor,
    1486                 :            :         .size = HID_MAX_DESCRIPTOR_SIZE,
    1487                 :            : };
    1488                 :            : 
    1489                 :          0 : int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
    1490                 :            : {
    1491                 :            :         static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
    1492                 :            :                 "Joystick", "Gamepad", "Keyboard", "Keypad",
    1493                 :            :                 "Multi-Axis Controller"
    1494                 :            :         };
    1495                 :            :         const char *type, *bus;
    1496                 :            :         char buf[64];
    1497                 :            :         unsigned int i;
    1498                 :            :         int len;
    1499                 :            :         int ret;
    1500                 :            : 
    1501         [ #  # ]:          0 :         if (hdev->quirks & HID_QUIRK_HIDDEV_FORCE)
    1502                 :          0 :                 connect_mask |= (HID_CONNECT_HIDDEV_FORCE | HID_CONNECT_HIDDEV);
    1503         [ #  # ]:          0 :         if (hdev->quirks & HID_QUIRK_HIDINPUT_FORCE)
    1504                 :          0 :                 connect_mask |= HID_CONNECT_HIDINPUT_FORCE;
    1505         [ #  # ]:          0 :         if (hdev->bus != BUS_USB)
    1506                 :          0 :                 connect_mask &= ~HID_CONNECT_HIDDEV;
    1507         [ #  # ]:          0 :         if (hid_hiddev(hdev))
    1508                 :          0 :                 connect_mask |= HID_CONNECT_HIDDEV_FORCE;
    1509                 :            : 
    1510 [ #  # ][ #  # ]:          0 :         if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
    1511                 :            :                                 connect_mask & HID_CONNECT_HIDINPUT_FORCE))
    1512                 :          0 :                 hdev->claimed |= HID_CLAIMED_INPUT;
    1513                 :            : 
    1514         [ #  # ]:          0 :         if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect &&
           [ #  #  #  # ]
    1515                 :          0 :                         !hdev->hiddev_connect(hdev,
    1516                 :            :                                 connect_mask & HID_CONNECT_HIDDEV_FORCE))
    1517                 :          0 :                 hdev->claimed |= HID_CLAIMED_HIDDEV;
    1518                 :            :         if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev))
    1519                 :            :                 hdev->claimed |= HID_CLAIMED_HIDRAW;
    1520                 :            : 
    1521                 :            :         /* Drivers with the ->raw_event callback set are not required to connect
    1522                 :            :          * to any other listener. */
    1523 [ #  # ][ #  # ]:          0 :         if (!hdev->claimed && !hdev->driver->raw_event) {
    1524                 :          0 :                 hid_err(hdev, "device has no listeners, quitting\n");
    1525                 :          0 :                 return -ENODEV;
    1526                 :            :         }
    1527                 :            : 
    1528 [ #  # ][ #  # ]:          0 :         if ((hdev->claimed & HID_CLAIMED_INPUT) &&
    1529         [ #  # ]:          0 :                         (connect_mask & HID_CONNECT_FF) && hdev->ff_init)
    1530                 :          0 :                 hdev->ff_init(hdev);
    1531                 :            : 
    1532                 :            :         len = 0;
    1533         [ #  # ]:          0 :         if (hdev->claimed & HID_CLAIMED_INPUT)
    1534                 :          0 :                 len += sprintf(buf + len, "input");
    1535         [ #  # ]:          0 :         if (hdev->claimed & HID_CLAIMED_HIDDEV)
    1536         [ #  # ]:          0 :                 len += sprintf(buf + len, "%shiddev%d", len ? "," : "",
    1537                 :            :                                 hdev->minor);
    1538         [ #  # ]:          0 :         if (hdev->claimed & HID_CLAIMED_HIDRAW)
    1539         [ #  # ]:          0 :                 len += sprintf(buf + len, "%shidraw%d", len ? "," : "",
    1540                 :          0 :                                 ((struct hidraw *)hdev->hidraw)->minor);
    1541                 :            : 
    1542                 :            :         type = "Device";
    1543         [ #  # ]:          0 :         for (i = 0; i < hdev->maxcollection; i++) {
    1544                 :          0 :                 struct hid_collection *col = &hdev->collection[i];
    1545 [ #  # ][ #  # ]:          0 :                 if (col->type == HID_COLLECTION_APPLICATION &&
    1546         [ #  # ]:          0 :                    (col->usage & HID_USAGE_PAGE) == HID_UP_GENDESK &&
    1547                 :          0 :                    (col->usage & 0xffff) < ARRAY_SIZE(types)) {
    1548                 :          0 :                         type = types[col->usage & 0xffff];
    1549                 :          0 :                         break;
    1550                 :            :                 }
    1551                 :            :         }
    1552                 :            : 
    1553      [ #  #  # ]:          0 :         switch (hdev->bus) {
    1554                 :            :         case BUS_USB:
    1555                 :            :                 bus = "USB";
    1556                 :            :                 break;
    1557                 :            :         case BUS_BLUETOOTH:
    1558                 :            :                 bus = "BLUETOOTH";
    1559                 :          0 :                 break;
    1560                 :            :         default:
    1561                 :            :                 bus = "<UNKNOWN>";
    1562                 :            :         }
    1563                 :            : 
    1564                 :          0 :         ret = device_create_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
    1565         [ #  # ]:          0 :         if (ret)
    1566                 :          0 :                 hid_warn(hdev,
    1567                 :            :                          "can't create sysfs report descriptor attribute err: %d\n", ret);
    1568                 :            : 
    1569                 :          0 :         hid_info(hdev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
    1570                 :            :                  buf, bus, hdev->version >> 8, hdev->version & 0xff,
    1571                 :            :                  type, hdev->name, hdev->phys);
    1572                 :            : 
    1573                 :          0 :         return 0;
    1574                 :            : }
    1575                 :            : EXPORT_SYMBOL_GPL(hid_connect);
    1576                 :            : 
    1577                 :          0 : void hid_disconnect(struct hid_device *hdev)
    1578                 :            : {
    1579                 :          0 :         device_remove_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
    1580         [ #  # ]:          0 :         if (hdev->claimed & HID_CLAIMED_INPUT)
    1581                 :          0 :                 hidinput_disconnect(hdev);
    1582         [ #  # ]:          0 :         if (hdev->claimed & HID_CLAIMED_HIDDEV)
    1583                 :          0 :                 hdev->hiddev_disconnect(hdev);
    1584                 :            :         if (hdev->claimed & HID_CLAIMED_HIDRAW)
    1585                 :            :                 hidraw_disconnect(hdev);
    1586                 :          0 : }
    1587                 :            : EXPORT_SYMBOL_GPL(hid_disconnect);
    1588                 :            : 
    1589                 :            : /*
    1590                 :            :  * A list of devices for which there is a specialized driver on HID bus.
    1591                 :            :  *
    1592                 :            :  * Please note that for multitouch devices (driven by hid-multitouch driver),
    1593                 :            :  * there is a proper autodetection and autoloading in place (based on presence
    1594                 :            :  * of HID_DG_CONTACTID), so those devices don't need to be added to this list,
    1595                 :            :  * as we are doing the right thing in hid_scan_usage().
    1596                 :            :  *
    1597                 :            :  * Autodetection for (USB) HID sensor hubs exists too. If a collection of type
    1598                 :            :  * physical is found inside a usage page of type sensor, hid-sensor-hub will be
    1599                 :            :  * used as a driver. See hid_scan_report().
    1600                 :            :  */
    1601                 :            : static const struct hid_device_id hid_have_special_driver[] = {
    1602                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
    1603                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
    1604                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
    1605                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
    1606                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0xf705) },
    1607                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) },
    1608                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICMOUSE) },
    1609                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MAGICTRACKPAD) },
    1610                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
    1611                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
    1612                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
    1613                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) },
    1614                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) },
    1615                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) },
    1616                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) },
    1617                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) },
    1618                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) },
    1619                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) },
    1620                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) },
    1621                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ANSI) },
    1622                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_ISO) },
    1623                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_MINI_JIS) },
    1624                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI) },
    1625                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO) },
    1626                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS) },
    1627                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) },
    1628                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) },
    1629                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) },
    1630                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL) },
    1631                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL2) },
    1632                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL3) },
    1633                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) },
    1634                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL5) },
    1635                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI) },
    1636                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO) },
    1637                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS) },
    1638                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) },
    1639                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) },
    1640                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) },
    1641                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
    1642                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
    1643                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
    1644                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
    1645                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
    1646                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
    1647                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
    1648                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
    1649                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
    1650                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
    1651                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
    1652                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
    1653                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) },
    1654                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) },
    1655                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) },
    1656                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) },
    1657                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) },
    1658                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) },
    1659                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI) },
    1660                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO) },
    1661                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS) },
    1662                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) },
    1663                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) },
    1664                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) },
    1665                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) },
    1666                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) },
    1667                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) },
    1668                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) },
    1669                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) },
    1670                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) },
    1671                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI) },
    1672                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO) },
    1673                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS) },
    1674                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) },
    1675                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) },
    1676                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) },
    1677                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
    1678                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
    1679                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
    1680                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ANSI) },
    1681                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO) },
    1682                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
    1683                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
    1684                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AUREAL, USB_DEVICE_ID_AUREAL_W01RN) },
    1685                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
    1686                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) },
    1687                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) },
    1688                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
    1689                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION_SOLAR) },
    1690                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
    1691                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS) },
    1692                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_WIRELESS2) },
    1693                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
    1694                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
    1695                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
    1696                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
    1697                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
    1698                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_4) },
    1699                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
    1700                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
    1701                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0011) },
    1702                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
    1703                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) },
    1704                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0030) },
    1705                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II) },
    1706                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
    1707                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
    1708                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR) },
    1709                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003) },
    1710                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0012) },
    1711                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
    1712                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
    1713                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_3) },
    1714                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK, USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP) },
    1715                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_KEYBOARD) },
    1716                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) },
    1717                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) },
    1718                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A072) },
    1719                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A081) },
    1720                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_HUION, USB_DEVICE_ID_HUION_580) },
    1721                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_JESS2, USB_DEVICE_ID_JESS2_COLOR_RUMBLE_PAD) },
    1722                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ION, USB_DEVICE_ID_ICADE) },
    1723                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) },
    1724                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) },
    1725                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) },
    1726                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) },
    1727                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) },
    1728                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) },
    1729                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) },
    1730                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) },
    1731                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
    1732                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
    1733                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
    1734                 :            : #if IS_ENABLED(CONFIG_HID_LENOVO_TPKBD)
    1735                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
    1736                 :            : #endif
    1737                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
    1738                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
    1739                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
    1740                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) },
    1741                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) },
    1742                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
    1743                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) },
    1744                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
    1745                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD) },
    1746                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500) },
    1747                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_EXTREME_3D) },
    1748                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL) },
    1749                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD) },
    1750                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD) },
    1751                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2_2) },
    1752                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_F3D) },
    1753                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ) },
    1754                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FORCE3D_PRO) },
    1755                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_FLIGHT_SYSTEM_G940) },
    1756                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL) },
    1757                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2) },
    1758                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_VIBRATION_WHEEL) },
    1759                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFP_WHEEL) },
    1760                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_DFGT_WHEEL) },
    1761                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G25_WHEEL) },
    1762                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_G27_WHEEL) },
    1763                 :            : #if IS_ENABLED(CONFIG_HID_LOGITECH_DJ)
    1764                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER) },
    1765                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2) },
    1766                 :            : #endif
    1767                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL) },
    1768                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2) },
    1769                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
    1770                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
    1771                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
    1772                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
    1773                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) },
    1774                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
    1775                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K) },
    1776                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K_JP) },
    1777                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K) },
    1778                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_USB) },
    1779                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) },
    1780                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) },
    1781                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
    1782                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
    1783                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1) },
    1784                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2) },
    1785                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_3) },
    1786                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_4) },
    1787                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_5) },
    1788                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_6) },
    1789                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_7) },
    1790                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_8) },
    1791                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_9) },
    1792                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_10) },
    1793                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_11) },
    1794                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_12) },
    1795                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_13) },
    1796                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_14) },
    1797                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_15) },
    1798                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_16) },
    1799                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_17) },
    1800                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
    1801                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) },
    1802                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
    1803                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
    1804                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
    1805                 :            : #if IS_ENABLED(CONFIG_HID_ROCCAT)
    1806                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) },
    1807                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) },
    1808                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKUFX) },
    1809                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
    1810                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPLUS) },
    1811                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE) },
    1812                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEPURE_OPTICAL) },
    1813                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONEXTD) },
    1814                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KOVAPLUS) },
    1815                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_LUA) },
    1816                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) },
    1817                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS) },
    1818                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_RYOS_MK) },
    1819                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_RYOS_MK_GLOW) },
    1820                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_RYOS_MK_PRO) },
    1821                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_SAVU) },
    1822                 :            : #endif
    1823                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) },
    1824                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
    1825                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
    1826                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS9200_TOUCH) },
    1827                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SIS2_TOUCH, USB_DEVICE_ID_SIS817_TOUCH) },
    1828                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
    1829                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_BUZZ_CONTROLLER) },
    1830                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_WIRELESS_BUZZ_CONTROLLER) },
    1831                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
    1832                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
    1833                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
    1834                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
    1835                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
    1836                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) },
    1837                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) },
    1838                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
    1839                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THINGM, USB_DEVICE_ID_BLINK1) },
    1840                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
    1841                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
    1842                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb323) },
    1843                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb324) },
    1844                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb651) },
    1845                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb653) },
    1846                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb654) },
    1847                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb65a) },
    1848                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE_BT) },
    1849                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_TIVO, USB_DEVICE_ID_TIVO_SLIDE) },
    1850                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) },
    1851                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) },
    1852                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) },
    1853                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) },
    1854                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) },
    1855                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) },
    1856                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) },
    1857                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) },
    1858                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850) },
    1859                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) },
    1860                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
    1861                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
    1862                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) },
    1863                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_3_PRO) },
    1864                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_DUAL_BOX_PRO) },
    1865                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SUPER_JOY_BOX_5_PRO) },
    1866                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH) },
    1867                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) },
    1868                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_5_8_INCH) },
    1869                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SLIM_TABLET_12_1_INCH) },
    1870                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_Q_PAD) },
    1871                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_PID_0038) },
    1872                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_10_6_INCH) },
    1873                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_MEDIA_TABLET_14_1_INCH) },
    1874                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) },
    1875                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
    1876                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) },
    1877                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
    1878                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
    1879                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
    1880                 :            : 
    1881                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT) },
    1882                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE) },
    1883                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_WIIMOTE2) },
    1884                 :            :         { }
    1885                 :            : };
    1886                 :            : 
    1887                 :            : struct hid_dynid {
    1888                 :            :         struct list_head list;
    1889                 :            :         struct hid_device_id id;
    1890                 :            : };
    1891                 :            : 
    1892                 :            : /**
    1893                 :            :  * store_new_id - add a new HID device ID to this driver and re-probe devices
    1894                 :            :  * @driver: target device driver
    1895                 :            :  * @buf: buffer for scanning device ID data
    1896                 :            :  * @count: input size
    1897                 :            :  *
    1898                 :            :  * Adds a new dynamic hid device ID to this driver,
    1899                 :            :  * and causes the driver to probe for all devices again.
    1900                 :            :  */
    1901                 :          0 : static ssize_t store_new_id(struct device_driver *drv, const char *buf,
    1902                 :            :                 size_t count)
    1903                 :            : {
    1904                 :            :         struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
    1905                 :            :         struct hid_dynid *dynid;
    1906                 :            :         __u32 bus, vendor, product;
    1907                 :          0 :         unsigned long driver_data = 0;
    1908                 :            :         int ret;
    1909                 :            : 
    1910                 :          0 :         ret = sscanf(buf, "%x %x %x %lx",
    1911                 :            :                         &bus, &vendor, &product, &driver_data);
    1912         [ #  # ]:          0 :         if (ret < 3)
    1913                 :            :                 return -EINVAL;
    1914                 :            : 
    1915                 :            :         dynid = kzalloc(sizeof(*dynid), GFP_KERNEL);
    1916         [ #  # ]:          0 :         if (!dynid)
    1917                 :            :                 return -ENOMEM;
    1918                 :            : 
    1919                 :          0 :         dynid->id.bus = bus;
    1920                 :          0 :         dynid->id.group = HID_GROUP_ANY;
    1921                 :          0 :         dynid->id.vendor = vendor;
    1922                 :          0 :         dynid->id.product = product;
    1923                 :          0 :         dynid->id.driver_data = driver_data;
    1924                 :            : 
    1925                 :            :         spin_lock(&hdrv->dyn_lock);
    1926                 :          0 :         list_add_tail(&dynid->list, &hdrv->dyn_list);
    1927                 :            :         spin_unlock(&hdrv->dyn_lock);
    1928                 :            : 
    1929                 :          0 :         ret = driver_attach(&hdrv->driver);
    1930                 :            : 
    1931         [ #  # ]:          0 :         return ret ? : count;
    1932                 :            : }
    1933                 :            : static DRIVER_ATTR(new_id, S_IWUSR, NULL, store_new_id);
    1934                 :            : 
    1935                 :          0 : static void hid_free_dynids(struct hid_driver *hdrv)
    1936                 :            : {
    1937                 :            :         struct hid_dynid *dynid, *n;
    1938                 :            : 
    1939                 :            :         spin_lock(&hdrv->dyn_lock);
    1940         [ #  # ]:          0 :         list_for_each_entry_safe(dynid, n, &hdrv->dyn_list, list) {
    1941                 :            :                 list_del(&dynid->list);
    1942                 :          0 :                 kfree(dynid);
    1943                 :            :         }
    1944                 :            :         spin_unlock(&hdrv->dyn_lock);
    1945                 :          0 : }
    1946                 :            : 
    1947                 :          0 : static const struct hid_device_id *hid_match_device(struct hid_device *hdev,
    1948                 :            :                 struct hid_driver *hdrv)
    1949                 :            : {
    1950                 :            :         struct hid_dynid *dynid;
    1951                 :            : 
    1952                 :            :         spin_lock(&hdrv->dyn_lock);
    1953         [ #  # ]:          0 :         list_for_each_entry(dynid, &hdrv->dyn_list, list) {
    1954         [ #  # ]:          0 :                 if (hid_match_one_id(hdev, &dynid->id)) {
    1955                 :            :                         spin_unlock(&hdrv->dyn_lock);
    1956                 :          0 :                         return &dynid->id;
    1957                 :            :                 }
    1958                 :            :         }
    1959                 :            :         spin_unlock(&hdrv->dyn_lock);
    1960                 :            : 
    1961                 :          0 :         return hid_match_id(hdev, hdrv->id_table);
    1962                 :            : }
    1963                 :            : 
    1964                 :          0 : static int hid_bus_match(struct device *dev, struct device_driver *drv)
    1965                 :            : {
    1966                 :          0 :         struct hid_driver *hdrv = container_of(drv, struct hid_driver, driver);
    1967                 :          0 :         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    1968                 :            : 
    1969                 :          0 :         return hid_match_device(hdev, hdrv) != NULL;
    1970                 :            : }
    1971                 :            : 
    1972                 :          0 : static int hid_device_probe(struct device *dev)
    1973                 :            : {
    1974                 :          0 :         struct hid_driver *hdrv = container_of(dev->driver,
    1975                 :            :                         struct hid_driver, driver);
    1976                 :          0 :         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    1977                 :            :         const struct hid_device_id *id;
    1978                 :            :         int ret = 0;
    1979                 :            : 
    1980         [ #  # ]:          0 :         if (down_interruptible(&hdev->driver_lock))
    1981                 :            :                 return -EINTR;
    1982         [ #  # ]:          0 :         if (down_interruptible(&hdev->driver_input_lock)) {
    1983                 :            :                 ret = -EINTR;
    1984                 :            :                 goto unlock_driver_lock;
    1985                 :            :         }
    1986                 :          0 :         hdev->io_started = false;
    1987                 :            : 
    1988         [ #  # ]:          0 :         if (!hdev->driver) {
    1989                 :          0 :                 id = hid_match_device(hdev, hdrv);
    1990         [ #  # ]:          0 :                 if (id == NULL) {
    1991                 :            :                         ret = -ENODEV;
    1992                 :            :                         goto unlock;
    1993                 :            :                 }
    1994                 :            : 
    1995                 :          0 :                 hdev->driver = hdrv;
    1996         [ #  # ]:          0 :                 if (hdrv->probe) {
    1997                 :          0 :                         ret = hdrv->probe(hdev, id);
    1998                 :            :                 } else { /* default probe */
    1999                 :          0 :                         ret = hid_open_report(hdev);
    2000         [ #  # ]:          0 :                         if (!ret)
    2001                 :            :                                 ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
    2002                 :            :                 }
    2003         [ #  # ]:          0 :                 if (ret) {
    2004                 :          0 :                         hid_close_report(hdev);
    2005                 :          0 :                         hdev->driver = NULL;
    2006                 :            :                 }
    2007                 :            :         }
    2008                 :            : unlock:
    2009         [ #  # ]:          0 :         if (!hdev->io_started)
    2010                 :          0 :                 up(&hdev->driver_input_lock);
    2011                 :            : unlock_driver_lock:
    2012                 :          0 :         up(&hdev->driver_lock);
    2013                 :          0 :         return ret;
    2014                 :            : }
    2015                 :            : 
    2016                 :          0 : static int hid_device_remove(struct device *dev)
    2017                 :            : {
    2018                 :          0 :         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    2019                 :            :         struct hid_driver *hdrv;
    2020                 :            :         int ret = 0;
    2021                 :            : 
    2022         [ #  # ]:          0 :         if (down_interruptible(&hdev->driver_lock))
    2023                 :            :                 return -EINTR;
    2024         [ #  # ]:          0 :         if (down_interruptible(&hdev->driver_input_lock)) {
    2025                 :            :                 ret = -EINTR;
    2026                 :            :                 goto unlock_driver_lock;
    2027                 :            :         }
    2028                 :          0 :         hdev->io_started = false;
    2029                 :            : 
    2030                 :          0 :         hdrv = hdev->driver;
    2031         [ #  # ]:          0 :         if (hdrv) {
    2032         [ #  # ]:          0 :                 if (hdrv->remove)
    2033                 :          0 :                         hdrv->remove(hdev);
    2034                 :            :                 else /* default remove */
    2035                 :            :                         hid_hw_stop(hdev);
    2036                 :          0 :                 hid_close_report(hdev);
    2037                 :          0 :                 hdev->driver = NULL;
    2038                 :            :         }
    2039                 :            : 
    2040         [ #  # ]:          0 :         if (!hdev->io_started)
    2041                 :          0 :                 up(&hdev->driver_input_lock);
    2042                 :            : unlock_driver_lock:
    2043                 :          0 :         up(&hdev->driver_lock);
    2044                 :          0 :         return ret;
    2045                 :            : }
    2046                 :            : 
    2047                 :          0 : static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
    2048                 :            :                              char *buf)
    2049                 :            : {
    2050                 :            :         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    2051                 :            :         int len;
    2052                 :            : 
    2053                 :          0 :         len = snprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
    2054                 :          0 :                        hdev->bus, hdev->group, hdev->vendor, hdev->product);
    2055                 :            : 
    2056                 :          0 :         return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
    2057                 :            : }
    2058                 :            : static DEVICE_ATTR_RO(modalias);
    2059                 :            : 
    2060                 :            : static struct attribute *hid_dev_attrs[] = {
    2061                 :            :         &dev_attr_modalias.attr,
    2062                 :            :         NULL,
    2063                 :            : };
    2064                 :            : ATTRIBUTE_GROUPS(hid_dev);
    2065                 :            : 
    2066                 :          0 : static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
    2067                 :            : {
    2068                 :            :         struct hid_device *hdev = container_of(dev, struct hid_device, dev);
    2069                 :            : 
    2070         [ #  # ]:          0 :         if (add_uevent_var(env, "HID_ID=%04X:%08X:%08X",
    2071                 :          0 :                         hdev->bus, hdev->vendor, hdev->product))
    2072                 :            :                 return -ENOMEM;
    2073                 :            : 
    2074         [ #  # ]:          0 :         if (add_uevent_var(env, "HID_NAME=%s", hdev->name))
    2075                 :            :                 return -ENOMEM;
    2076                 :            : 
    2077         [ #  # ]:          0 :         if (add_uevent_var(env, "HID_PHYS=%s", hdev->phys))
    2078                 :            :                 return -ENOMEM;
    2079                 :            : 
    2080         [ #  # ]:          0 :         if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq))
    2081                 :            :                 return -ENOMEM;
    2082                 :            : 
    2083         [ #  # ]:          0 :         if (add_uevent_var(env, "MODALIAS=hid:b%04Xg%04Xv%08Xp%08X",
    2084                 :          0 :                            hdev->bus, hdev->group, hdev->vendor, hdev->product))
    2085                 :            :                 return -ENOMEM;
    2086                 :            : 
    2087                 :          0 :         return 0;
    2088                 :            : }
    2089                 :            : 
    2090                 :            : static struct bus_type hid_bus_type = {
    2091                 :            :         .name           = "hid",
    2092                 :            :         .dev_groups     = hid_dev_groups,
    2093                 :            :         .match          = hid_bus_match,
    2094                 :            :         .probe          = hid_device_probe,
    2095                 :            :         .remove         = hid_device_remove,
    2096                 :            :         .uevent         = hid_uevent,
    2097                 :            : };
    2098                 :            : 
    2099                 :            : /* a list of devices that shouldn't be handled by HID core at all */
    2100                 :            : static const struct hid_device_id hid_ignore_list[] = {
    2101                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR) },
    2102                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302) },
    2103                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ADS_TECH, USB_DEVICE_ID_ADS_TECH_RADIO_SI470X) },
    2104                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01) },
    2105                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10) },
    2106                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20) },
    2107                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21) },
    2108                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22) },
    2109                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23) },
    2110                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24) },
    2111                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1) },
    2112                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) },
    2113                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM)},
    2114                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK, USB_DEVICE_ID_ASUSTEK_LCM2)},
    2115                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
    2116                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_AXENTIA, USB_DEVICE_ID_AXENTIA_FM_RADIO) },
    2117                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
    2118                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
    2119                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) },
    2120                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CMEDIA, USB_DEVICE_ID_CM109) },
    2121                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM) },
    2122                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE) },
    2123                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DEALEXTREAME, USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701) },
    2124                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE) },
    2125                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20) },
    2126                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x0004) },
    2127                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, 0x000a) },
    2128                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) },
    2129                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) },
    2130                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) },
    2131                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) },
    2132                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) },
    2133                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0004) },
    2134                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30) },
    2135                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30) },
    2136                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT) },
    2137                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT) },
    2138                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT) },
    2139                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT) },
    2140                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT) },
    2141                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL) },
    2142                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_SUPER_Q2) },
    2143                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_GOGOPEN) },
    2144                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GOTOP, USB_DEVICE_ID_PENPOWER) },
    2145                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GRETAGMACBETH, USB_DEVICE_ID_GRETAGMACBETH_HUEY) },
    2146                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE) },
    2147                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB) },
    2148                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_RADIOSHARK) },
    2149                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90) },
    2150                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100) },
    2151                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101) },
    2152                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103) },
    2153                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104) },
    2154                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105) },
    2155                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106) },
    2156                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107) },
    2157                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108) },
    2158                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200) },
    2159                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201) },
    2160                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202) },
    2161                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203) },
    2162                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204) },
    2163                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205) },
    2164                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206) },
    2165                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207) },
    2166                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300) },
    2167                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301) },
    2168                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302) },
    2169                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303) },
    2170                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304) },
    2171                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305) },
    2172                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306) },
    2173                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307) },
    2174                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308) },
    2175                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309) },
    2176                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400) },
    2177                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401) },
    2178                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402) },
    2179                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403) },
    2180                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404) },
    2181                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405) },
    2182                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500) },
    2183                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501) },
    2184                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502) },
    2185                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503) },
    2186                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504) },
    2187                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000) },
    2188                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001) },
    2189                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002) },
    2190                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003) },
    2191                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004) },
    2192                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005) },
    2193                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006) },
    2194                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) },
    2195                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) },
    2196                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_410) },
    2197                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_510) },
    2198                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) },
    2199                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) },
    2200                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) },
    2201                 :            :         { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_KYE, 0x0058) },
    2202                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) },
    2203                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY2) },
    2204                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) },
    2205                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY2) },
    2206                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY) },
    2207                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY2) },
    2208                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYVOLTAGE) },
    2209                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYCURRENT) },
    2210                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTIME) },
    2211                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYTEMPERATURE) },
    2212                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MICROCASSYPH) },
    2213                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM) },
    2214                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP) },
    2215                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP) },
    2216                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIC) },
    2217                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIB) },
    2218                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY) },
    2219                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2) },
    2220                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM) },
    2221                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOTOR) },
    2222                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB) },
    2223                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT) },
    2224                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER) },
    2225                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL) },
    2226                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST) },
    2227                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER) },
    2228                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOSTANALYSER2) },
    2229                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_ABSESP) },
    2230                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_AUTODATABUS) },
    2231                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MCT) },
    2232                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HYBRID) },
    2233                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_HEATCONTROL) },
    2234                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MADCATZ, USB_DEVICE_ID_MADCATZ_BEATPAD) },
    2235                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS) },
    2236                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS) },
    2237                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT1) },
    2238                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICKIT2) },
    2239                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY) },
    2240                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100) },
    2241                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20) },
    2242                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30) },
    2243                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100) },
    2244                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108) },
    2245                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118) },
    2246                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200) },
    2247                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300) },
    2248                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400) },
    2249                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500) },
    2250                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0001) },
    2251                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0002) },
    2252                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0003) },
    2253                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PANJIT, 0x0004) },
    2254                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_PHILIPS, USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE) },
    2255                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_POWERCOM, USB_DEVICE_ID_POWERCOM_UPS) },
    2256                 :            : #if defined(CONFIG_MOUSE_SYNAPTICS_USB) || defined(CONFIG_MOUSE_SYNAPTICS_USB_MODULE)
    2257                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP) },
    2258                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_INT_TP) },
    2259                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_CPAD) },
    2260                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_STICK) },
    2261                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WP) },
    2262                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_COMP_TP) },
    2263                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_WTP) },
    2264                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_DPAD) },
    2265                 :            : #endif
    2266                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO) },
    2267                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) },
    2268                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) },
    2269                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) },
    2270                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) },
    2271                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WACOM, HID_ANY_ID) },
    2272                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20) },
    2273                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20) },
    2274                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT) },
    2275                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K) },
    2276                 :            :         { }
    2277                 :            : };
    2278                 :            : 
    2279                 :            : /**
    2280                 :            :  * hid_mouse_ignore_list - mouse devices which should not be handled by the hid layer
    2281                 :            :  *
    2282                 :            :  * There are composite devices for which we want to ignore only a certain
    2283                 :            :  * interface. This is a list of devices for which only the mouse interface will
    2284                 :            :  * be ignored. This allows a dedicated driver to take care of the interface.
    2285                 :            :  */
    2286                 :            : static const struct hid_device_id hid_mouse_ignore_list[] = {
    2287                 :            :         /* appletouch driver */
    2288                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI) },
    2289                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO) },
    2290                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI) },
    2291                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO) },
    2292                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS) },
    2293                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI) },
    2294                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO) },
    2295                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS) },
    2296                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI) },
    2297                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO) },
    2298                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS) },
    2299                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI) },
    2300                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO) },
    2301                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS) },
    2302                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI) },
    2303                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO) },
    2304                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS) },
    2305                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
    2306                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
    2307                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
    2308                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
    2309                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
    2310                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
    2311                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
    2312                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
    2313                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
    2314                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
    2315                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
    2316                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
    2317                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI) },
    2318                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_ISO) },
    2319                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5_JIS) },
    2320                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI) },
    2321                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO) },
    2322                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS) },
    2323                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI) },
    2324                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_ISO) },
    2325                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6_JIS) },
    2326                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI) },
    2327                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO) },
    2328                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS) },
    2329                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI) },
    2330                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_ISO) },
    2331                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7_JIS) },
    2332                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI) },
    2333                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO) },
    2334                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS) },
    2335                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI) },
    2336                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_ISO) },
    2337                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING8_JIS) },
    2338                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
    2339                 :            :         { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
    2340                 :            :         { }
    2341                 :            : };
    2342                 :            : 
    2343                 :          0 : bool hid_ignore(struct hid_device *hdev)
    2344                 :            : {
    2345         [ #  # ]:          0 :         if (hdev->quirks & HID_QUIRK_NO_IGNORE)
    2346                 :            :                 return false;
    2347         [ #  # ]:          0 :         if (hdev->quirks & HID_QUIRK_IGNORE)
    2348                 :            :                 return true;
    2349                 :            : 
    2350   [ #  #  #  #  :          0 :         switch (hdev->vendor) {
             #  #  #  # ]
    2351                 :            :         case USB_VENDOR_ID_CODEMERCS:
    2352                 :            :                 /* ignore all Code Mercenaries IOWarrior devices */
    2353         [ #  # ]:          0 :                 if (hdev->product >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST &&
    2354                 :            :                                 hdev->product <= USB_DEVICE_ID_CODEMERCS_IOW_LAST)
    2355                 :            :                         return true;
    2356                 :            :                 break;
    2357                 :            :         case USB_VENDOR_ID_LOGITECH:
    2358         [ #  # ]:          0 :                 if (hdev->product >= USB_DEVICE_ID_LOGITECH_HARMONY_FIRST &&
    2359                 :            :                                 hdev->product <= USB_DEVICE_ID_LOGITECH_HARMONY_LAST)
    2360                 :            :                         return true;
    2361                 :            :                 /*
    2362                 :            :                  * The Keene FM transmitter USB device has the same USB ID as
    2363                 :            :                  * the Logitech AudioHub Speaker, but it should ignore the hid.
    2364                 :            :                  * Check if the name is that of the Keene device.
    2365                 :            :                  * For reference: the name of the AudioHub is
    2366                 :            :                  * "HOLTEK  AudioHub Speaker".
    2367                 :            :                  */
    2368 [ #  # ][ #  # ]:          0 :                 if (hdev->product == USB_DEVICE_ID_LOGITECH_AUDIOHUB &&
    2369                 :          0 :                         !strcmp(hdev->name, "HOLTEK  B-LINK USB Audio  "))
    2370                 :            :                                 return true;
    2371                 :            :                 break;
    2372                 :            :         case USB_VENDOR_ID_SOUNDGRAPH:
    2373         [ #  # ]:          0 :                 if (hdev->product >= USB_DEVICE_ID_SOUNDGRAPH_IMON_FIRST &&
    2374                 :            :                     hdev->product <= USB_DEVICE_ID_SOUNDGRAPH_IMON_LAST)
    2375                 :            :                         return true;
    2376                 :            :                 break;
    2377                 :            :         case USB_VENDOR_ID_HANWANG:
    2378         [ #  # ]:          0 :                 if (hdev->product >= USB_DEVICE_ID_HANWANG_TABLET_FIRST &&
    2379                 :            :                     hdev->product <= USB_DEVICE_ID_HANWANG_TABLET_LAST)
    2380                 :            :                         return true;
    2381                 :            :                 break;
    2382                 :            :         case USB_VENDOR_ID_JESS:
    2383 [ #  # ][ #  # ]:          0 :                 if (hdev->product == USB_DEVICE_ID_JESS_YUREX &&
    2384                 :          0 :                                 hdev->type == HID_TYPE_USBNONE)
    2385                 :            :                         return true;
    2386                 :            :                 break;
    2387                 :            :         case USB_VENDOR_ID_VELLEMAN:
    2388                 :            :                 /* These are not HID devices.  They are handled by comedi. */
    2389         [ #  # ]:          0 :                 if ((hdev->product >= USB_DEVICE_ID_VELLEMAN_K8055_FIRST &&
    2390                 :          0 :                      hdev->product <= USB_DEVICE_ID_VELLEMAN_K8055_LAST) ||
    2391                 :            :                     (hdev->product >= USB_DEVICE_ID_VELLEMAN_K8061_FIRST &&
    2392                 :            :                      hdev->product <= USB_DEVICE_ID_VELLEMAN_K8061_LAST))
    2393                 :            :                         return true;
    2394                 :            :                 break;
    2395                 :            :         case USB_VENDOR_ID_ATMEL_V_USB:
    2396                 :            :                 /* Masterkit MA901 usb radio based on Atmel tiny85 chip and
    2397                 :            :                  * it has the same USB ID as many Atmel V-USB devices. This
    2398                 :            :                  * usb radio is handled by radio-ma901.c driver so we want
    2399                 :            :                  * ignore the hid. Check the name, bus, product and ignore
    2400                 :            :                  * if we have MA901 usb radio.
    2401                 :            :                  */
    2402 [ #  # ][ #  # ]:          0 :                 if (hdev->product == USB_DEVICE_ID_ATMEL_V_USB &&
    2403         [ #  # ]:          0 :                         hdev->bus == BUS_USB &&
    2404                 :          0 :                         strncmp(hdev->name, "www.masterkit.ru MA901", 22) == 0)
    2405                 :            :                         return true;
    2406                 :            :                 break;
    2407                 :            :         }
    2408                 :            : 
    2409   [ #  #  #  # ]:          0 :         if (hdev->type == HID_TYPE_USBMOUSE &&
    2410                 :          0 :                         hid_match_id(hdev, hid_mouse_ignore_list))
    2411                 :            :                 return true;
    2412                 :            : 
    2413                 :          0 :         return !!hid_match_id(hdev, hid_ignore_list);
    2414                 :            : }
    2415                 :            : EXPORT_SYMBOL_GPL(hid_ignore);
    2416                 :            : 
    2417                 :          0 : int hid_add_device(struct hid_device *hdev)
    2418                 :            : {
    2419                 :            :         static atomic_t id = ATOMIC_INIT(0);
    2420                 :            :         int ret;
    2421                 :            : 
    2422 [ #  # ][ #  # ]:          0 :         if (WARN_ON(hdev->status & HID_STAT_ADDED))
    2423                 :            :                 return -EBUSY;
    2424                 :            : 
    2425                 :            :         /* we need to kill them here, otherwise they will stay allocated to
    2426                 :            :          * wait for coming driver */
    2427         [ #  # ]:          0 :         if (hid_ignore(hdev))
    2428                 :            :                 return -ENODEV;
    2429                 :            : 
    2430                 :            :         /*
    2431                 :            :          * Read the device report descriptor once and use as template
    2432                 :            :          * for the driver-specific modifications.
    2433                 :            :          */
    2434                 :          0 :         ret = hdev->ll_driver->parse(hdev);
    2435         [ #  # ]:          0 :         if (ret)
    2436                 :            :                 return ret;
    2437         [ #  # ]:          0 :         if (!hdev->dev_rdesc)
    2438                 :            :                 return -ENODEV;
    2439                 :            : 
    2440                 :            :         /*
    2441                 :            :          * Scan generic devices for group information
    2442                 :            :          */
    2443   [ #  #  #  # ]:          0 :         if (hid_ignore_special_drivers ||
    2444                 :          0 :             !hid_match_id(hdev, hid_have_special_driver)) {
    2445                 :          0 :                 ret = hid_scan_report(hdev);
    2446         [ #  # ]:          0 :                 if (ret)
    2447                 :          0 :                         hid_warn(hdev, "bad device descriptor (%d)\n", ret);
    2448                 :            :         }
    2449                 :            : 
    2450                 :            :         /* XXX hack, any other cleaner solution after the driver core
    2451                 :            :          * is converted to allow more than 20 bytes as the device name? */
    2452                 :          0 :         dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus,
    2453                 :            :                      hdev->vendor, hdev->product, atomic_inc_return(&id));
    2454                 :            : 
    2455                 :          0 :         hid_debug_register(hdev, dev_name(&hdev->dev));
    2456                 :          0 :         ret = device_add(&hdev->dev);
    2457         [ #  # ]:          0 :         if (!ret)
    2458                 :          0 :                 hdev->status |= HID_STAT_ADDED;
    2459                 :            :         else
    2460                 :          0 :                 hid_debug_unregister(hdev);
    2461                 :            : 
    2462                 :          0 :         return ret;
    2463                 :            : }
    2464                 :            : EXPORT_SYMBOL_GPL(hid_add_device);
    2465                 :            : 
    2466                 :            : /**
    2467                 :            :  * hid_allocate_device - allocate new hid device descriptor
    2468                 :            :  *
    2469                 :            :  * Allocate and initialize hid device, so that hid_destroy_device might be
    2470                 :            :  * used to free it.
    2471                 :            :  *
    2472                 :            :  * New hid_device pointer is returned on success, otherwise ERR_PTR encoded
    2473                 :            :  * error value.
    2474                 :            :  */
    2475                 :          0 : struct hid_device *hid_allocate_device(void)
    2476                 :            : {
    2477                 :            :         struct hid_device *hdev;
    2478                 :            :         int ret = -ENOMEM;
    2479                 :            : 
    2480                 :            :         hdev = kzalloc(sizeof(*hdev), GFP_KERNEL);
    2481         [ #  # ]:          0 :         if (hdev == NULL)
    2482                 :            :                 return ERR_PTR(ret);
    2483                 :            : 
    2484                 :          0 :         device_initialize(&hdev->dev);
    2485                 :          0 :         hdev->dev.release = hid_device_release;
    2486                 :          0 :         hdev->dev.bus = &hid_bus_type;
    2487                 :            : 
    2488                 :          0 :         hid_close_report(hdev);
    2489                 :            : 
    2490                 :          0 :         init_waitqueue_head(&hdev->debug_wait);
    2491                 :          0 :         INIT_LIST_HEAD(&hdev->debug_list);
    2492                 :          0 :         spin_lock_init(&hdev->debug_list_lock);
    2493                 :            :         sema_init(&hdev->driver_lock, 1);
    2494                 :            :         sema_init(&hdev->driver_input_lock, 1);
    2495                 :            : 
    2496                 :          0 :         return hdev;
    2497                 :            : }
    2498                 :            : EXPORT_SYMBOL_GPL(hid_allocate_device);
    2499                 :            : 
    2500                 :          0 : static void hid_remove_device(struct hid_device *hdev)
    2501                 :            : {
    2502         [ #  # ]:          0 :         if (hdev->status & HID_STAT_ADDED) {
    2503                 :          0 :                 device_del(&hdev->dev);
    2504                 :          0 :                 hid_debug_unregister(hdev);
    2505                 :          0 :                 hdev->status &= ~HID_STAT_ADDED;
    2506                 :            :         }
    2507                 :          0 :         kfree(hdev->dev_rdesc);
    2508                 :          0 :         hdev->dev_rdesc = NULL;
    2509                 :          0 :         hdev->dev_rsize = 0;
    2510                 :          0 : }
    2511                 :            : 
    2512                 :            : /**
    2513                 :            :  * hid_destroy_device - free previously allocated device
    2514                 :            :  *
    2515                 :            :  * @hdev: hid device
    2516                 :            :  *
    2517                 :            :  * If you allocate hid_device through hid_allocate_device, you should ever
    2518                 :            :  * free by this function.
    2519                 :            :  */
    2520                 :          0 : void hid_destroy_device(struct hid_device *hdev)
    2521                 :            : {
    2522                 :          0 :         hid_remove_device(hdev);
    2523                 :          0 :         put_device(&hdev->dev);
    2524                 :          0 : }
    2525                 :            : EXPORT_SYMBOL_GPL(hid_destroy_device);
    2526                 :            : 
    2527                 :          0 : int __hid_register_driver(struct hid_driver *hdrv, struct module *owner,
    2528                 :            :                 const char *mod_name)
    2529                 :            : {
    2530                 :            :         int ret;
    2531                 :            : 
    2532                 :          0 :         hdrv->driver.name = hdrv->name;
    2533                 :          0 :         hdrv->driver.bus = &hid_bus_type;
    2534                 :          0 :         hdrv->driver.owner = owner;
    2535                 :          0 :         hdrv->driver.mod_name = mod_name;
    2536                 :            : 
    2537                 :          0 :         INIT_LIST_HEAD(&hdrv->dyn_list);
    2538                 :          0 :         spin_lock_init(&hdrv->dyn_lock);
    2539                 :            : 
    2540                 :          0 :         ret = driver_register(&hdrv->driver);
    2541         [ #  # ]:          0 :         if (ret)
    2542                 :            :                 return ret;
    2543                 :            : 
    2544                 :          0 :         ret = driver_create_file(&hdrv->driver, &driver_attr_new_id);
    2545         [ #  # ]:          0 :         if (ret)
    2546                 :          0 :                 driver_unregister(&hdrv->driver);
    2547                 :            : 
    2548                 :          0 :         return ret;
    2549                 :            : }
    2550                 :            : EXPORT_SYMBOL_GPL(__hid_register_driver);
    2551                 :            : 
    2552                 :          0 : void hid_unregister_driver(struct hid_driver *hdrv)
    2553                 :            : {
    2554                 :          0 :         driver_remove_file(&hdrv->driver, &driver_attr_new_id);
    2555                 :          0 :         driver_unregister(&hdrv->driver);
    2556                 :          0 :         hid_free_dynids(hdrv);
    2557                 :          0 : }
    2558                 :            : EXPORT_SYMBOL_GPL(hid_unregister_driver);
    2559                 :            : 
    2560                 :          0 : int hid_check_keys_pressed(struct hid_device *hid)
    2561                 :            : {
    2562                 :            :         struct hid_input *hidinput;
    2563                 :            :         int i;
    2564                 :            : 
    2565         [ #  # ]:          0 :         if (!(hid->claimed & HID_CLAIMED_INPUT))
    2566                 :            :                 return 0;
    2567                 :            : 
    2568         [ #  # ]:          0 :         list_for_each_entry(hidinput, &hid->inputs, list) {
    2569         [ #  # ]:          0 :                 for (i = 0; i < BITS_TO_LONGS(KEY_MAX); i++)
    2570         [ #  # ]:          0 :                         if (hidinput->input->key[i])
    2571                 :            :                                 return 1;
    2572                 :            :         }
    2573                 :            : 
    2574                 :            :         return 0;
    2575                 :            : }
    2576                 :            : 
    2577                 :            : EXPORT_SYMBOL_GPL(hid_check_keys_pressed);
    2578                 :            : 
    2579                 :          0 : static int __init hid_init(void)
    2580                 :            : {
    2581                 :            :         int ret;
    2582                 :            : 
    2583         [ #  # ]:          0 :         if (hid_debug)
    2584                 :          0 :                 pr_warn("hid_debug is now used solely for parser and driver debugging.\n"
    2585                 :            :                         "debugfs is now used for inspecting the device (report descriptor, reports)\n");
    2586                 :            : 
    2587                 :          0 :         ret = bus_register(&hid_bus_type);
    2588         [ #  # ]:          0 :         if (ret) {
    2589                 :          0 :                 pr_err("can't register hid bus\n");
    2590                 :            :                 goto err;
    2591                 :            :         }
    2592                 :            : 
    2593                 :            :         ret = hidraw_init();
    2594                 :            :         if (ret)
    2595                 :            :                 goto err_bus;
    2596                 :            : 
    2597                 :          0 :         hid_debug_init();
    2598                 :            : 
    2599                 :          0 :         return 0;
    2600                 :            : err_bus:
    2601                 :            :         bus_unregister(&hid_bus_type);
    2602                 :            : err:
    2603                 :          0 :         return ret;
    2604                 :            : }
    2605                 :            : 
    2606                 :          0 : static void __exit hid_exit(void)
    2607                 :            : {
    2608                 :          0 :         hid_debug_exit();
    2609                 :            :         hidraw_exit();
    2610                 :          0 :         bus_unregister(&hid_bus_type);
    2611                 :          0 : }
    2612                 :            : 
    2613                 :            : module_init(hid_init);
    2614                 :            : module_exit(hid_exit);
    2615                 :            : 
    2616                 :            : MODULE_AUTHOR("Andreas Gal");
    2617                 :            : MODULE_AUTHOR("Vojtech Pavlik");
    2618                 :            : MODULE_AUTHOR("Jiri Kosina");
    2619                 :            : MODULE_LICENSE(DRIVER_LICENSE);
    2620                 :            : 

Generated by: LCOV version 1.9