You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID updates from Jiri Kosina:
1) Patchset from Henrik Rydberg which substantially reduces irqsoff
latency for all input devices. In addition to that, Henrik reworked
multitouch handling in order to reduce runtime memory consumption.
This patchset touches code in Input subsystem as well. All the
changes have been Acked by Dmitry, and we agreed to do it this way
due to inter-dependencies between the patchset and subsequent
changes in HID subsystem.
2) Rework, clenaups and a lot of fixes to picolcd driver by Bruno
Prémont.
3) Core report descriptor handling fix which fixes resume issue on some
devices, by Kevin Daughtridge
4) hidraw fixes by Alexey Khoroshilov and Ratan Nalumasu
5) wiimote driver now supports balance board, by David Herrmann.
6) Other smaller fixes and new device id additions all over the place.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: (79 commits)
HID: hidraw: don't deallocate memory when it is in use
HID: picoLCD: optimize for inactive debugfs
HID: multitouch: add support for GeneralTouch multi-touchscreen
HID: Add support for Sony PS3 BD Remote Control
HID: keep dev_rdesc unmodified and use it for comparisons
HID: lg4ff: Minor coding style fixes in lg4ff and hid-lg
HID: hid-lg4ff: Set absolute axes parametes on DFP
HID: hid-lg4ff: Adjust X axis input value accordingly to selected range.
HID: hid-lg4ff: Minor code cleanup to improve readability
HID: ntrig: change default value of logical/physical width/height to 1
HID: picoLCD: bounds check in dump_buff_as_hex()
Input: bcm5974 - Convert to MT-B
Input: bcm5974 - Drop the logical dimensions
Input: bcm5974 - Preparatory renames
Input: bcm5974 - only setup button urb for TYPE1 devices
HID: hid-multitouch: Add Flatfrog support
HID: hid-multitouch: Fix contact count on 3M panels
HID: hid-multitouch: Remove the redundant touch state
HID: hid-multitouch: Simplify setup and frame synchronization
HID: Allow more fields in the hid report
...
This commit is contained in:
@@ -1,3 +1,16 @@
|
||||
WWhat: /sys/class/hidraw/hidraw*/device/oled*_img
|
||||
Date: June 2012
|
||||
Contact: linux-bluetooth@vger.kernel.org
|
||||
Description:
|
||||
The /sys/class/hidraw/hidraw*/device/oled*_img files control
|
||||
OLED mocro displays on Intuos4 Wireless tablet. Accepted image
|
||||
has to contain 256 bytes (64x32 px 1 bit colour). The format
|
||||
is the same as PBM image 62x32px without header (64 bits per
|
||||
horizontal line, 32 lines). An example of setting OLED No. 0:
|
||||
dd bs=256 count=1 if=img_file of=[path to oled0_img]/oled0_img
|
||||
The attribute is read only and no local copy of the image is
|
||||
stored.
|
||||
|
||||
What: /sys/class/hidraw/hidraw*/device/speed
|
||||
Date: April 2010
|
||||
Kernel Version: 2.6.35
|
||||
|
||||
@@ -5322,6 +5322,12 @@ L: linux-mtd@lists.infradead.org
|
||||
S: Maintained
|
||||
F: drivers/mtd/devices/phram.c
|
||||
|
||||
PICOLCD HID DRIVER
|
||||
M: Bruno Prémont <bonbons@linux-vserver.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/hid/hid-picolcd*
|
||||
|
||||
PICOXCELL SUPPORT
|
||||
M: Jamie Iles <jamie@jamieiles.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
|
||||
+20
-2
@@ -307,7 +307,6 @@ config HID_LOGITECH
|
||||
config HID_LOGITECH_DJ
|
||||
tristate "Logitech Unifying receivers full support"
|
||||
depends on HID_LOGITECH
|
||||
default m
|
||||
---help---
|
||||
Say Y if you want support for Logitech Unifying receivers and devices.
|
||||
Unifying receivers are capable of pairing up to 6 Logitech compliant
|
||||
@@ -527,6 +526,14 @@ config HID_PICOLCD_LEDS
|
||||
---help---
|
||||
Provide access to PicoLCD's GPO pins via leds class.
|
||||
|
||||
config HID_PICOLCD_CIR
|
||||
bool "CIR via RC class" if EXPERT
|
||||
default !EXPERT
|
||||
depends on HID_PICOLCD
|
||||
depends on HID_PICOLCD=RC_CORE || RC_CORE=y
|
||||
---help---
|
||||
Provide access to PicoLCD's CIR interface via remote control (LIRC).
|
||||
|
||||
config HID_PRIMAX
|
||||
tristate "Primax non-fully HID-compliant devices"
|
||||
depends on USB_HID
|
||||
@@ -534,6 +541,15 @@ config HID_PRIMAX
|
||||
Support for Primax devices that are not fully compliant with the
|
||||
HID standard.
|
||||
|
||||
config HID_PS3REMOTE
|
||||
tristate "Sony PS3 BD Remote Control"
|
||||
depends on BT_HIDP
|
||||
---help---
|
||||
Support for the Sony PS3 Blue-ray Disk Remote Control and Logitech
|
||||
Harmony Adapter for PS3, which connect over Bluetooth.
|
||||
|
||||
Support for the 6-axis controllers is provided by HID_SONY.
|
||||
|
||||
config HID_ROCCAT
|
||||
tristate "Roccat device support"
|
||||
depends on USB_HID
|
||||
@@ -561,7 +577,9 @@ config HID_SONY
|
||||
tristate "Sony PS3 controller"
|
||||
depends on USB_HID
|
||||
---help---
|
||||
Support for Sony PS3 controller.
|
||||
Support for Sony PS3 6-axis controllers.
|
||||
|
||||
Support for the Sony PS3 BD Remote is provided by HID_PS3REMOTE.
|
||||
|
||||
config HID_SPEEDLINK
|
||||
tristate "Speedlink VAD Cezanne mouse support"
|
||||
|
||||
@@ -69,7 +69,28 @@ obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o
|
||||
obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o
|
||||
obj-$(CONFIG_HID_PETALYNX) += hid-petalynx.o
|
||||
obj-$(CONFIG_HID_PICOLCD) += hid-picolcd.o
|
||||
hid-picolcd-y += hid-picolcd_core.o
|
||||
ifdef CONFIG_HID_PICOLCD_FB
|
||||
hid-picolcd-y += hid-picolcd_fb.o
|
||||
endif
|
||||
ifdef CONFIG_HID_PICOLCD_BACKLIGHT
|
||||
hid-picolcd-y += hid-picolcd_backlight.o
|
||||
endif
|
||||
ifdef CONFIG_HID_PICOLCD_LCD
|
||||
hid-picolcd-y += hid-picolcd_lcd.o
|
||||
endif
|
||||
ifdef CONFIG_HID_PICOLCD_LEDS
|
||||
hid-picolcd-y += hid-picolcd_leds.o
|
||||
endif
|
||||
ifdef CONFIG_HID_PICOLCD_CIR
|
||||
hid-picolcd-y += hid-picolcd_cir.o
|
||||
endif
|
||||
ifdef CONFIG_DEBUG_FS
|
||||
hid-picolcd-y += hid-picolcd_debugfs.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_HID_PRIMAX) += hid-primax.o
|
||||
obj-$(CONFIG_HID_PS3REMOTE) += hid-ps3remote.o
|
||||
obj-$(CONFIG_HID_ROCCAT) += hid-roccat.o hid-roccat-common.o \
|
||||
hid-roccat-arvo.o hid-roccat-isku.o hid-roccat-kone.o \
|
||||
hid-roccat-koneplus.o hid-roccat-kovaplus.o hid-roccat-pyra.o \
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
*/
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby <jirislaby@gmail.com>
|
||||
*/
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
*/
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
*/
|
||||
|
||||
|
||||
+32
-10
@@ -126,7 +126,7 @@ static int open_collection(struct hid_parser *parser, unsigned type)
|
||||
|
||||
if (parser->collection_stack_ptr == HID_COLLECTION_STACK_SIZE) {
|
||||
hid_err(parser->device, "collection stack overflow\n");
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (parser->device->maxcollection == parser->device->collection_size) {
|
||||
@@ -134,7 +134,7 @@ static int open_collection(struct hid_parser *parser, unsigned type)
|
||||
parser->device->collection_size * 2, GFP_KERNEL);
|
||||
if (collection == NULL) {
|
||||
hid_err(parser->device, "failed to reallocate collection array\n");
|
||||
return -1;
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(collection, parser->device->collection,
|
||||
sizeof(struct hid_collection) *
|
||||
@@ -170,7 +170,7 @@ static int close_collection(struct hid_parser *parser)
|
||||
{
|
||||
if (!parser->collection_stack_ptr) {
|
||||
hid_err(parser->device, "collection stack underflow\n");
|
||||
return -1;
|
||||
return -EINVAL;
|
||||
}
|
||||
parser->collection_stack_ptr--;
|
||||
return 0;
|
||||
@@ -374,7 +374,7 @@ static int hid_parser_global(struct hid_parser *parser, struct hid_item *item)
|
||||
|
||||
case HID_GLOBAL_ITEM_TAG_REPORT_SIZE:
|
||||
parser->global.report_size = item_udata(item);
|
||||
if (parser->global.report_size > 96) {
|
||||
if (parser->global.report_size > 128) {
|
||||
hid_err(parser->device, "invalid report_size %d\n",
|
||||
parser->global.report_size);
|
||||
return -1;
|
||||
@@ -757,6 +757,7 @@ int hid_open_report(struct hid_device *device)
|
||||
struct hid_item item;
|
||||
unsigned int size;
|
||||
__u8 *start;
|
||||
__u8 *buf;
|
||||
__u8 *end;
|
||||
int ret;
|
||||
static int (*dispatch_type[])(struct hid_parser *parser,
|
||||
@@ -775,12 +776,21 @@ int hid_open_report(struct hid_device *device)
|
||||
return -ENODEV;
|
||||
size = device->dev_rsize;
|
||||
|
||||
if (device->driver->report_fixup)
|
||||
start = device->driver->report_fixup(device, start, &size);
|
||||
|
||||
device->rdesc = kmemdup(start, size, GFP_KERNEL);
|
||||
if (device->rdesc == NULL)
|
||||
buf = kmemdup(start, size, GFP_KERNEL);
|
||||
if (buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (device->driver->report_fixup)
|
||||
start = device->driver->report_fixup(device, buf, &size);
|
||||
else
|
||||
start = buf;
|
||||
|
||||
start = kmemdup(start, size, GFP_KERNEL);
|
||||
kfree(buf);
|
||||
if (start == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
device->rdesc = start;
|
||||
device->rsize = size;
|
||||
|
||||
parser = vzalloc(sizeof(struct hid_parser));
|
||||
@@ -1448,7 +1458,14 @@ void hid_disconnect(struct hid_device *hdev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_disconnect);
|
||||
|
||||
/* a list of devices for which there is a specialized driver on HID bus */
|
||||
/*
|
||||
* A list of devices for which there is a specialized driver on HID bus.
|
||||
*
|
||||
* Please note that for multitouch devices (driven by hid-multitouch driver),
|
||||
* there is a proper autodetection and autoloading in place (based on presence
|
||||
* of HID_DG_CONTACTID), so those devices don't need to be added to this list,
|
||||
* as we are doing the right thing in hid_scan_usage().
|
||||
*/
|
||||
static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||
@@ -1566,6 +1583,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_PS3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_DESKTOP) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_MINI) },
|
||||
@@ -1627,6 +1645,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
|
||||
#if IS_ENABLED(CONFIG_HID_ROCCAT)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) },
|
||||
@@ -1635,10 +1654,12 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRED) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_PYRA_WIRELESS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_SAVU) },
|
||||
#endif
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_PS1000) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SKYCABLE, USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_BDREMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||
@@ -1663,6 +1684,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP1062) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SMARTJOY_PLUS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_SUPER_JOY_BOX_3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD) },
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
*/
|
||||
|
||||
|
||||
@@ -911,15 +911,21 @@ static void hid_dump_input_mapping(struct hid_device *hid, struct seq_file *f)
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int hid_debug_rdesc_show(struct seq_file *f, void *p)
|
||||
{
|
||||
struct hid_device *hdev = f->private;
|
||||
const __u8 *rdesc = hdev->rdesc;
|
||||
unsigned rsize = hdev->rsize;
|
||||
int i;
|
||||
|
||||
if (!rdesc) {
|
||||
rdesc = hdev->dev_rdesc;
|
||||
rsize = hdev->dev_rsize;
|
||||
}
|
||||
|
||||
/* dump HID report descriptor */
|
||||
for (i = 0; i < hdev->rsize; i++)
|
||||
seq_printf(f, "%02x ", hdev->rdesc[i]);
|
||||
for (i = 0; i < rsize; i++)
|
||||
seq_printf(f, "%02x ", rdesc[i]);
|
||||
seq_printf(f, "\n\n");
|
||||
|
||||
/* dump parsed data and input mappings */
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
*/
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
* Copyright (c) 1999 Andreas Gal
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
* Copyright (c) 2006-2008 Jiri Kosina
|
||||
*/
|
||||
|
||||
@@ -100,8 +100,7 @@ static void holtekff_send(struct holtekff_device *holtekff,
|
||||
holtekff->field->value[i] = data[i];
|
||||
}
|
||||
|
||||
dbg_hid("sending %02x %02x %02x %02x %02x %02x %02x\n", data[0],
|
||||
data[1], data[2], data[3], data[4], data[5], data[6]);
|
||||
dbg_hid("sending %*ph\n", 7, data);
|
||||
|
||||
usbhid_submit_report(hid, holtekff->field->report, USB_DIR_OUT);
|
||||
}
|
||||
|
||||
+14
-2
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -269,7 +268,11 @@
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72FA 0x72fa
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7302 0x7302
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7349 0x7349
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_73F7 0x73f7
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001 0xa001
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_7224 0x7224
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72D0 0x72d0
|
||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_72C4 0x72c4
|
||||
|
||||
#define USB_VENDOR_ID_ELECOM 0x056e
|
||||
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
|
||||
@@ -283,6 +286,9 @@
|
||||
#define USB_VENDOR_ID_EMS 0x2006
|
||||
#define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118
|
||||
|
||||
#define USB_VENDOR_ID_FLATFROG 0x25b5
|
||||
#define USB_DEVICE_ID_MULTITOUCH_3200 0x0002
|
||||
|
||||
#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
|
||||
#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
|
||||
|
||||
@@ -296,6 +302,9 @@
|
||||
#define USB_VENDOR_ID_EZKEY 0x0518
|
||||
#define USB_DEVICE_ID_BTC_8193 0x0002
|
||||
|
||||
#define USB_VENDOR_ID_FREESCALE 0x15A2
|
||||
#define USB_DEVICE_ID_FREESCALE_MX28 0x004F
|
||||
|
||||
#define USB_VENDOR_ID_FRUCTEL 0x25B6
|
||||
#define USB_DEVICE_ID_GAMETEL_MT_MODE 0x0002
|
||||
|
||||
@@ -305,6 +314,7 @@
|
||||
|
||||
#define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN8_PWT_TENFINGERS 0x0100
|
||||
|
||||
#define USB_VENDOR_ID_GLAB 0x06c2
|
||||
#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
|
||||
@@ -496,6 +506,7 @@
|
||||
#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
|
||||
#define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110
|
||||
#define USB_DEVICE_ID_LOGITECH_HARMONY_LAST 0xc14f
|
||||
#define USB_DEVICE_ID_LOGITECH_HARMONY_PS3 0x0306
|
||||
#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD 0xc20a
|
||||
#define USB_DEVICE_ID_LOGITECH_RUMBLEPAD 0xc211
|
||||
#define USB_DEVICE_ID_LOGITECH_EXTREME_3D 0xc215
|
||||
@@ -652,7 +663,6 @@
|
||||
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000
|
||||
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001 0x3001
|
||||
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008 0x3008
|
||||
#define USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN 0x3001
|
||||
|
||||
#define USB_VENDOR_ID_ROCCAT 0x1e7d
|
||||
#define USB_DEVICE_ID_ROCCAT_ARVO 0x30d4
|
||||
@@ -683,6 +693,7 @@
|
||||
|
||||
#define USB_VENDOR_ID_SONY 0x054c
|
||||
#define USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE 0x024b
|
||||
#define USB_DEVICE_ID_SONY_PS3_BDREMOTE 0x0306
|
||||
#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268
|
||||
#define USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER 0x042f
|
||||
|
||||
@@ -758,6 +769,7 @@
|
||||
#define USB_DEVICE_ID_UCLOGIC_TABLET_WP8060U 0x0005
|
||||
#define USB_DEVICE_ID_UCLOGIC_TABLET_WP1062 0x0064
|
||||
#define USB_DEVICE_ID_UCLOGIC_WIRELESS_TABLET_TWHL850 0x0522
|
||||
#define USB_DEVICE_ID_UCLOGIC_TABLET_TWHA60 0x0781
|
||||
|
||||
#define USB_VENDOR_ID_UNITEC 0x227d
|
||||
#define USB_DEVICE_ID_UNITEC_USB_TOUCH_0709 0x0709
|
||||
|
||||
@@ -1154,6 +1154,7 @@ static void report_features(struct hid_device *hid)
|
||||
|
||||
int hidinput_connect(struct hid_device *hid, unsigned int force)
|
||||
{
|
||||
struct hid_driver *drv = hid->driver;
|
||||
struct hid_report *report;
|
||||
struct hid_input *hidinput = NULL;
|
||||
struct input_dev *input_dev;
|
||||
@@ -1228,6 +1229,8 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
|
||||
* UGCI) cram a lot of unrelated inputs into the
|
||||
* same interface. */
|
||||
hidinput->report = report;
|
||||
if (drv->input_configured)
|
||||
drv->input_configured(hid, hidinput);
|
||||
if (input_register_device(hidinput->input))
|
||||
goto out_cleanup;
|
||||
hidinput = NULL;
|
||||
@@ -1235,8 +1238,12 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
|
||||
}
|
||||
}
|
||||
|
||||
if (hidinput && input_register_device(hidinput->input))
|
||||
goto out_cleanup;
|
||||
if (hidinput) {
|
||||
if (drv->input_configured)
|
||||
drv->input_configured(hid, hidinput);
|
||||
if (input_register_device(hidinput->input))
|
||||
goto out_cleanup;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ static int ts_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
struct hid_field *field, struct hid_usage *usage,
|
||||
unsigned long **bit, int *max)
|
||||
{
|
||||
if ((usage->hid & HID_USAGE_PAGE) != 0x0ffbc0000)
|
||||
if ((usage->hid & HID_USAGE_PAGE) != HID_UP_LOGIVENDOR)
|
||||
return 0;
|
||||
|
||||
switch (usage->hid & HID_USAGE) {
|
||||
|
||||
+33
-114
@@ -56,9 +56,8 @@ static int tpkbd_input_mapping(struct hid_device *hdev,
|
||||
static int tpkbd_features_set(struct hid_device *hdev)
|
||||
{
|
||||
struct hid_report *report;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
report = hdev->report_enum[HID_FEATURE_REPORT].report_id_hash[4];
|
||||
|
||||
report->field[0]->value[0] = data_pointer->press_to_select ? 0x01 : 0x02;
|
||||
@@ -77,14 +76,8 @@ static ssize_t pointer_press_to_select_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->press_to_select);
|
||||
}
|
||||
@@ -94,16 +87,10 @@ static ssize_t pointer_press_to_select_store(struct device *dev,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int value;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (kstrtoint(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
if (value < 0 || value > 1)
|
||||
@@ -119,14 +106,8 @@ static ssize_t pointer_dragging_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->dragging);
|
||||
}
|
||||
@@ -136,16 +117,10 @@ static ssize_t pointer_dragging_store(struct device *dev,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int value;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (kstrtoint(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
if (value < 0 || value > 1)
|
||||
@@ -161,14 +136,8 @@ static ssize_t pointer_release_to_select_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->release_to_select);
|
||||
}
|
||||
@@ -178,16 +147,10 @@ static ssize_t pointer_release_to_select_store(struct device *dev,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int value;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (kstrtoint(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
if (value < 0 || value > 1)
|
||||
@@ -203,14 +166,8 @@ static ssize_t pointer_select_right_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%u\n", data_pointer->select_right);
|
||||
}
|
||||
@@ -220,16 +177,10 @@ static ssize_t pointer_select_right_store(struct device *dev,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int value;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (kstrtoint(buf, 10, &value))
|
||||
return -EINVAL;
|
||||
if (value < 0 || value > 1)
|
||||
@@ -245,14 +196,8 @@ static ssize_t pointer_sensitivity_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%u\n",
|
||||
data_pointer->sensitivity);
|
||||
@@ -263,16 +208,10 @@ static ssize_t pointer_sensitivity_store(struct device *dev,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int value;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -286,14 +225,10 @@ static ssize_t pointer_press_speed_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%u\n",
|
||||
data_pointer->press_speed);
|
||||
@@ -304,16 +239,10 @@ static ssize_t pointer_press_speed_store(struct device *dev,
|
||||
const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int value;
|
||||
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
if (hdev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (kstrtoint(buf, 10, &value) || value < 1 || value > 255)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -370,15 +299,11 @@ static const struct attribute_group tpkbd_attr_group_pointer = {
|
||||
static enum led_brightness tpkbd_led_brightness_get(
|
||||
struct led_classdev *led_cdev)
|
||||
{
|
||||
struct device *dev;
|
||||
struct hid_device *hdev;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct device *dev = led_cdev->dev->parent;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
int led_nr = 0;
|
||||
|
||||
dev = led_cdev->dev->parent;
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (led_cdev == &data_pointer->led_micmute)
|
||||
led_nr = 1;
|
||||
|
||||
@@ -390,16 +315,12 @@ static enum led_brightness tpkbd_led_brightness_get(
|
||||
static void tpkbd_led_brightness_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness value)
|
||||
{
|
||||
struct device *dev;
|
||||
struct hid_device *hdev;
|
||||
struct device *dev = led_cdev->dev->parent;
|
||||
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
struct hid_report *report;
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
int led_nr = 0;
|
||||
|
||||
dev = led_cdev->dev->parent;
|
||||
hdev = container_of(dev, struct hid_device, dev);
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
if (led_cdev == &data_pointer->led_micmute)
|
||||
led_nr = 1;
|
||||
|
||||
@@ -508,13 +429,11 @@ err_free:
|
||||
|
||||
static void tpkbd_remove_tp(struct hid_device *hdev)
|
||||
{
|
||||
struct tpkbd_data_pointer *data_pointer;
|
||||
struct tpkbd_data_pointer *data_pointer = hid_get_drvdata(hdev);
|
||||
|
||||
sysfs_remove_group(&hdev->dev.kobj,
|
||||
&tpkbd_attr_group_pointer);
|
||||
|
||||
data_pointer = (struct tpkbd_data_pointer *) hid_get_drvdata(hdev);
|
||||
|
||||
led_classdev_unregister(&data_pointer->led_micmute);
|
||||
led_classdev_unregister(&data_pointer->led_mute);
|
||||
|
||||
|
||||
+11
-9
@@ -5,7 +5,6 @@
|
||||
* Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz>
|
||||
* Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc
|
||||
* Copyright (c) 2006-2007 Jiri Kosina
|
||||
* Copyright (c) 2007 Paul Walmsley
|
||||
* Copyright (c) 2008 Jiri Slaby
|
||||
* Copyright (c) 2010 Hendrik Iben
|
||||
*/
|
||||
@@ -109,7 +108,7 @@ static __u8 dfp_rdesc_fixed[] = {
|
||||
static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
unsigned int *rsize)
|
||||
{
|
||||
struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
|
||||
struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
|
||||
|
||||
if ((drv_data->quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 &&
|
||||
rdesc[84] == 0x8c && rdesc[85] == 0x02) {
|
||||
@@ -278,7 +277,7 @@ static int lg_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
0, 0, 0, 0, 0,183,184,185,186,187,
|
||||
188,189,190,191,192,193,194, 0, 0, 0
|
||||
};
|
||||
struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
|
||||
struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
|
||||
unsigned int hid = usage->hid;
|
||||
|
||||
if (hdev->product == USB_DEVICE_ID_LOGITECH_RECEIVER &&
|
||||
@@ -319,7 +318,7 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
||||
struct hid_field *field, struct hid_usage *usage,
|
||||
unsigned long **bit, int *max)
|
||||
{
|
||||
struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
|
||||
struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
|
||||
|
||||
if ((drv_data->quirks & LG_BAD_RELATIVE_KEYS) && usage->type == EV_KEY &&
|
||||
(field->flags & HID_MAIN_ITEM_RELATIVE))
|
||||
@@ -335,13 +334,16 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
||||
static int lg_event(struct hid_device *hdev, struct hid_field *field,
|
||||
struct hid_usage *usage, __s32 value)
|
||||
{
|
||||
struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
|
||||
struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
|
||||
|
||||
if ((drv_data->quirks & LG_INVERT_HWHEEL) && usage->code == REL_HWHEEL) {
|
||||
input_event(field->hidinput->input, usage->type, usage->code,
|
||||
-value);
|
||||
return 1;
|
||||
}
|
||||
if (drv_data->quirks & LG_FF4) {
|
||||
return lg4ff_adjust_input_event(hdev, field, usage, value, drv_data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -358,7 +360,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
return -ENOMEM;
|
||||
}
|
||||
drv_data->quirks = id->driver_data;
|
||||
|
||||
|
||||
hid_set_drvdata(hdev, (void *)drv_data);
|
||||
|
||||
if (drv_data->quirks & LG_NOGET)
|
||||
@@ -380,7 +382,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
}
|
||||
|
||||
/* Setup wireless link with Logitech Wii wheel */
|
||||
if(hdev->product == USB_DEVICE_ID_LOGITECH_WII_WHEEL) {
|
||||
if (hdev->product == USB_DEVICE_ID_LOGITECH_WII_WHEEL) {
|
||||
unsigned char buf[] = { 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
ret = hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
|
||||
@@ -416,7 +418,7 @@ err_free:
|
||||
|
||||
static void lg_remove(struct hid_device *hdev)
|
||||
{
|
||||
struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
|
||||
struct lg_drv_data *drv_data = hid_get_drvdata(hdev);
|
||||
if (drv_data->quirks & LG_FF4)
|
||||
lg4ff_deinit(hdev);
|
||||
|
||||
@@ -476,7 +478,7 @@ static const struct hid_device_id lg_devices[] = {
|
||||
.driver_data = LG_NOGET | LG_FF4 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WII_WHEEL),
|
||||
.driver_data = LG_FF4 },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG ),
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WINGMAN_FFG),
|
||||
.driver_data = LG_FF },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RUMBLEPAD2),
|
||||
.driver_data = LG_FF2 },
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user