]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 May 2019 22:21:48 +0000 (15:21 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 13 May 2019 22:21:48 +0000 (15:21 -0700)
Pull input updates from Dmitry Torokhov:
 "A few new drivers:

   - driver for Azoteq IQS550/572/525 touch controllers

   - driver for Microchip AT42QT1050 keys

   - driver for GPIO controllable vibrators

   - support for GT5663 in Goodix driver

  ... along with miscellaneous driver fixes"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input:
  Input: libps2 - mark expected switch fall-through
  Input: qt1050 - add Microchip AT42QT1050 support
  Input: add support for Azoteq IQS550/572/525
  Input: add a driver for GPIO controllable vibrators
  Input: synaptics-rmi4 - fix enum_fmt
  Input: synaptics-rmi4 - fill initial format
  HID: input: add mapping for KEY_KBD_LAYOUT_NEXT
  Input: add KEY_KBD_LAYOUT_NEXT
  Input: hyperv-keyboard - add module description
  Input: olpc_apsp - depend on ARCH_MMP
  Input: sun4i-a10-lradc-keys - add support for A83T
  Input: snvs_pwrkey - use dev_pm_set_wake_irq() to simplify code
  Input: lpc32xx-key - add clocks property and fix DT binding example
  Input: i8042 - signal wakeup from atkbd/psmouse
  Input: goodix - add GT5663 CTP support
  Input: goodix - add regulators suppot
  Input: evdev - use struct_size() in kzalloc() and vzalloc()
  Input: edt-ft5x06 - convert to use SPDX identifier
  Input: edt-ft5x06 - enable ACPI enumeration

1  2 
Documentation/devicetree/bindings/vendor-prefixes.txt
drivers/hid/hid-input.c
drivers/input/evdev.c
drivers/input/misc/Kconfig
drivers/input/misc/Makefile
include/uapi/linux/input-event-codes.h

index 9ed399977297b12a4b44622739b003f57997e0b1,51f99549161edf72f6a58bbece2ae190db0aa7d2..e0e216002efd47511ecf97c1660a231aafa0f192
@@@ -24,7 -24,6 +24,7 @@@ amarula       Amarula Solution
  amazon        Amazon.com, Inc.
  amcc  Applied Micro Circuits Corporation (APM, formally AMCC)
  amd   Advanced Micro Devices (AMD), Inc.
 +amediatech    Shenzhen Amediatech Technology Co., Ltd
  amlogic       Amlogic, Inc.
  ampire        Ampire Co., Ltd.
  ams   AMS AG
@@@ -36,7 -35,6 +36,7 @@@ aptina        Aptina Imagin
  arasan        Arasan Chip Systems
  archermind ArcherMind Technology (Nanjing) Co., Ltd.
  arctic        Arctic Sand
 +arcx  arcx Inc. / Archronix Inc.
  aries Aries Embedded GmbH
  arm   ARM Ltd.
  armadeus      ARMadeus Systems SARL
@@@ -55,6 -53,7 +55,7 @@@ avic  Shanghai AVIC Optoelectronics Co.
  avnet Avnet, Inc.
  axentia       Axentia Technologies AB
  axis  Axis Communications AB
+ azoteq        Azoteq (Pty) Ltd
  bananapi BIPAI KEJI LIMITED
  bhf   Beckhoff Automation GmbH & Co. KG
  bitmain       Bitmain Technologies
@@@ -67,10 -66,8 +68,10 @@@ bticino Bticino Internationa
  calxeda       Calxeda
  capella       Capella Microsystems, Inc
  cascoda       Cascoda, Ltd.
 +catalyst      Catalyst Semiconductor, Inc.
  cavium        Cavium, Inc.
  cdns  Cadence Design Systems Inc.
 +cdtech        CDTech(H.K.) Electronics Limited
  ceva  Ceva, Inc.
  chipidea      Chipidea, Inc
  chipone               ChipOne
@@@ -111,15 -108,12 +112,15 @@@ dongwoon        Dongwoon Anatec
  dptechnics    DPTechnics
  dragino       Dragino Technology Co., Limited
  ea    Embedded Artists AB
 +ebs-systart EBS-SYSTART GmbH
  ebv   EBV Elektronik
  eckelmann     Eckelmann AG
  edt   Emerging Display Technologies
  eeti  eGalax_eMPIA Technology Inc
  elan  Elan Microelectronic Corp.
 +elgin Elgin S/A.
  embest        Shenzhen Embest Technology Co., Ltd.
 +emlid Emlid, Ltd.
  emmicro       EM Microelectronic
  emtrion       emtrion GmbH
  endless       Endless Mobile, Inc.
@@@ -141,13 -135,11 +142,13 @@@ fairphone       Fairphone B.V
  faraday       Faraday Technology Corporation
  fastrax       Fastrax Oy
  fcs   Fairchild Semiconductor
 +feiyang       Shenzhen Fly Young Technology Co.,LTD.
  firefly       Firefly
  focaltech     FocalTech Systems Co.,Ltd
  friendlyarm   Guangzhou FriendlyARM Computer Tech Co., Ltd
  fsl   Freescale Semiconductor
  fujitsu       Fujitsu Ltd.
 +gateworks     Gateworks Corporation
  gcw Game Consoles Worldwide
  ge    General Electric Company
  geekbuying    GeekBuying
@@@ -157,7 -149,6 +158,7 @@@ geniatech  Geniatech, Inc
  giantec       Giantec Semiconductor, Inc.
  giantplus     Giantplus Technology Co., Ltd.
  globalscale   Globalscale Technologies, Inc.
 +globaltop     GlobalTop Technology, Inc.
  gmt   Global Mixed-mode Technology, Inc.
  goodix        Shenzhen Huiding Technology Co., Ltd.
  google        Google, Inc.
@@@ -180,7 -171,6 +181,7 @@@ holtek     Holtek Semiconductor, Inc
  hwacom        HwaCom Systems Inc.
  i2se  I2SE GmbH
  ibm   International Business Machines (IBM)
 +icplus        IC Plus Corp.
  idt   Integrated Device Technologies, Inc.
  ifi   Ingenieurburo Fur Ic-Technologie (I/F/I)
  ilitek        ILI Technology Corporation (ILITEK)
@@@ -211,7 -201,6 +212,7 @@@ kiebackpeter    Kieback & Peter Gmb
  kinetic Kinetic Technologies
  kingdisplay   King & Display Technology Co., Ltd.
  kingnovel     Kingnovel Technology Co., Ltd.
 +kionix        Kionix, Inc.
  koe   Kaohsiung Opto-Electronics Inc.
  kosagi        Sutajio Ko-Usagi PTE Ltd.
  kyo   Kyocera Corporation
@@@ -220,7 -209,6 +221,7 @@@ laird      Laird PL
  lantiq        Lantiq Semiconductor
  lattice       Lattice Semiconductor
  lego  LEGO Systems A/S
 +lemaker       Shenzhen LeMaker Technology Co., Ltd.
  lenovo        Lenovo Group Ltd.
  lg    LG Corporation
  libretech     Shenzhen Libre Technology Co., Ltd
@@@ -235,7 -223,6 +236,7 @@@ lsi        LSI Corp. (LSI Logic
  lwn   Liebherr-Werk Nenzing GmbH
  macnica       Macnica Americas
  marvell       Marvell Technology Group Ltd.
 +maxbotix      MaxBotix Inc.
  maxim Maxim Integrated Products
  mbvl  Mobiveil Inc.
  mcube mCube
@@@ -284,7 -271,6 +285,7 @@@ nintendo   Nintend
  nlt   NLT Technologies, Ltd.
  nokia Nokia
  nordic        Nordic Semiconductor
 +novtech NovTech, Inc.
  nutsboard     NutsBoard
  nuvoton       Nuvoton Technology Corporation
  nvd   New Vision Display
@@@ -305,24 -291,19 +306,24 @@@ oranth  Shenzhen Oranth Technology Co., 
  ORCL  Oracle Corporation
  orisetech     Orise Technology
  ortustech     Ortus Technology Co., Ltd.
 +osddisplays   OSD Displays
  ovti  OmniVision Technologies
  oxsemi        Oxford Semiconductor, Ltd.
  panasonic     Panasonic Corporation
  parade        Parade Technologies Inc.
 +pda   Precision Design Associates, Inc.
  pericom       Pericom Technology Inc.
  pervasive     Pervasive Displays, Inc.
 +phicomm PHICOMM Co., Ltd.
  phytec        PHYTEC Messtechnik GmbH
  picochip      Picochip Ltd
  pine64        Pine64
  pixcir  PIXCIR MICROELECTRONICS Co., Ltd
 +plantower Plantower Co., Ltd
  plathome      Plat'Home Co., Ltd.
  plda  PLDA
  plx   Broadcom Corporation (formerly PLX Technology)
 +pni   PNI Sensor Corporation
  portwell      Portwell Inc.
  poslab        Poslab Technology Co., Ltd.
  powervr       PowerVR (deprecated, use img)
@@@ -340,7 -321,6 +341,7 @@@ ralink     Mediatek/Ralink Technology Corp
  ramtron       Ramtron International
  raspberrypi   Raspberry Pi Foundation
  raydium       Raydium Semiconductor Corp.
 +rda   Unisoc Communications, Inc.
  realtek Realtek Semiconductor Corp.
  renesas       Renesas Electronics Corporation
  richtek       Richtek Technology Corporation
@@@ -348,9 -328,7 +349,9 @@@ ricoh      Ricoh Co. Ltd
  rikomagic     Rikomagic Tech Corp. Ltd
  riscv RISC-V Foundation
  rockchip      Fuzhou Rockchip Electronics Co., Ltd
 +rocktech      ROCKTECH DISPLAYS LIMITED
  rohm  ROHM Semiconductor Co., Ltd
 +ronbo   Ronbo Electronics
  roofull       Shenzhen Roofull Technology Co, Ltd
  samsung       Samsung Semiconductor
  samtec        Samtec/Softing company
@@@ -407,7 -385,6 +408,7 @@@ tcl        Toby Churchill Ltd
  technexion    TechNexion
  technologic   Technologic Systems
  tempo Tempo Semiconductor
 +techstar      Shenzhen Techstar Electronics Co., Ltd.
  terasic       Terasic Inc.
  thine THine Electronics, Inc.
  ti    Texas Instruments
@@@ -439,7 -416,6 +440,7 @@@ vamrs      Vamrs Ltd
  variscite     Variscite Ltd.
  via   VIA Technologies, Inc.
  virtio        Virtual I/O Device Specification, developed by the OASIS consortium
 +vishay        Vishay Intertechnology, Inc
  vitesse       Vitesse Semiconductor Corporation
  vivante       Vivante Corporation
  vocore VoCore Studio
@@@ -448,7 -424,6 +449,7 @@@ vot        Vision Optical Technology Co., Ltd
  wd    Western Digital Corp.
  wetek WeTek Electronics, limited.
  wexler        Wexler
 +whwave  Shenzhen whwave Electronics, Inc.
  wi2wi Wi2Wi, Inc.
  winbond Winbond Electronics corp.
  winstar       Winstar Display Corp.
diff --combined drivers/hid/hid-input.c
index 46c6efea1404ee664eb2e44837e09c67553fc5c3,89d00c34a184de9a71e2da6411f112d9874a4307..abdb01879caa89866b69196b452a8cb7f855f0bb
@@@ -328,9 -328,6 +328,9 @@@ static const struct hid_device_id hid_b
        { HID_USB_DEVICE(USB_VENDOR_ID_SYMBOL,
                USB_DEVICE_ID_SYMBOL_SCANNER_3),
          HID_BATTERY_QUIRK_IGNORE },
 +      { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ASUSTEK,
 +              USB_DEVICE_ID_ASUSTEK_T100CHI_KEYBOARD),
 +        HID_BATTERY_QUIRK_IGNORE },
        {}
  };
  
@@@ -723,15 -720,7 +723,15 @@@ static void hidinput_configure_usage(st
                                map_abs_clear(usage->hid & 0xf);
                        break;
  
 -              case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL:
 +              case HID_GD_WHEEL:
 +                      if (field->flags & HID_MAIN_ITEM_RELATIVE) {
 +                              set_bit(REL_WHEEL, input->relbit);
 +                              map_rel(REL_WHEEL_HI_RES);
 +                      } else {
 +                              map_abs(usage->hid & 0xf);
 +                      }
 +                      break;
 +              case HID_GD_SLIDER: case HID_GD_DIAL:
                        if (field->flags & HID_MAIN_ITEM_RELATIVE)
                                map_rel(usage->hid & 0xf);
                        else
                case 0x1b8: map_key_clear(KEY_VIDEO);           break;
                case 0x1bc: map_key_clear(KEY_MESSENGER);       break;
                case 0x1bd: map_key_clear(KEY_INFO);            break;
 +              case 0x1cb: map_key_clear(KEY_ASSISTANT);       break;
                case 0x201: map_key_clear(KEY_NEW);             break;
                case 0x202: map_key_clear(KEY_OPEN);            break;
                case 0x203: map_key_clear(KEY_CLOSE);           break;
                case 0x232: map_key_clear(KEY_FULL_SCREEN);     break;
                case 0x233: map_key_clear(KEY_SCROLLUP);        break;
                case 0x234: map_key_clear(KEY_SCROLLDOWN);      break;
 -              case 0x238: map_rel(REL_HWHEEL);                break;
 +              case 0x238: /* AC Pan */
 +                      set_bit(REL_HWHEEL, input->relbit);
 +                      map_rel(REL_HWHEEL_HI_RES);
 +                      break;
                case 0x23d: map_key_clear(KEY_EDIT);            break;
                case 0x25f: map_key_clear(KEY_CANCEL);          break;
                case 0x269: map_key_clear(KEY_INSERT);          break;
                case 0x28b: map_key_clear(KEY_FORWARDMAIL);     break;
                case 0x28c: map_key_clear(KEY_SEND);            break;
  
+               case 0x29d: map_key_clear(KEY_KBD_LAYOUT_NEXT); break;
                case 0x2c7: map_key_clear(KEY_KBDINPUTASSIST_PREV);             break;
                case 0x2c8: map_key_clear(KEY_KBDINPUTASSIST_NEXT);             break;
                case 0x2c9: map_key_clear(KEY_KBDINPUTASSIST_PREVGROUP);                break;
@@@ -1230,38 -1217,6 +1232,38 @@@ ignore
  
  }
  
 +static void hidinput_handle_scroll(struct hid_usage *usage,
 +                                 struct input_dev *input,
 +                                 __s32 value)
 +{
 +      int code;
 +      int hi_res, lo_res;
 +
 +      if (value == 0)
 +              return;
 +
 +      if (usage->code == REL_WHEEL_HI_RES)
 +              code = REL_WHEEL;
 +      else
 +              code = REL_HWHEEL;
 +
 +      /*
 +       * Windows reports one wheel click as value 120. Where a high-res
 +       * scroll wheel is present, a fraction of 120 is reported instead.
 +       * Our REL_WHEEL_HI_RES axis does the same because all HW must
 +       * adhere to the 120 expectation.
 +       */
 +      hi_res = value * 120/usage->resolution_multiplier;
 +
 +      usage->wheel_accumulated += hi_res;
 +      lo_res = usage->wheel_accumulated/120;
 +      if (lo_res)
 +              usage->wheel_accumulated -= lo_res * 120;
 +
 +      input_event(input, EV_REL, code, lo_res);
 +      input_event(input, EV_REL, usage->code, hi_res);
 +}
 +
  void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value)
  {
        struct input_dev *input;
        if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */
                return;
  
 +      if ((usage->type == EV_REL) && (usage->code == REL_WHEEL_HI_RES ||
 +                                      usage->code == REL_HWHEEL_HI_RES)) {
 +              hidinput_handle_scroll(usage, input, value);
 +              return;
 +      }
 +
        if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) &&
                        (usage->code == ABS_VOLUME)) {
                int count = abs(value);
@@@ -1557,77 -1506,6 +1559,77 @@@ static void hidinput_close(struct input
        hid_hw_close(hid);
  }
  
 +static bool __hidinput_change_resolution_multipliers(struct hid_device *hid,
 +              struct hid_report *report, bool use_logical_max)
 +{
 +      struct hid_usage *usage;
 +      bool update_needed = false;
 +      int i, j;
 +
 +      if (report->maxfield == 0)
 +              return false;
 +
 +      /*
 +       * If we have more than one feature within this report we
 +       * need to fill in the bits from the others before we can
 +       * overwrite the ones for the Resolution Multiplier.
 +       */
 +      if (report->maxfield > 1) {
 +              hid_hw_request(hid, report, HID_REQ_GET_REPORT);
 +              hid_hw_wait(hid);
 +      }
 +
 +      for (i = 0; i < report->maxfield; i++) {
 +              __s32 value = use_logical_max ?
 +                            report->field[i]->logical_maximum :
 +                            report->field[i]->logical_minimum;
 +
 +              /* There is no good reason for a Resolution
 +               * Multiplier to have a count other than 1.
 +               * Ignore that case.
 +               */
 +              if (report->field[i]->report_count != 1)
 +                      continue;
 +
 +              for (j = 0; j < report->field[i]->maxusage; j++) {
 +                      usage = &report->field[i]->usage[j];
 +
 +                      if (usage->hid != HID_GD_RESOLUTION_MULTIPLIER)
 +                              continue;
 +
 +                      report->field[i]->value[j] = value;
 +                      update_needed = true;
 +              }
 +      }
 +
 +      return update_needed;
 +}
 +
 +static void hidinput_change_resolution_multipliers(struct hid_device *hid)
 +{
 +      struct hid_report_enum *rep_enum;
 +      struct hid_report *rep;
 +      int ret;
 +
 +      rep_enum = &hid->report_enum[HID_FEATURE_REPORT];
 +      list_for_each_entry(rep, &rep_enum->report_list, list) {
 +              bool update_needed = __hidinput_change_resolution_multipliers(hid,
 +                                                                   rep, true);
 +
 +              if (update_needed) {
 +                      ret = __hid_request(hid, rep, HID_REQ_SET_REPORT);
 +                      if (ret) {
 +                              __hidinput_change_resolution_multipliers(hid,
 +                                                                  rep, false);
 +                              return;
 +                      }
 +              }
 +      }
 +
 +      /* refresh our structs */
 +      hid_setup_resolution_multiplier(hid);
 +}
 +
  static void report_features(struct hid_device *hid)
  {
        struct hid_driver *drv = hid->driver;
@@@ -1921,8 -1799,6 +1923,8 @@@ int hidinput_connect(struct hid_device 
                }
        }
  
 +      hidinput_change_resolution_multipliers(hid);
 +
        list_for_each_entry_safe(hidinput, next, &hid->inputs, list) {
                if (drv->input_configured &&
                    drv->input_configured(hid, hidinput))
@@@ -1981,3 -1857,4 +1983,3 @@@ void hidinput_disconnect(struct hid_dev
        cancel_work_sync(&hid->led_work);
  }
  EXPORT_SYMBOL_GPL(hidinput_disconnect);
 -
diff --combined drivers/input/evdev.c
index f040d8881ff2a2db34d56a816026e69524239f3b,ee8dd8b1b09e9513578682479227d5663fae770d..d1e25aba8212ad3c19f66bbd704835406e78d065
@@@ -503,14 -503,13 +503,13 @@@ static int evdev_open(struct inode *ino
  {
        struct evdev *evdev = container_of(inode->i_cdev, struct evdev, cdev);
        unsigned int bufsize = evdev_compute_buffer_size(evdev->handle.dev);
-       unsigned int size = sizeof(struct evdev_client) +
-                                       bufsize * sizeof(struct input_event);
        struct evdev_client *client;
        int error;
  
-       client = kzalloc(size, GFP_KERNEL | __GFP_NOWARN);
+       client = kzalloc(struct_size(client, buffer, bufsize),
+                        GFP_KERNEL | __GFP_NOWARN);
        if (!client)
-               client = vzalloc(size);
+               client = vzalloc(struct_size(client, buffer, bufsize));
        if (!client)
                return -ENOMEM;
  
                goto err_free_client;
  
        file->private_data = client;
 -      nonseekable_open(inode, file);
 +      stream_open(inode, file);
  
        return 0;
  
index e15ed1bb8558c69e2eda42507953e2e079e759d7,16f41eece6d232b89225e4185424560393ea68ca..6dfe9e2fe5b1b8104c5c5639f6873790af2de8cf
@@@ -290,6 -290,18 +290,18 @@@ config INPUT_GPIO_DECODE
         To compile this driver as a module, choose M here: the module
         will be called gpio_decoder.
  
+ config INPUT_GPIO_VIBRA
+       tristate "GPIO vibrator support"
+       depends on GPIOLIB || COMPILE_TEST
+       select INPUT_FF_MEMLESS
+       help
+         Say Y here to get support for GPIO based vibrator devices.
+         If unsure, say N.
+         To compile this driver as a module, choose M here: the module will be
+         called gpio-vibra.
  config INPUT_IXP4XX_BEEPER
        tristate "IXP4XX Beeper support"
        depends on ARCH_IXP4XX
@@@ -861,15 -873,4 +873,15 @@@ config INPUT_SC27XX_VIBR
          To compile this driver as a module, choose M here. The module will
          be called sc27xx_vibra.
  
 +config INPUT_STPMIC1_ONKEY
 +      tristate "STPMIC1 PMIC Onkey support"
 +      depends on MFD_STPMIC1
 +      help
 +        Say Y to enable support of onkey embedded into STPMIC1 PMIC. onkey
 +        can be used to wakeup from low power modes and force a shut-down on
 +        long press.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called stpmic1_onkey.
 +
  endif
index b936c5b1d4ac6ac99f3f86614f886b2bd788637f,d871991c2eeee1c35f28b2f9d41d014b84cf331c..f38ebbdb05e2ed726727a0eef97f1af783dd38b6
@@@ -36,6 -36,7 +36,7 @@@ obj-$(CONFIG_INPUT_DRV2667_HAPTICS)   += 
  obj-$(CONFIG_INPUT_GP2A)              += gp2ap002a00f.o
  obj-$(CONFIG_INPUT_GPIO_BEEPER)               += gpio-beeper.o
  obj-$(CONFIG_INPUT_GPIO_DECODER)      += gpio_decoder.o
+ obj-$(CONFIG_INPUT_GPIO_VIBRA)                += gpio-vibra.o
  obj-$(CONFIG_INPUT_HISI_POWERKEY)     += hisi_powerkey.o
  obj-$(CONFIG_HP_SDC_RTC)              += hp_sdc_rtc.o
  obj-$(CONFIG_INPUT_IMS_PCU)           += ims-pcu.o
@@@ -72,7 -73,6 +73,7 @@@ obj-$(CONFIG_INPUT_SGI_BTNS)          += sgi_bt
  obj-$(CONFIG_INPUT_SIRFSOC_ONKEY)     += sirfsoc-onkey.o
  obj-$(CONFIG_INPUT_SOC_BUTTON_ARRAY)  += soc_button_array.o
  obj-$(CONFIG_INPUT_SPARCSPKR)         += sparcspkr.o
 +obj-$(CONFIG_INPUT_STPMIC1_ONKEY)     += stpmic1_onkey.o
  obj-$(CONFIG_INPUT_TPS65218_PWRBUTTON)        += tps65218-pwrbutton.o
  obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) += twl4030-pwrbutton.o
  obj-$(CONFIG_INPUT_TWL4030_VIBRA)     += twl4030-vibra.o
@@@ -83,4 -83,3 +84,4 @@@ obj-$(CONFIG_INPUT_WM831X_ON)         += wm831
  obj-$(CONFIG_INPUT_XEN_KBDDEV_FRONTEND)       += xen-kbdfront.o
  obj-$(CONFIG_INPUT_YEALINK)           += yealink.o
  obj-$(CONFIG_INPUT_IDEAPAD_SLIDEBAR)  += ideapad_slidebar.o
 +
index 64cee116928ebd92d97acec08c273e02c89958ab,4badaff0f548e247c72572ae941eaeef0b4940e5..85387c76c24f384ac31a934ca14f0e76faf1ba3a
  #define KEY_SCREENSAVER               0x245   /* AL Screen Saver */
  #define KEY_VOICECOMMAND              0x246   /* Listening Voice Command */
  #define KEY_ASSISTANT         0x247   /* AL Context-aware desktop assistant */
+ #define KEY_KBD_LAYOUT_NEXT   0x248   /* AC Next Keyboard Layout Select */
  
  #define KEY_BRIGHTNESS_MIN            0x250   /* Set Brightness to Minimum */
  #define KEY_BRIGHTNESS_MAX            0x251   /* Set Brightness to Maximum */
   * the situation described above.
   */
  #define REL_RESERVED          0x0a
 +#define REL_WHEEL_HI_RES      0x0b
 +#define REL_HWHEEL_HI_RES     0x0c
  #define REL_MAX                       0x0f
  #define REL_CNT                       (REL_MAX+1)