Merge branches 'upstream' and 'upstream-fixes' into for-linus
This commit is contained in:
commit
c3d9d74336
@ -56,20 +56,20 @@ menu "Special HID drivers"
|
|||||||
depends on HID
|
depends on HID
|
||||||
|
|
||||||
config HID_3M_PCT
|
config HID_3M_PCT
|
||||||
tristate "3M PCT"
|
tristate "3M PCT touchscreen"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for 3M PCT touch screens.
|
Support for 3M PCT touch screens.
|
||||||
|
|
||||||
config HID_A4TECH
|
config HID_A4TECH
|
||||||
tristate "A4 tech" if EMBEDDED
|
tristate "A4 tech mice" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for A4 tech X5 and WOP-35 / Trust 450L mice.
|
Support for A4 tech X5 and WOP-35 / Trust 450L mice.
|
||||||
|
|
||||||
config HID_ACRUX_FF
|
config HID_ACRUX_FF
|
||||||
tristate "ACRUX force feedback support"
|
tristate "ACRUX force feedback"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
select INPUT_FF_MEMLESS
|
select INPUT_FF_MEMLESS
|
||||||
---help---
|
---help---
|
||||||
@ -77,7 +77,7 @@ config HID_ACRUX_FF
|
|||||||
game controllers.
|
game controllers.
|
||||||
|
|
||||||
config HID_APPLE
|
config HID_APPLE
|
||||||
tristate "Apple" if EMBEDDED
|
tristate "Apple {i,Power,Mac}Books" if EMBEDDED
|
||||||
depends on (USB_HID || BT_HIDP)
|
depends on (USB_HID || BT_HIDP)
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
@ -88,7 +88,7 @@ config HID_APPLE
|
|||||||
MacBooks, MacBook Pros and Apple Aluminum.
|
MacBooks, MacBook Pros and Apple Aluminum.
|
||||||
|
|
||||||
config HID_BELKIN
|
config HID_BELKIN
|
||||||
tristate "Belkin" if EMBEDDED
|
tristate "Belkin Flip KVM and Wireless keyboard" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
@ -101,14 +101,14 @@ config HID_CANDO
|
|||||||
Support for Cando dual touch panel.
|
Support for Cando dual touch panel.
|
||||||
|
|
||||||
config HID_CHERRY
|
config HID_CHERRY
|
||||||
tristate "Cherry" if EMBEDDED
|
tristate "Cherry Cymotion keyboard" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for Cherry Cymotion keyboard.
|
Support for Cherry Cymotion keyboard.
|
||||||
|
|
||||||
config HID_CHICONY
|
config HID_CHICONY
|
||||||
tristate "Chicony" if EMBEDDED
|
tristate "Chicony Tactical pad" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
@ -130,20 +130,20 @@ config HID_PRODIKEYS
|
|||||||
and some additional multimedia keys.
|
and some additional multimedia keys.
|
||||||
|
|
||||||
config HID_CYPRESS
|
config HID_CYPRESS
|
||||||
tristate "Cypress" if EMBEDDED
|
tristate "Cypress mouse and barcode readers" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for cypress mouse and barcode readers.
|
Support for cypress mouse and barcode readers.
|
||||||
|
|
||||||
config HID_DRAGONRISE
|
config HID_DRAGONRISE
|
||||||
tristate "DragonRise Inc. support"
|
tristate "DragonRise Inc. game controller"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you have DragonRise Inc.game controllers.
|
Say Y here if you have DragonRise Inc.game controllers.
|
||||||
|
|
||||||
config DRAGONRISE_FF
|
config DRAGONRISE_FF
|
||||||
bool "DragonRise Inc. force feedback support"
|
bool "DragonRise Inc. force feedback"
|
||||||
depends on HID_DRAGONRISE
|
depends on HID_DRAGONRISE
|
||||||
select INPUT_FF_MEMLESS
|
select INPUT_FF_MEMLESS
|
||||||
---help---
|
---help---
|
||||||
@ -157,46 +157,46 @@ config HID_EGALAX
|
|||||||
Support for the eGalax dual-touch panel.
|
Support for the eGalax dual-touch panel.
|
||||||
|
|
||||||
config HID_ELECOM
|
config HID_ELECOM
|
||||||
tristate "ELECOM"
|
tristate "ELECOM BM084 bluetooth mouse"
|
||||||
depends on BT_HIDP
|
depends on BT_HIDP
|
||||||
---help---
|
---help---
|
||||||
Support for the ELECOM BM084 (bluetooth mouse).
|
Support for the ELECOM BM084 (bluetooth mouse).
|
||||||
|
|
||||||
config HID_EZKEY
|
config HID_EZKEY
|
||||||
tristate "Ezkey" if EMBEDDED
|
tristate "Ezkey BTC 8193 keyboard" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for Ezkey BTC 8193 keyboard.
|
Support for Ezkey BTC 8193 keyboard.
|
||||||
|
|
||||||
config HID_KYE
|
config HID_KYE
|
||||||
tristate "Kye" if EMBEDDED
|
tristate "Kye/Genius Ergo Mouse" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for Kye/Genius Ergo Mouse.
|
Support for Kye/Genius Ergo Mouse.
|
||||||
|
|
||||||
config HID_GYRATION
|
config HID_GYRATION
|
||||||
tristate "Gyration"
|
tristate "Gyration remote control"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Gyration remote control.
|
Support for Gyration remote control.
|
||||||
|
|
||||||
config HID_TWINHAN
|
config HID_TWINHAN
|
||||||
tristate "Twinhan"
|
tristate "Twinhan IR remote control"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Twinhan IR remote control.
|
Support for Twinhan IR remote control.
|
||||||
|
|
||||||
config HID_KENSINGTON
|
config HID_KENSINGTON
|
||||||
tristate "Kensington" if EMBEDDED
|
tristate "Kensington Slimblade Trackball" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for Kensington Slimblade Trackball.
|
Support for Kensington Slimblade Trackball.
|
||||||
|
|
||||||
config HID_LOGITECH
|
config HID_LOGITECH
|
||||||
tristate "Logitech" if EMBEDDED
|
tristate "Logitech devices" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
@ -245,39 +245,39 @@ config HID_MAGICMOUSE
|
|||||||
Apple Wireless "Magic" Mouse.
|
Apple Wireless "Magic" Mouse.
|
||||||
|
|
||||||
config HID_MICROSOFT
|
config HID_MICROSOFT
|
||||||
tristate "Microsoft" if EMBEDDED
|
tristate "Microsoft non-fully HID-compliant devices" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for Microsoft devices that are not fully compliant with HID standard.
|
Support for Microsoft devices that are not fully compliant with HID standard.
|
||||||
|
|
||||||
config HID_MOSART
|
config HID_MOSART
|
||||||
tristate "MosArt"
|
tristate "MosArt dual-touch panels"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for MosArt dual-touch panels.
|
Support for MosArt dual-touch panels.
|
||||||
|
|
||||||
config HID_MONTEREY
|
config HID_MONTEREY
|
||||||
tristate "Monterey" if EMBEDDED
|
tristate "Monterey Genius KB29E keyboard" if EMBEDDED
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
default !EMBEDDED
|
default !EMBEDDED
|
||||||
---help---
|
---help---
|
||||||
Support for Monterey Genius KB29E.
|
Support for Monterey Genius KB29E.
|
||||||
|
|
||||||
config HID_NTRIG
|
config HID_NTRIG
|
||||||
tristate "NTrig"
|
tristate "N-Trig touch screen"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for N-Trig touch screen.
|
Support for N-Trig touch screen.
|
||||||
|
|
||||||
config HID_ORTEK
|
config HID_ORTEK
|
||||||
tristate "Ortek"
|
tristate "Ortek WKB-2000 wireless keyboard and mouse trackpad"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Ortek WKB-2000 wireless keyboard + mouse trackpad.
|
Support for Ortek WKB-2000 wireless keyboard + mouse trackpad.
|
||||||
|
|
||||||
config HID_PANTHERLORD
|
config HID_PANTHERLORD
|
||||||
tristate "Pantherlord support"
|
tristate "Pantherlord/GreenAsia game controller"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you have a PantherLord/GreenAsia based game controller
|
Say Y here if you have a PantherLord/GreenAsia based game controller
|
||||||
@ -292,7 +292,7 @@ config PANTHERLORD_FF
|
|||||||
or adapter and want to enable force feedback support for it.
|
or adapter and want to enable force feedback support for it.
|
||||||
|
|
||||||
config HID_PETALYNX
|
config HID_PETALYNX
|
||||||
tristate "Petalynx"
|
tristate "Petalynx Maxter remote control"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Petalynx Maxter remote control.
|
Support for Petalynx Maxter remote control.
|
||||||
@ -356,7 +356,7 @@ config HID_PICOLCD_LEDS
|
|||||||
Provide access to PicoLCD's GPO pins via leds class.
|
Provide access to PicoLCD's GPO pins via leds class.
|
||||||
|
|
||||||
config HID_QUANTA
|
config HID_QUANTA
|
||||||
tristate "Quanta Optical Touch"
|
tristate "Quanta Optical Touch panels"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Quanta Optical Touch dual-touch panels.
|
Support for Quanta Optical Touch dual-touch panels.
|
||||||
@ -377,31 +377,31 @@ config HID_ROCCAT_KONE
|
|||||||
Support for Roccat Kone mouse.
|
Support for Roccat Kone mouse.
|
||||||
|
|
||||||
config HID_SAMSUNG
|
config HID_SAMSUNG
|
||||||
tristate "Samsung"
|
tristate "Samsung InfraRed remote control or keyboards"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Samsung InfraRed remote control or keyboards.
|
Support for Samsung InfraRed remote control or keyboards.
|
||||||
|
|
||||||
config HID_SONY
|
config HID_SONY
|
||||||
tristate "Sony"
|
tristate "Sony PS3 controller"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Sony PS3 controller.
|
Support for Sony PS3 controller.
|
||||||
|
|
||||||
config HID_STANTUM
|
config HID_STANTUM
|
||||||
tristate "Stantum"
|
tristate "Stantum multitouch panel"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Stantum multitouch panel.
|
Support for Stantum multitouch panel.
|
||||||
|
|
||||||
config HID_SUNPLUS
|
config HID_SUNPLUS
|
||||||
tristate "Sunplus"
|
tristate "Sunplus wireless desktop"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Support for Sunplus wireless desktop.
|
Support for Sunplus wireless desktop.
|
||||||
|
|
||||||
config HID_GREENASIA
|
config HID_GREENASIA
|
||||||
tristate "GreenAsia (Product ID 0x12) support"
|
tristate "GreenAsia (Product ID 0x12) game controller support"
|
||||||
depends on USB_HID
|
depends on USB_HID
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you have a GreenAsia (Product ID 0x12) based game
|
Say Y here if you have a GreenAsia (Product ID 0x12) based game
|
||||||
|
@ -133,6 +133,8 @@ static const struct hid_device_id a4_devices[] = {
|
|||||||
.driver_data = A4_2WHEEL_MOUSE_HACK_7 },
|
.driver_data = A4_2WHEEL_MOUSE_HACK_7 },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D),
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D),
|
||||||
.driver_data = A4_2WHEEL_MOUSE_HACK_B8 },
|
.driver_data = A4_2WHEEL_MOUSE_HACK_B8 },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649),
|
||||||
|
.driver_data = A4_2WHEEL_MOUSE_HACK_B8 },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(hid, a4_devices);
|
MODULE_DEVICE_TABLE(hid, a4_devices);
|
||||||
|
@ -1241,6 +1241,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_3M, USB_DEVICE_ID_3M2256) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) },
|
{ 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) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_RP_649) },
|
||||||
#if defined(CONFIG_HID_ACRUX_FF) || defined(CONFIG_HID_ACRUX_FF_MODULE)
|
#if defined(CONFIG_HID_ACRUX_FF) || defined(CONFIG_HID_ACRUX_FF_MODULE)
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) },
|
||||||
#endif
|
#endif
|
||||||
@ -1377,6 +1378,8 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SUNPLUS, USB_DEVICE_ID_SUNPLUS_WDESKTOP) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb300) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_THRUSTMASTER, 0xb304) },
|
||||||
|
@ -570,6 +570,8 @@ void hid_debug_event(struct hid_device *hdev, char *buf)
|
|||||||
buf[i];
|
buf[i];
|
||||||
list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE;
|
list->tail = (list->tail + i) % HID_DEBUG_BUFSIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wake_up_interruptible(&hdev->debug_wait);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(hid_debug_event);
|
EXPORT_SYMBOL_GPL(hid_debug_event);
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#define USB_VENDOR_ID_A4TECH 0x09da
|
#define USB_VENDOR_ID_A4TECH 0x09da
|
||||||
#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
|
#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006
|
||||||
#define USB_DEVICE_ID_A4TECH_X5_005D 0x000a
|
#define USB_DEVICE_ID_A4TECH_X5_005D 0x000a
|
||||||
|
#define USB_DEVICE_ID_A4TECH_RP_649 0x001a
|
||||||
|
|
||||||
#define USB_VENDOR_ID_AASHIMA 0x06d6
|
#define USB_VENDOR_ID_AASHIMA 0x06d6
|
||||||
#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025
|
#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025
|
||||||
@ -142,6 +143,7 @@
|
|||||||
#define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE 0x0051
|
#define USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE 0x0051
|
||||||
#define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff
|
#define USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE 0x00ff
|
||||||
#define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3
|
#define USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK 0x00d3
|
||||||
|
#define USB_DEVICE_ID_CH_AXIS_295 0x001c
|
||||||
|
|
||||||
#define USB_VENDOR_ID_CHERRY 0x046a
|
#define USB_VENDOR_ID_CHERRY 0x046a
|
||||||
#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023
|
#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023
|
||||||
@ -485,6 +487,12 @@
|
|||||||
#define USB_VENDOR_ID_STANTUM 0x1f87
|
#define USB_VENDOR_ID_STANTUM 0x1f87
|
||||||
#define USB_DEVICE_ID_MTP 0x0002
|
#define USB_DEVICE_ID_MTP 0x0002
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_STANTUM_STM 0x0483
|
||||||
|
#define USB_DEVICE_ID_MTP_STM 0x3261
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_STANTUM_SITRONIX 0x1403
|
||||||
|
#define USB_DEVICE_ID_MTP_SITRONIX 0x5001
|
||||||
|
|
||||||
#define USB_VENDOR_ID_SUN 0x0430
|
#define USB_VENDOR_ID_SUN 0x0430
|
||||||
#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
|
#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab
|
||||||
|
|
||||||
|
@ -149,6 +149,83 @@ static int hidinput_setkeycode(struct input_dev *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hidinput_calc_abs_res - calculate an absolute axis resolution
|
||||||
|
* @field: the HID report field to calculate resolution for
|
||||||
|
* @code: axis code
|
||||||
|
*
|
||||||
|
* The formula is:
|
||||||
|
* (logical_maximum - logical_minimum)
|
||||||
|
* resolution = ----------------------------------------------------------
|
||||||
|
* (physical_maximum - physical_minimum) * 10 ^ unit_exponent
|
||||||
|
*
|
||||||
|
* as seen in the HID specification v1.11 6.2.2.7 Global Items.
|
||||||
|
*
|
||||||
|
* Only exponent 1 length units are processed. Centimeters are converted to
|
||||||
|
* inches. Degrees are converted to radians.
|
||||||
|
*/
|
||||||
|
static __s32 hidinput_calc_abs_res(const struct hid_field *field, __u16 code)
|
||||||
|
{
|
||||||
|
__s32 unit_exponent = field->unit_exponent;
|
||||||
|
__s32 logical_extents = field->logical_maximum -
|
||||||
|
field->logical_minimum;
|
||||||
|
__s32 physical_extents = field->physical_maximum -
|
||||||
|
field->physical_minimum;
|
||||||
|
__s32 prev;
|
||||||
|
|
||||||
|
/* Check if the extents are sane */
|
||||||
|
if (logical_extents <= 0 || physical_extents <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Verify and convert units.
|
||||||
|
* See HID specification v1.11 6.2.2.7 Global Items for unit decoding
|
||||||
|
*/
|
||||||
|
if (code == ABS_X || code == ABS_Y || code == ABS_Z) {
|
||||||
|
if (field->unit == 0x11) { /* If centimeters */
|
||||||
|
/* Convert to inches */
|
||||||
|
prev = logical_extents;
|
||||||
|
logical_extents *= 254;
|
||||||
|
if (logical_extents < prev)
|
||||||
|
return 0;
|
||||||
|
unit_exponent += 2;
|
||||||
|
} else if (field->unit != 0x13) { /* If not inches */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (code == ABS_RX || code == ABS_RY || code == ABS_RZ) {
|
||||||
|
if (field->unit == 0x14) { /* If degrees */
|
||||||
|
/* Convert to radians */
|
||||||
|
prev = logical_extents;
|
||||||
|
logical_extents *= 573;
|
||||||
|
if (logical_extents < prev)
|
||||||
|
return 0;
|
||||||
|
unit_exponent += 1;
|
||||||
|
} else if (field->unit != 0x12) { /* If not radians */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Apply negative unit exponent */
|
||||||
|
for (; unit_exponent < 0; unit_exponent++) {
|
||||||
|
prev = logical_extents;
|
||||||
|
logical_extents *= 10;
|
||||||
|
if (logical_extents < prev)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* Apply positive unit exponent */
|
||||||
|
for (; unit_exponent > 0; unit_exponent--) {
|
||||||
|
prev = physical_extents;
|
||||||
|
physical_extents *= 10;
|
||||||
|
if (physical_extents < prev)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate resolution */
|
||||||
|
return logical_extents / physical_extents;
|
||||||
|
}
|
||||||
|
|
||||||
static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
|
static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
|
||||||
struct hid_usage *usage)
|
struct hid_usage *usage)
|
||||||
{
|
{
|
||||||
@ -537,6 +614,9 @@ mapped:
|
|||||||
input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4);
|
input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4);
|
||||||
else input_set_abs_params(input, usage->code, a, b, 0, 0);
|
else input_set_abs_params(input, usage->code, a, b, 0, 0);
|
||||||
|
|
||||||
|
input_abs_set_res(input, usage->code,
|
||||||
|
hidinput_calc_abs_res(field, usage->code));
|
||||||
|
|
||||||
/* use a larger default input buffer for MT devices */
|
/* use a larger default input buffer for MT devices */
|
||||||
if (usage->code == ABS_MT_POSITION_X && input->hint_events_per_packet == 0)
|
if (usage->code == ABS_MT_POSITION_X && input->hint_events_per_packet == 0)
|
||||||
input_set_events_per_packet(input, 60);
|
input_set_events_per_packet(input, 60);
|
||||||
|
@ -24,7 +24,9 @@
|
|||||||
|
|
||||||
#include "hid-ids.h"
|
#include "hid-ids.h"
|
||||||
|
|
||||||
#define VAIO_RDESC_CONSTANT 0x0001
|
#define VAIO_RDESC_CONSTANT (1 << 0)
|
||||||
|
#define SIXAXIS_CONTROLLER_USB (1 << 1)
|
||||||
|
#define SIXAXIS_CONTROLLER_BT (1 << 2)
|
||||||
|
|
||||||
struct sony_sc {
|
struct sony_sc {
|
||||||
unsigned long quirks;
|
unsigned long quirks;
|
||||||
@ -44,12 +46,31 @@ static void sony_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int sixaxis_usb_output_raw_report(struct hid_device *hid, __u8 *buf,
|
||||||
|
size_t count, unsigned char report_type)
|
||||||
|
{
|
||||||
|
struct usb_interface *intf = to_usb_interface(hid->dev.parent);
|
||||||
|
struct usb_device *dev = interface_to_usbdev(intf);
|
||||||
|
struct usb_host_interface *interface = intf->cur_altsetting;
|
||||||
|
int report_id = buf[0];
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
||||||
|
HID_REQ_SET_REPORT,
|
||||||
|
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
|
||||||
|
((report_type + 1) << 8) | report_id,
|
||||||
|
interface->desc.bInterfaceNumber, buf, count,
|
||||||
|
USB_CTRL_SET_TIMEOUT);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
|
* Sending HID_REQ_GET_REPORT changes the operation mode of the ps3 controller
|
||||||
* to "operational". Without this, the ps3 controller will not report any
|
* to "operational". Without this, the ps3 controller will not report any
|
||||||
* events.
|
* events.
|
||||||
*/
|
*/
|
||||||
static int sony_set_operational_usb(struct hid_device *hdev)
|
static int sixaxis_set_operational_usb(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
|
||||||
struct usb_device *dev = interface_to_usbdev(intf);
|
struct usb_device *dev = interface_to_usbdev(intf);
|
||||||
@ -74,7 +95,7 @@ static int sony_set_operational_usb(struct hid_device *hdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sony_set_operational_bt(struct hid_device *hdev)
|
static int sixaxis_set_operational_bt(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
|
unsigned char buf[] = { 0xf4, 0x42, 0x03, 0x00, 0x00 };
|
||||||
return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
|
return hdev->hid_output_raw_report(hdev, buf, sizeof(buf), HID_FEATURE_REPORT);
|
||||||
@ -108,16 +129,14 @@ static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
|||||||
goto err_free;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (hdev->bus) {
|
if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
|
||||||
case BUS_USB:
|
hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
|
||||||
ret = sony_set_operational_usb(hdev);
|
ret = sixaxis_set_operational_usb(hdev);
|
||||||
break;
|
|
||||||
case BUS_BLUETOOTH:
|
|
||||||
ret = sony_set_operational_bt(hdev);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ret = 0;
|
|
||||||
}
|
}
|
||||||
|
else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
|
||||||
|
ret = sixaxis_set_operational_bt(hdev);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err_stop;
|
goto err_stop;
|
||||||
@ -137,8 +156,10 @@ static void sony_remove(struct hid_device *hdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct hid_device_id sony_devices[] = {
|
static const struct hid_device_id sony_devices[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
|
||||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) },
|
.driver_data = SIXAXIS_CONTROLLER_USB },
|
||||||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER),
|
||||||
|
.driver_data = SIXAXIS_CONTROLLER_BT },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
|
{ HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE),
|
||||||
.driver_data = VAIO_RDESC_CONSTANT },
|
.driver_data = VAIO_RDESC_CONSTANT },
|
||||||
{ }
|
{ }
|
||||||
|
@ -249,6 +249,8 @@ static void stantum_remove(struct hid_device *hdev)
|
|||||||
|
|
||||||
static const struct hid_device_id stantum_devices[] = {
|
static const struct hid_device_id stantum_devices[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM, USB_DEVICE_ID_MTP) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM, USB_DEVICE_ID_MTP_STM) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX, USB_DEVICE_ID_MTP_SITRONIX) },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(hid, stantum_devices);
|
MODULE_DEVICE_TABLE(hid, stantum_devices);
|
||||||
|
@ -218,9 +218,13 @@ static int hidraw_release(struct inode * inode, struct file * file)
|
|||||||
unsigned int minor = iminor(inode);
|
unsigned int minor = iminor(inode);
|
||||||
struct hidraw *dev;
|
struct hidraw *dev;
|
||||||
struct hidraw_list *list = file->private_data;
|
struct hidraw_list *list = file->private_data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!hidraw_table[minor])
|
mutex_lock(&minors_lock);
|
||||||
return -ENODEV;
|
if (!hidraw_table[minor]) {
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
list_del(&list->node);
|
list_del(&list->node);
|
||||||
dev = hidraw_table[minor];
|
dev = hidraw_table[minor];
|
||||||
@ -233,10 +237,12 @@ static int hidraw_release(struct inode * inode, struct file * file)
|
|||||||
kfree(list->hidraw);
|
kfree(list->hidraw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(list);
|
kfree(list);
|
||||||
|
ret = 0;
|
||||||
|
unlock:
|
||||||
|
mutex_unlock(&minors_lock);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long hidraw_ioctl(struct file *file, unsigned int cmd,
|
static long hidraw_ioctl(struct file *file, unsigned int cmd,
|
||||||
|
@ -810,6 +810,7 @@ static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t co
|
|||||||
if (usbhid->urbout) {
|
if (usbhid->urbout) {
|
||||||
int actual_length;
|
int actual_length;
|
||||||
int skipped_report_id = 0;
|
int skipped_report_id = 0;
|
||||||
|
|
||||||
if (buf[0] == 0x0) {
|
if (buf[0] == 0x0) {
|
||||||
/* Don't send the Report ID */
|
/* Don't send the Report ID */
|
||||||
buf++;
|
buf++;
|
||||||
@ -1469,9 +1470,6 @@ static int __init hid_init(void)
|
|||||||
retval = usbhid_quirks_init(quirks_param);
|
retval = usbhid_quirks_init(quirks_param);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto usbhid_quirks_init_fail;
|
goto usbhid_quirks_init_fail;
|
||||||
retval = hiddev_init();
|
|
||||||
if (retval)
|
|
||||||
goto hiddev_init_fail;
|
|
||||||
retval = usb_register(&hid_driver);
|
retval = usb_register(&hid_driver);
|
||||||
if (retval)
|
if (retval)
|
||||||
goto usb_register_fail;
|
goto usb_register_fail;
|
||||||
@ -1479,8 +1477,6 @@ static int __init hid_init(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
usb_register_fail:
|
usb_register_fail:
|
||||||
hiddev_exit();
|
|
||||||
hiddev_init_fail:
|
|
||||||
usbhid_quirks_exit();
|
usbhid_quirks_exit();
|
||||||
usbhid_quirks_init_fail:
|
usbhid_quirks_init_fail:
|
||||||
hid_unregister_driver(&hid_usb_driver);
|
hid_unregister_driver(&hid_usb_driver);
|
||||||
@ -1493,7 +1489,6 @@ no_queue:
|
|||||||
static void __exit hid_exit(void)
|
static void __exit hid_exit(void)
|
||||||
{
|
{
|
||||||
usb_deregister(&hid_driver);
|
usb_deregister(&hid_driver);
|
||||||
hiddev_exit();
|
|
||||||
usbhid_quirks_exit();
|
usbhid_quirks_exit();
|
||||||
hid_unregister_driver(&hid_usb_driver);
|
hid_unregister_driver(&hid_usb_driver);
|
||||||
destroy_workqueue(resumption_waker);
|
destroy_workqueue(resumption_waker);
|
||||||
|
@ -63,6 +63,7 @@ static const struct hid_blacklist {
|
|||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_YOKE, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_PRO_PEDALS, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET },
|
||||||
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS, HID_QUIRK_NOGET },
|
||||||
|
@ -67,8 +67,6 @@ struct hiddev_list {
|
|||||||
struct mutex thread_lock;
|
struct mutex thread_lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct usb_driver hiddev_driver;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find a report, given the report's type and ID. The ID can be specified
|
* Find a report, given the report's type and ID. The ID can be specified
|
||||||
* indirectly by REPORT_ID_FIRST (which returns the first report of the given
|
* indirectly by REPORT_ID_FIRST (which returns the first report of the given
|
||||||
@ -926,41 +924,3 @@ void hiddev_disconnect(struct hid_device *hid)
|
|||||||
kfree(hiddev);
|
kfree(hiddev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Currently this driver is a USB driver. It's not a conventional one in
|
|
||||||
* the sense that it doesn't probe at the USB level. Instead it waits to
|
|
||||||
* be connected by HID through the hiddev_connect / hiddev_disconnect
|
|
||||||
* routines. The reason to register as a USB device is to gain part of the
|
|
||||||
* minor number space from the USB major.
|
|
||||||
*
|
|
||||||
* In theory, should the HID code be generalized to more than one physical
|
|
||||||
* medium (say, IEEE 1384), this driver will probably need to register its
|
|
||||||
* own major number, and in doing so, no longer need to register with USB.
|
|
||||||
* At that point the probe routine and hiddev_driver struct below will no
|
|
||||||
* longer be useful.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* We never attach in this manner, and rely on HID to connect us. This
|
|
||||||
* is why there is no disconnect routine defined in the usb_driver either.
|
|
||||||
*/
|
|
||||||
static int hiddev_usbd_probe(struct usb_interface *intf,
|
|
||||||
const struct usb_device_id *hiddev_info)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
static /* const */ struct usb_driver hiddev_driver = {
|
|
||||||
.name = "hiddev",
|
|
||||||
.probe = hiddev_usbd_probe,
|
|
||||||
};
|
|
||||||
|
|
||||||
int __init hiddev_init(void)
|
|
||||||
{
|
|
||||||
return usb_register(&hiddev_driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
void hiddev_exit(void)
|
|
||||||
{
|
|
||||||
usb_deregister(&hiddev_driver);
|
|
||||||
}
|
|
||||||
|
@ -226,8 +226,6 @@ void hiddev_disconnect(struct hid_device *);
|
|||||||
void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
|
void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
|
||||||
struct hid_usage *usage, __s32 value);
|
struct hid_usage *usage, __s32 value);
|
||||||
void hiddev_report_event(struct hid_device *hid, struct hid_report *report);
|
void hiddev_report_event(struct hid_device *hid, struct hid_report *report);
|
||||||
int __init hiddev_init(void);
|
|
||||||
void hiddev_exit(void);
|
|
||||||
#else
|
#else
|
||||||
static inline int hiddev_connect(struct hid_device *hid,
|
static inline int hiddev_connect(struct hid_device *hid,
|
||||||
unsigned int force)
|
unsigned int force)
|
||||||
@ -236,8 +234,6 @@ static inline void hiddev_disconnect(struct hid_device *hid) { }
|
|||||||
static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
|
static inline void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
|
||||||
struct hid_usage *usage, __s32 value) { }
|
struct hid_usage *usage, __s32 value) { }
|
||||||
static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { }
|
static inline void hiddev_report_event(struct hid_device *hid, struct hid_report *report) { }
|
||||||
static inline int hiddev_init(void) { return 0; }
|
|
||||||
static inline void hiddev_exit(void) { }
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user