Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
b0eae38c
Commit
b0eae38c
authored
Oct 25, 2011
by
Jiri Kosina
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'acrux', 'logitech', 'multitouch', 'roccat' and 'wiimote' into for-linus
parents
3ee72ca9
b55ebc27
e00ddc9b
0db3bfc7
3200a6a5
b22e00f3
Changes
20
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
2474 additions
and
129 deletions
+2474
-129
Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
+7
-0
MAINTAINERS
MAINTAINERS
+6
-0
drivers/hid/Kconfig
drivers/hid/Kconfig
+24
-5
drivers/hid/Makefile
drivers/hid/Makefile
+2
-1
drivers/hid/hid-axff.c
drivers/hid/hid-axff.c
+24
-12
drivers/hid/hid-core.c
drivers/hid/hid-core.c
+11
-0
drivers/hid/hid-ids.h
drivers/hid/hid-ids.h
+9
-0
drivers/hid/hid-input.c
drivers/hid/hid-input.c
+11
-0
drivers/hid/hid-lg.c
drivers/hid/hid-lg.c
+21
-8
drivers/hid/hid-lg.h
drivers/hid/hid-lg.h
+3
-1
drivers/hid/hid-lg4ff.c
drivers/hid/hid-lg4ff.c
+378
-25
drivers/hid/hid-lgff.c
drivers/hid/hid-lgff.c
+0
-13
drivers/hid/hid-logitech-dj.c
drivers/hid/hid-logitech-dj.c
+922
-0
drivers/hid/hid-logitech-dj.h
drivers/hid/hid-logitech-dj.h
+123
-0
drivers/hid/hid-multitouch.c
drivers/hid/hid-multitouch.c
+79
-14
drivers/hid/hid-roccat-kone.c
drivers/hid/hid-roccat-kone.c
+39
-24
drivers/hid/hid-roccat-kovaplus.c
drivers/hid/hid-roccat-kovaplus.c
+15
-2
drivers/hid/hid-roccat-pyra.c
drivers/hid/hid-roccat-pyra.c
+15
-8
drivers/hid/hid-wiimote.c
drivers/hid/hid-wiimote.c
+784
-16
include/linux/hid.h
include/linux/hid.h
+1
-0
No files found.
Documentation/ABI/testing/sysfs-driver-hid-logitech-lg4ff
0 → 100644
View file @
b0eae38c
What: /sys/module/hid_logitech/drivers/hid:logitech/<dev>/range.
Date: July 2011
KernelVersion: 3.2
Contact: Michal Malý <madcatxster@gmail.com>
Description: Display minimum, maximum and current range of the steering
wheel. Writing a value within min and max boundaries sets the
range of the wheel.
MAINTAINERS
View file @
b0eae38c
...
...
@@ -7142,6 +7142,12 @@ L: linux-scsi@vger.kernel.org
S: Maintained
F: drivers/scsi/wd7000.c
WIIMOTE HID DRIVER
M: David Herrmann <dh.herrmann@googlemail.com>
L: linux-input@vger.kernel.org
S: Maintained
F: drivers/hid/hid-wiimote*
WINBOND CIR DRIVER
M: David Härdeman <david@hardeman.nu>
S: Maintained
...
...
drivers/hid/Kconfig
View file @
b0eae38c
...
...
@@ -69,7 +69,7 @@ config HID_ACRUX
Say Y here if you want to enable support for ACRUX game controllers.
config HID_ACRUX_FF
tristate
"ACRUX force feedback support"
bool
"ACRUX force feedback support"
depends on HID_ACRUX
select INPUT_FF_MEMLESS
---help---
...
...
@@ -245,6 +245,15 @@ config HID_LOGITECH
---help---
Support for Logitech devices that are not fully compliant with HID standard.
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
devices to the same receiver.
config LOGITECH_FF
bool "Logitech force feedback support"
depends on HID_LOGITECH
...
...
@@ -278,13 +287,21 @@ config LOGIG940_FF
Say Y here if you want to enable force feedback support for Logitech
Flight System G940 devices.
config LOGIW
II
_FF
bool "Logitech
Speed Force Wireless
force feedback support"
config LOGIW
HEELS
_FF
bool "Logitech
wheels configuration and
force feedback support"
depends on HID_LOGITECH
select INPUT_FF_MEMLESS
default LOGITECH_FF
help
Say Y here if you want to enable force feedback support for Logitech
Speed Force Wireless (Wii) devices.
Say Y here if you want to enable force feedback and range setting
support for following Logitech wheels:
- Logitech Driving Force
- Logitech Driving Force Pro
- Logitech Driving Force GT
- Logitech G25
- Logitech G27
- Logitech MOMO/MOMO 2
- Logitech Formula Force EX
config HID_MAGICMOUSE
tristate "Apple MagicMouse multi-touch support"
...
...
@@ -328,6 +345,7 @@ config HID_MULTITOUCH
- Hanvon dual touch panels
- Ilitek dual touch panels
- IrTouch Infrared USB panels
- LG Display panels (Dell ST2220Tc)
- Lumio CrystalTouch panels
- MosArt dual-touch panels
- PenMount dual touch panels
...
...
@@ -590,6 +608,7 @@ config HID_WIIMOTE
tristate "Nintendo Wii Remote support"
depends on BT_HIDP
depends on LEDS_CLASS
select POWER_SUPPLY
---help---
Support for the Nintendo Wii Remote bluetooth device.
...
...
drivers/hid/Makefile
View file @
b0eae38c
...
...
@@ -21,7 +21,7 @@ endif
ifdef
CONFIG_LOGIG940_FF
hid-logitech-y
+=
hid-lg3ff.o
endif
ifdef
CONFIG_LOGIW
II
_FF
ifdef
CONFIG_LOGIW
HEELS
_FF
hid-logitech-y
+=
hid-lg4ff.o
endif
...
...
@@ -43,6 +43,7 @@ obj-$(CONFIG_HID_KEYTOUCH) += hid-keytouch.o
obj-$(CONFIG_HID_KYE)
+=
hid-kye.o
obj-$(CONFIG_HID_LCPOWER)
+=
hid-lcpower.o
obj-$(CONFIG_HID_LOGITECH)
+=
hid-logitech.o
obj-$(CONFIG_HID_LOGITECH_DJ)
+=
hid-logitech-dj.o
obj-$(CONFIG_HID_MAGICMOUSE)
+=
hid-magicmouse.o
obj-$(CONFIG_HID_MICROSOFT)
+=
hid-microsoft.o
obj-$(CONFIG_HID_MONTEREY)
+=
hid-monterey.o
...
...
drivers/hid/hid-axff.c
View file @
b0eae38c
...
...
@@ -6,7 +6,7 @@
* Xbox 360 controller.
*
* 1a34:0802 "ACRUX USB GAMEPAD 8116"
* - tested with a EXEQ EQ-PCU-02090 game controller.
* - tested with a
n
EXEQ EQ-PCU-02090 game controller.
*
* Copyright (c) 2010 Sergei Kolzun <x0r@dv-life.ru>
*/
...
...
@@ -45,7 +45,10 @@ static int axff_play(struct input_dev *dev, void *data, struct ff_effect *effect
{
struct
hid_device
*
hid
=
input_get_drvdata
(
dev
);
struct
axff_device
*
axff
=
data
;
struct
hid_report
*
report
=
axff
->
report
;
int
field_count
=
0
;
int
left
,
right
;
int
i
,
j
;
left
=
effect
->
u
.
rumble
.
strong_magnitude
;
right
=
effect
->
u
.
rumble
.
weak_magnitude
;
...
...
@@ -55,10 +58,14 @@ static int axff_play(struct input_dev *dev, void *data, struct ff_effect *effect
left
=
left
*
0xff
/
0xffff
;
right
=
right
*
0xff
/
0xffff
;
axff
->
report
->
field
[
0
]
->
value
[
0
]
=
left
;
axff
->
report
->
field
[
1
]
->
value
[
0
]
=
right
;
axff
->
report
->
field
[
2
]
->
value
[
0
]
=
left
;
axff
->
report
->
field
[
3
]
->
value
[
0
]
=
right
;
for
(
i
=
0
;
i
<
report
->
maxfield
;
i
++
)
{
for
(
j
=
0
;
j
<
report
->
field
[
i
]
->
report_count
;
j
++
)
{
report
->
field
[
i
]
->
value
[
j
]
=
field_count
%
2
?
right
:
left
;
field_count
++
;
}
}
dbg_hid
(
"running with 0x%02x 0x%02x"
,
left
,
right
);
usbhid_submit_report
(
hid
,
axff
->
report
,
USB_DIR_OUT
);
...
...
@@ -72,6 +79,8 @@ static int axff_init(struct hid_device *hid)
struct
hid_input
*
hidinput
=
list_first_entry
(
&
hid
->
inputs
,
struct
hid_input
,
list
);
struct
list_head
*
report_list
=&
hid
->
report_enum
[
HID_OUTPUT_REPORT
].
report_list
;
struct
input_dev
*
dev
=
hidinput
->
input
;
int
field_count
=
0
;
int
i
,
j
;
int
error
;
if
(
list_empty
(
report_list
))
{
...
...
@@ -80,9 +89,16 @@ static int axff_init(struct hid_device *hid)
}
report
=
list_first_entry
(
report_list
,
struct
hid_report
,
list
);
for
(
i
=
0
;
i
<
report
->
maxfield
;
i
++
)
{
for
(
j
=
0
;
j
<
report
->
field
[
i
]
->
report_count
;
j
++
)
{
report
->
field
[
i
]
->
value
[
j
]
=
0x00
;
field_count
++
;
}
}
if
(
report
->
maxfield
<
4
)
{
hid_err
(
hid
,
"no fields in the report: %d
\n
"
,
report
->
maxfield
);
if
(
field_count
<
4
)
{
hid_err
(
hid
,
"not enough fields in the report: %d
\n
"
,
field_count
);
return
-
ENODEV
;
}
...
...
@@ -97,13 +113,9 @@ static int axff_init(struct hid_device *hid)
goto
err_free_mem
;
axff
->
report
=
report
;
axff
->
report
->
field
[
0
]
->
value
[
0
]
=
0x00
;
axff
->
report
->
field
[
1
]
->
value
[
0
]
=
0x00
;
axff
->
report
->
field
[
2
]
->
value
[
0
]
=
0x00
;
axff
->
report
->
field
[
3
]
->
value
[
0
]
=
0x00
;
usbhid_submit_report
(
hid
,
axff
->
report
,
USB_DIR_OUT
);
hid_info
(
hid
,
"Force Feedback for ACRUX game controllers by Sergei Kolzun<x0r@dv-life.ru>
\n
"
);
hid_info
(
hid
,
"Force Feedback for ACRUX game controllers by Sergei Kolzun
<x0r@dv-life.ru>
\n
"
);
return
0
;
...
...
drivers/hid/hid-core.c
View file @
b0eae38c
...
...
@@ -1212,6 +1212,12 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
if
((
connect_mask
&
HID_CONNECT_HIDINPUT
)
&&
!
hidinput_connect
(
hdev
,
connect_mask
&
HID_CONNECT_HIDINPUT_FORCE
))
hdev
->
claimed
|=
HID_CLAIMED_INPUT
;
if
(
hdev
->
quirks
&
HID_QUIRK_MULTITOUCH
)
{
/* this device should be handled by hid-multitouch, skip it */
hdev
->
quirks
&=
~
HID_QUIRK_MULTITOUCH
;
return
-
ENODEV
;
}
if
((
connect_mask
&
HID_CONNECT_HIDDEV
)
&&
hdev
->
hiddev_connect
&&
!
hdev
->
hiddev_connect
(
hdev
,
connect_mask
&
HID_CONNECT_HIDDEV_FORCE
))
...
...
@@ -1391,6 +1397,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GYRATION
,
USB_DEVICE_ID_GYRATION_REMOTE_2
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GYRATION
,
USB_DEVICE_ID_GYRATION_REMOTE_3
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_HANVON
,
USB_DEVICE_ID_HANVON_MULTITOUCH
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_IDEACOM
,
USB_DEVICE_ID_IDEACOM_IDC6650
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_HOLTEK
,
USB_DEVICE_ID_HOLTEK_ON_LINE_GRIP
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_ILITEK
,
USB_DEVICE_ID_ILITEK_MULTITOUCH
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_IRTOUCHSYSTEMS
,
USB_DEVICE_ID_IRTOUCH_INFRARED_USB
)
},
...
...
@@ -1399,6 +1406,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_KYE
,
USB_DEVICE_ID_KYE_ERGO_525V
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LABTEC
,
USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LCPOWER
,
USB_DEVICE_ID_LCPOWER_LC1000
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LG
,
USB_DEVICE_ID_LG_MULTITOUCH
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_MX3000_RECEIVER
)
},
{
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
)
},
...
...
@@ -1420,8 +1428,11 @@ static const struct hid_device_id hid_have_special_driver[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_MOMO_WHEEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_DFP_WHEEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_DFGT_WHEEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_G25_WHEEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_G27_WHEEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_WII_WHEEL
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_RUMBLEPAD2
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_SPACETRAVELLER
)
},
...
...
drivers/hid/hid-ids.h
View file @
b0eae38c
...
...
@@ -351,6 +351,9 @@
#define USB_DEVICE_ID_UGCI_FLYING 0x0020
#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030
#define USB_VENDOR_ID_IDEACOM 0x1cb6
#define USB_DEVICE_ID_IDEACOM_IDC6650 0x6650
#define USB_VENDOR_ID_ILITEK 0x222a
#define USB_DEVICE_ID_ILITEK_MULTITOUCH 0x0001
...
...
@@ -423,6 +426,9 @@
#define USB_DEVICE_ID_LD_HYBRID 0x2090
#define USB_DEVICE_ID_LD_HEATCONTROL 0x20A0
#define USB_VENDOR_ID_LG 0x1fd2
#define USB_DEVICE_ID_LG_MULTITOUCH 0x0064
#define USB_VENDOR_ID_LOGITECH 0x046d
#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
#define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110
...
...
@@ -440,6 +446,7 @@
#define USB_DEVICE_ID_LOGITECH_MOMO_WHEEL 0xc295
#define USB_DEVICE_ID_LOGITECH_DFP_WHEEL 0xc298
#define USB_DEVICE_ID_LOGITECH_G25_WHEEL 0xc299
#define USB_DEVICE_ID_LOGITECH_DFGT_WHEEL 0xc29a
#define USB_DEVICE_ID_LOGITECH_G27_WHEEL 0xc29b
#define USB_DEVICE_ID_LOGITECH_WII_WHEEL 0xc29c
#define USB_DEVICE_ID_LOGITECH_ELITE_KBD 0xc30a
...
...
@@ -447,6 +454,8 @@
#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512
#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
#define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER 0xc52b
#define USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2 0xc532
#define USB_DEVICE_ID_SPACETRAVELLER 0xc623
#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704
...
...
drivers/hid/hid-input.c
View file @
b0eae38c
...
...
@@ -474,6 +474,10 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
map_key_clear
(
BTN_STYLUS2
);
break
;
case
0x51
:
/* ContactID */
device
->
quirks
|=
HID_QUIRK_MULTITOUCH
;
goto
unknown
;
default:
goto
unknown
;
}
break
;
...
...
@@ -978,6 +982,13 @@ int hidinput_connect(struct hid_device *hid, unsigned int force)
}
}
if
(
hid
->
quirks
&
HID_QUIRK_MULTITOUCH
)
{
/* generic hid does not know how to handle multitouch devices */
if
(
hidinput
)
goto
out_cleanup
;
goto
out_unwind
;
}
if
(
hidinput
&&
input_register_device
(
hidinput
->
input
))
goto
out_cleanup
;
...
...
drivers/hid/hid-lg.c
View file @
b0eae38c
...
...
@@ -363,7 +363,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
goto
err_free
;
}
if
(
quirks
&
(
LG_FF
|
LG_FF2
|
LG_FF3
))
if
(
quirks
&
(
LG_FF
|
LG_FF2
|
LG_FF3
|
LG_FF4
))
connect_mask
&=
~
HID_CONNECT_FF
;
ret
=
hid_hw_start
(
hdev
,
connect_mask
);
...
...
@@ -372,7 +372,8 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
goto
err_free
;
}
if
(
quirks
&
LG_FF4
)
{
/* Setup wireless link with 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
);
...
...
@@ -405,6 +406,15 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
return
ret
;
}
static
void
lg_remove
(
struct
hid_device
*
hdev
)
{
unsigned
long
quirks
=
(
unsigned
long
)
hid_get_drvdata
(
hdev
);
if
(
quirks
&
LG_FF4
)
lg4ff_deinit
(
hdev
);
hid_hw_stop
(
hdev
);
}
static
const
struct
hid_device_id
lg_devices
[]
=
{
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_MX3000_RECEIVER
),
.
driver_data
=
LG_RDESC
|
LG_WIRELESS
},
...
...
@@ -431,7 +441,7 @@ static const struct hid_device_id lg_devices[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_EXTREME_3D
),
.
driver_data
=
LG_NOGET
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_WHEEL
),
.
driver_data
=
LG_NOGET
|
LG_FF
},
.
driver_data
=
LG_NOGET
|
LG_FF
4
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_RUMBLEPAD_CORD
),
.
driver_data
=
LG_FF2
},
...
...
@@ -444,15 +454,17 @@ static const struct hid_device_id lg_devices[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_FORCE3D_PRO
),
.
driver_data
=
LG_FF
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_MOMO_WHEEL
),
.
driver_data
=
LG_FF
},
.
driver_data
=
LG_FF
4
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_MOMO_WHEEL2
),
.
driver_data
=
LG_FF
},
.
driver_data
=
LG_FF
4
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_G25_WHEEL
),
.
driver_data
=
LG_FF
},
.
driver_data
=
LG_FF4
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_DFGT_WHEEL
),
.
driver_data
=
LG_FF4
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_G27_WHEEL
),
.
driver_data
=
LG_FF
},
.
driver_data
=
LG_FF
4
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_LOGITECH
,
USB_DEVICE_ID_LOGITECH_DFP_WHEEL
),
.
driver_data
=
LG_NOGET
|
LG_FF
},
.
driver_data
=
LG_NOGET
|
LG_FF
4
},
{
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
),
...
...
@@ -478,6 +490,7 @@ static struct hid_driver lg_driver = {
.
input_mapped
=
lg_input_mapped
,
.
event
=
lg_event
,
.
probe
=
lg_probe
,
.
remove
=
lg_remove
,
};
static
int
__init
lg_init
(
void
)
...
...
drivers/hid/hid-lg.h
View file @
b0eae38c
...
...
@@ -19,10 +19,12 @@ int lg3ff_init(struct hid_device *hdev);
static
inline
int
lg3ff_init
(
struct
hid_device
*
hdev
)
{
return
-
1
;
}
#endif
#ifdef CONFIG_LOGIW
II
_FF
#ifdef CONFIG_LOGIW
HEELS
_FF
int
lg4ff_init
(
struct
hid_device
*
hdev
);
int
lg4ff_deinit
(
struct
hid_device
*
hdev
);
#else
static
inline
int
lg4ff_init
(
struct
hid_device
*
hdev
)
{
return
-
1
;
}
static
inline
int
lg4ff_deinit
(
struct
hid_device
*
hdev
)
{
return
-
1
;
}
#endif
#endif
drivers/hid/hid-lg4ff.c
View file @
b0eae38c
This diff is collapsed.
Click to expand it.
drivers/hid/hid-lgff.c
View file @
b0eae38c
...
...
@@ -58,12 +58,6 @@ static const signed short ff_joystick_ac[] = {
-
1
};
static
const
signed
short
ff_wheel
[]
=
{
FF_CONSTANT
,
FF_AUTOCENTER
,
-
1
};
static
const
struct
dev_type
devices
[]
=
{
{
0x046d
,
0xc211
,
ff_rumble
},
{
0x046d
,
0xc219
,
ff_rumble
},
...
...
@@ -71,14 +65,7 @@ static const struct dev_type devices[] = {
{
0x046d
,
0xc286
,
ff_joystick_ac
},
{
0x046d
,
0xc287
,
ff_joystick_ac
},
{
0x046d
,
0xc293
,
ff_joystick
},
{
0x046d
,
0xc294
,
ff_wheel
},
{
0x046d
,
0xc298
,
ff_wheel
},
{
0x046d
,
0xc299
,
ff_wheel
},
{
0x046d
,
0xc29b
,
ff_wheel
},
{
0x046d
,
0xc295
,
ff_joystick
},
{
0x046d
,
0xc298
,
ff_wheel
},
{
0x046d
,
0xc299
,
ff_wheel
},
{
0x046d
,
0xca03
,
ff_wheel
},
};
static
int
hid_lgff_play
(
struct
input_dev
*
dev
,
void
*
data
,
struct
ff_effect
*
effect
)
...
...
drivers/hid/hid-logitech-dj.c
0 → 100644
View file @
b0eae38c
This diff is collapsed.
Click to expand it.
drivers/hid/hid-logitech-dj.h
0 → 100644
View file @
b0eae38c
#ifndef __HID_LOGITECH_DJ_H
#define __HID_LOGITECH_DJ_H
/*
* HID driver for Logitech Unifying receivers
*
* Copyright (c) 2011 Logitech
*/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/kfifo.h>
#define DJ_MAX_PAIRED_DEVICES 6
#define DJ_MAX_NUMBER_NOTIFICATIONS 8
#define DJ_DEVICE_INDEX_MIN 1
#define DJ_DEVICE_INDEX_MAX 6
#define DJREPORT_SHORT_LENGTH 15
#define DJREPORT_LONG_LENGTH 32
#define REPORT_ID_DJ_SHORT 0x20
#define REPORT_ID_DJ_LONG 0x21
#define REPORT_TYPE_RFREPORT_FIRST 0x01
#define REPORT_TYPE_RFREPORT_LAST 0x1F
/* Command Switch to DJ mode */
#define REPORT_TYPE_CMD_SWITCH 0x80
#define CMD_SWITCH_PARAM_DEVBITFIELD 0x00
#define CMD_SWITCH_PARAM_TIMEOUT_SECONDS 0x01
#define TIMEOUT_NO_KEEPALIVE 0x00
/* Command to Get the list of Paired devices */
#define REPORT_TYPE_CMD_GET_PAIRED_DEVICES 0x81
/* Device Paired Notification */
#define REPORT_TYPE_NOTIF_DEVICE_PAIRED 0x41
#define SPFUNCTION_MORE_NOTIF_EXPECTED 0x01
#define SPFUNCTION_DEVICE_LIST_EMPTY 0x02
#define DEVICE_PAIRED_PARAM_SPFUNCTION 0x00
#define DEVICE_PAIRED_PARAM_EQUAD_ID_LSB 0x01
#define DEVICE_PAIRED_PARAM_EQUAD_ID_MSB 0x02
#define DEVICE_PAIRED_RF_REPORT_TYPE 0x03
/* Device Un-Paired Notification */
#define REPORT_TYPE_NOTIF_DEVICE_UNPAIRED 0x40
/* Connection Status Notification */
#define REPORT_TYPE_NOTIF_CONNECTION_STATUS 0x42
#define CONNECTION_STATUS_PARAM_STATUS 0x00
#define STATUS_LINKLOSS 0x01
/* Error Notification */
#define REPORT_TYPE_NOTIF_ERROR 0x7F
#define NOTIF_ERROR_PARAM_ETYPE 0x00
#define ETYPE_KEEPALIVE_TIMEOUT 0x01
/* supported DJ HID && RF report types */
#define REPORT_TYPE_KEYBOARD 0x01
#define REPORT_TYPE_MOUSE 0x02
#define REPORT_TYPE_CONSUMER_CONTROL 0x03
#define REPORT_TYPE_SYSTEM_CONTROL 0x04
#define REPORT_TYPE_MEDIA_CENTER 0x08
#define REPORT_TYPE_LEDS 0x0E
/* RF Report types bitfield */
#define STD_KEYBOARD 0x00000002
#define STD_MOUSE 0x00000004
#define MULTIMEDIA 0x00000008
#define POWER_KEYS 0x00000010
#define MEDIA_CENTER 0x00000100
#define KBD_LEDS 0x00004000
struct
dj_report
{
u8
report_id
;
u8
device_index
;
u8
report_type
;
u8
report_params
[
DJREPORT_SHORT_LENGTH
-
3
];
};
struct
dj_receiver_dev
{
struct
hid_device
*
hdev
;
struct
dj_device
*
paired_dj_devices
[
DJ_MAX_PAIRED_DEVICES
+
DJ_DEVICE_INDEX_MIN
];
struct
work_struct
work
;
struct
kfifo
notif_fifo
;
spinlock_t
lock
;
};
struct
dj_device
{
struct
hid_device
*
hdev
;
struct
dj_receiver_dev
*
dj_receiver_dev
;
u32
reports_supported
;
u8
device_index
;
};
/**
* is_dj_device - know if the given dj_device is not the receiver.
* @dj_dev: the dj device to test
*
* This macro tests if a struct dj_device pointer is a device created
* by the bus enumarator.
*/
#define is_dj_device(dj_dev) \
(&(dj_dev)->dj_receiver_dev->hdev->dev == (dj_dev)->hdev->dev.parent)
#endif
drivers/hid/hid-multitouch.c
View file @
b0eae38c
...
...
@@ -47,10 +47,11 @@ MODULE_LICENSE("GPL");
#define MT_QUIRK_SLOT_IS_CONTACTID (1 << 1)
#define MT_QUIRK_CYPRESS (1 << 2)
#define MT_QUIRK_SLOT_IS_CONTACTNUMBER (1 << 3)
#define MT_QUIRK_VALID_IS_INRANGE (1 << 4)
#define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 5)
#define MT_QUIRK_EGALAX_XYZ_FIXUP (1 << 6)
#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 7)
#define MT_QUIRK_ALWAYS_VALID (1 << 4)
#define MT_QUIRK_VALID_IS_INRANGE (1 << 5)
#define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 6)
#define MT_QUIRK_EGALAX_XYZ_FIXUP (1 << 7)
#define MT_QUIRK_SLOT_IS_CONTACTID_MINUS_ONE (1 << 8)
struct
mt_slot
{
__s32
x
,
y
,
p
,
w
,
h
;
...
...
@@ -86,11 +87,12 @@ struct mt_class {
/* classes of device behavior */
#define MT_CLS_DEFAULT 0x0001
#define MT_CLS_CONFIDENCE 0x0002
#define MT_CLS_CONFIDENCE_MINUS_ONE 0x0003
#define MT_CLS_DUAL_INRANGE_CONTACTID 0x0004
#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 0x0005
#define MT_CLS_DUAL_NSMU_CONTACTID 0x0006
#define MT_CLS_SERIAL 0x0002
#define MT_CLS_CONFIDENCE 0x0003
#define MT_CLS_CONFIDENCE_MINUS_ONE 0x0004
#define MT_CLS_DUAL_INRANGE_CONTACTID 0x0005
#define MT_CLS_DUAL_INRANGE_CONTACTNUMBER 0x0006
#define MT_CLS_DUAL_NSMU_CONTACTID 0x0007
/* vendor specific classes */
#define MT_CLS_3M 0x0101
...
...
@@ -134,6 +136,8 @@ static int find_slot_from_contactid(struct mt_device *td)
struct
mt_class
mt_classes
[]
=
{
{
.
name
=
MT_CLS_DEFAULT
,
.
quirks
=
MT_QUIRK_NOT_SEEN_MEANS_UP
},
{
.
name
=
MT_CLS_SERIAL
,
.
quirks
=
MT_QUIRK_ALWAYS_VALID
},
{
.
name
=
MT_CLS_CONFIDENCE
,
.
quirks
=
MT_QUIRK_VALID_IS_CONFIDENCE
},
{
.
name
=
MT_CLS_CONFIDENCE_MINUS_ONE
,
...
...
@@ -213,6 +217,16 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
struct
mt_class
*
cls
=
td
->
mtclass
;
__s32
quirks
=
cls
->
quirks
;
/* Only map fields from TouchScreen or TouchPad collections.
* We need to ignore fields that belong to other collections
* such as Mouse that might have the same GenericDesktop usages. */
if
(
field
->
application
==
HID_DG_TOUCHSCREEN
)
set_bit
(
INPUT_PROP_DIRECT
,
hi
->
input
->
propbit
);
else
if
(
field
->
application
==
HID_DG_TOUCHPAD
)
set_bit
(
INPUT_PROP_POINTER
,
hi
->
input
->
propbit
);
else
return
0
;
switch
(
usage
->
hid
&
HID_USAGE_PAGE
)
{
case
HID_UP_GENDESK
:
...
...
@@ -277,6 +291,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
td
->
last_slot_field
=
usage
->
hid
;
td
->
last_field_index
=
field
->
index
;
td
->
last_mt_collection
=
usage
->
collection_index
;
hdev
->
quirks
&=
~
HID_QUIRK_MULTITOUCH
;
return
1
;
case
HID_DG_WIDTH
:
hid_map_usage
(
hi
,
usage
,
bit
,
max
,
...
...
@@ -435,7 +450,9 @@ static int mt_event(struct hid_device *hid, struct hid_field *field,
if
(
hid
->
claimed
&
HID_CLAIMED_INPUT
&&
td
->
slots
)
{
switch
(
usage
->
hid
)
{
case
HID_DG_INRANGE
:
if
(
quirks
&
MT_QUIRK_VALID_IS_INRANGE
)
if
(
quirks
&
MT_QUIRK_ALWAYS_VALID
)
td
->
curvalid
=
true
;
else
if
(
quirks
&
MT_QUIRK_VALID_IS_INRANGE
)
td
->
curvalid
=
value
;
break
;
case
HID_DG_TIPSWITCH
:
...
...
@@ -513,12 +530,44 @@ static void mt_set_input_mode(struct hid_device *hdev)
}
}
/* a list of devices for which there is a specialized multitouch driver */
static
const
struct
hid_device_id
mt_have_special_driver
[]
=
{
{
HID_USB_DEVICE
(
USB_VENDOR_ID_NTRIG
,
0x0001
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_NTRIG
,
0x0006
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_QUANTA
,
USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_QUANTA
,
USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH
)
},
{
}
};
static
bool
mt_match_one_id
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
return
id
->
bus
==
hdev
->
bus
&&
(
id
->
vendor
==
HID_ANY_ID
||
id
->
vendor
==
hdev
->
vendor
)
&&
(
id
->
product
==
HID_ANY_ID
||
id
->
product
==
hdev
->
product
);
}
static
const
struct
hid_device_id
*
mt_match_id
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
for
(;
id
->
bus
;
id
++
)
if
(
mt_match_one_id
(
hdev
,
id
))
return
id
;
return
NULL
;
}
static
int
mt_probe
(
struct
hid_device
*
hdev
,
const
struct
hid_device_id
*
id
)
{
int
ret
,
i
;
struct
mt_device
*
td
;
struct
mt_class
*
mtclass
=
mt_classes
;
/* MT_CLS_DEFAULT */
if
(
mt_match_id
(
hdev
,
mt_have_special_driver
))
return
-
ENODEV
;
for
(
i
=
0
;
mt_classes
[
i
].
name
;
i
++
)
{
if
(
id
->
driver_data
==
mt_classes
[
i
].
name
)
{
mtclass
=
&
(
mt_classes
[
i
]);
...
...
@@ -526,10 +575,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
}
}
/* This allows the driver to correctly support devices
* that emit events over several HID messages.
*/
hdev
->
quirks
|=
HID_QUIRK_NO_INPUT_SYNC
;
td
=
kzalloc
(
sizeof
(
struct
mt_device
),
GFP_KERNEL
);
if
(
!
td
)
{
...
...
@@ -545,10 +590,16 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
if
(
ret
!=
0
)
goto
fail
;
hdev
->
quirks
|=
HID_QUIRK_MULTITOUCH
;
ret
=
hid_hw_start
(
hdev
,
HID_CONNECT_DEFAULT
);
if
(
ret
)
goto
fail
;
/* This allows the driver to correctly support devices
* that emit events over several HID messages.
*/
hdev
->
quirks
|=
HID_QUIRK_NO_INPUT_SYNC
;
td
->
slots
=
kzalloc
(
td
->
maxcontacts
*
sizeof
(
struct
mt_slot
),
GFP_KERNEL
);
if
(
!
td
->
slots
)
{
...
...
@@ -662,6 +713,11 @@ static const struct hid_device_id mt_devices[] = {
HID_USB_DEVICE
(
USB_VENDOR_ID_GOODTOUCH
,
USB_DEVICE_ID_GOODTOUCH_000f
)
},
/* Ideacom panel */
{
.
driver_data
=
MT_CLS_SERIAL
,
HID_USB_DEVICE
(
USB_VENDOR_ID_IDEACOM
,
USB_DEVICE_ID_IDEACOM_IDC6650
)
},
/* Ilitek dual touch panel */
{
.
driver_data
=
MT_CLS_DEFAULT
,
HID_USB_DEVICE
(
USB_VENDOR_ID_ILITEK
,
...
...
@@ -672,6 +728,11 @@ static const struct hid_device_id mt_devices[] = {
HID_USB_DEVICE
(
USB_VENDOR_ID_IRTOUCHSYSTEMS
,
USB_DEVICE_ID_IRTOUCH_INFRARED_USB
)
},
/* LG Display panels */
{
.
driver_data
=
MT_CLS_DEFAULT
,
HID_USB_DEVICE
(
USB_VENDOR_ID_LG
,
USB_DEVICE_ID_LG_MULTITOUCH
)
},
/* Lumio panels */
{
.
driver_data
=
MT_CLS_CONFIDENCE_MINUS_ONE
,
HID_USB_DEVICE
(
USB_VENDOR_ID_LUMIO
,
...
...
@@ -732,6 +793,10 @@ static const struct hid_device_id mt_devices[] = {
HID_USB_DEVICE
(
USB_VENDOR_ID_XAT
,
USB_DEVICE_ID_XAT_CSR
)
},
/* Rest of the world */
{
.
driver_data
=
MT_CLS_DEFAULT
,
HID_USB_DEVICE
(
HID_ANY_ID
,
HID_ANY_ID
)
},
{
}
};
MODULE_DEVICE_TABLE
(
hid
,
mt_devices
);
...
...
drivers/hid/hid-roccat-kone.c
View file @
b0eae38c
...
...
@@ -37,6 +37,21 @@
static
uint
profile_numbers
[
5
]
=
{
0
,
1
,
2
,
3
,
4
};
static
void
kone_profile_activated
(
struct
kone_device
*
kone
,
uint
new_profile
)
{
kone
->
actual_profile
=
new_profile
;
kone
->
actual_dpi
=
kone
->
profiles
[
new_profile
-
1
].
startup_dpi
;
}
static
void
kone_profile_report
(
struct
kone_device
*
kone
,
uint
new_profile
)
{
struct
kone_roccat_report
roccat_report
;
roccat_report
.
event
=
kone_mouse_event_switch_profile
;
roccat_report
.
value
=
new_profile
;
roccat_report
.
key
=
0
;
roccat_report_event
(
kone
->
chrdev_minor
,
(
uint8_t
*
)
&
roccat_report
);
}
static
int
kone_receive
(
struct
usb_device
*
usb_dev
,
uint
usb_command
,
void
*
data
,
uint
size
)
{
...
...
@@ -283,7 +298,7 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,
container_of
(
kobj
,
struct
device
,
kobj
)
->
parent
->
parent
;
struct
kone_device
*
kone
=
hid_get_drvdata
(
dev_get_drvdata
(
dev
));
struct
usb_device
*
usb_dev
=
interface_to_usbdev
(
to_usb_interface
(
dev
));
int
retval
=
0
,
difference
;
int
retval
=
0
,
difference
,
old_profile
;
/* I need to get my data in one piece */
if
(
off
!=
0
||
count
!=
sizeof
(
struct
kone_settings
))
...
...
@@ -294,21 +309,20 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,
if
(
difference
)
{
retval
=
kone_set_settings
(
usb_dev
,
(
struct
kone_settings
const
*
)
buf
);
if
(
!
retval
)
memcpy
(
&
kone
->
settings
,
buf
,
sizeof
(
struct
kone_settings
));
}
if
(
retval
)
{
mutex_unlock
(
&
kone
->
kone_lock
);
if
(
retval
)
return
retval
;
}
/*
* If we get here, treat settings as okay and update actual values
* according to startup_profile
*/
kone
->
actual_profile
=
kone
->
settings
.
startup_profile
;
kone
->
actual_dpi
=
kone
->
profiles
[
kone
->
actual_profile
-
1
].
startup_dpi
;
old_profile
=
kone
->
settings
.
startup_profile
;
memcpy
(
&
kone
->
settings
,
buf
,
sizeof
(
struct
kone_settings
));
kone_profile_activated
(
kone
,
kone
->
settings
.
startup_profile
);
if
(
kone
->
settings
.
startup_profile
!=
old_profile
)
kone_profile_report
(
kone
,
kone
->
settings
.
startup_profile
);
}
mutex_unlock
(
&
kone
->
kone_lock
);
return
sizeof
(
struct
kone_settings
);
}
...
...
@@ -501,6 +515,8 @@ static ssize_t kone_sysfs_set_tcu(struct device *dev,
goto
exit_no_settings
;
goto
exit_unlock
;
}
/* calibration resets profile */
kone_profile_activated
(
kone
,
kone
->
settings
.
startup_profile
);
}
retval
=
size
;
...
...
@@ -544,16 +560,16 @@ static ssize_t kone_sysfs_set_startup_profile(struct device *dev,
kone_set_settings_checksum
(
&
kone
->
settings
);
retval
=
kone_set_settings
(
usb_dev
,
&
kone
->
settings
);
if
(
retval
)
{
mutex_unlock
(
&
kone
->
kone_lock
);
if
(
retval
)
return
retval
;
}
/* changing the startup profile immediately activates this profile */
kone
->
actual_profile
=
new_startup_profile
;
kone
->
actual_dpi
=
kone
->
profiles
[
kone
->
actual_profile
-
1
].
startup_dpi
;
kone
_profile_activated
(
kone
,
new_startup_profile
)
;
kone
_profile_report
(
kone
,
new_startup_profile
)
;
mutex_unlock
(
&
kone
->
kone_lock
);
return
size
;
}
...
...
@@ -665,8 +681,7 @@ static int kone_init_kone_device_struct(struct usb_device *usb_dev,
if
(
retval
)
return
retval
;
kone
->
actual_profile
=
kone
->
settings
.
startup_profile
;
kone
->
actual_dpi
=
kone
->
profiles
[
kone
->
actual_profile
].
startup_dpi
;
kone_profile_activated
(
kone
,
kone
->
settings
.
startup_profile
);
return
0
;
}
...
...
@@ -776,10 +791,10 @@ static void kone_keep_values_up_to_date(struct kone_device *kone,
{
switch
(
event
->
event
)
{
case
kone_mouse_event_switch_profile
:
kone
->
actual_dpi
=
kone
->
profiles
[
event
->
value
-
1
].
startup_dpi
;
case
kone_mouse_event_osd_profile
:
kone
->
actual_profile
=
event
->
value
;
kone
->
actual_dpi
=
kone
->
profiles
[
kone
->
actual_profile
-
1
].
startup_dpi
;
break
;
case
kone_mouse_event_switch_dpi
:
case
kone_mouse_event_osd_dpi
:
...
...
drivers/hid/hid-roccat-kovaplus.c
View file @
b0eae38c
...
...
@@ -323,6 +323,7 @@ static ssize_t kovaplus_sysfs_set_actual_profile(struct device *dev,
struct
usb_device
*
usb_dev
;
unsigned
long
profile
;
int
retval
;
struct
kovaplus_roccat_report
roccat_report
;
dev
=
dev
->
parent
->
parent
;
kovaplus
=
hid_get_drvdata
(
dev_get_drvdata
(
dev
));
...
...
@@ -337,10 +338,22 @@ static ssize_t kovaplus_sysfs_set_actual_profile(struct device *dev,
mutex_lock
(
&
kovaplus
->
kovaplus_lock
);
retval
=
kovaplus_set_actual_profile
(
usb_dev
,
profile
);
kovaplus_profile_activated
(
kovaplus
,
profile
);
if
(
retval
)
{
mutex_unlock
(
&
kovaplus
->
kovaplus_lock
);
if
(
retval
)
return
retval
;
}
kovaplus_profile_activated
(
kovaplus
,
profile
);
roccat_report
.
type
=
KOVAPLUS_MOUSE_REPORT_BUTTON_TYPE_PROFILE_1
;
roccat_report
.
profile
=
profile
+
1
;
roccat_report
.
button
=
0
;
roccat_report
.
data1
=
profile
+
1
;
roccat_report
.
data2
=
0
;
roccat_report_event
(
kovaplus
->
chrdev_minor
,
(
uint8_t
const
*
)
&
roccat_report
);
mutex_unlock
(
&
kovaplus
->
kovaplus_lock
);
return
size
;
}
...
...
drivers/hid/hid-roccat-pyra.c
View file @
b0eae38c
...
...
@@ -298,6 +298,7 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp,
struct
usb_device
*
usb_dev
=
interface_to_usbdev
(
to_usb_interface
(
dev
));
int
retval
=
0
;
int
difference
;
struct
pyra_roccat_report
roccat_report
;
if
(
off
!=
0
||
count
!=
sizeof
(
struct
pyra_settings
))
return
-
EINVAL
;
...
...
@@ -307,17 +308,23 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp,
if
(
difference
)
{
retval
=
pyra_set_settings
(
usb_dev
,
(
struct
pyra_settings
const
*
)
buf
);
if
(
!
retval
)
memcpy
(
&
pyra
->
settings
,
buf
,
sizeof
(
struct
pyra_settings
));
}
if
(
retval
)
{
mutex_unlock
(
&
pyra
->
pyra_lock
);
if
(
retval
)
return
retval
;
}
memcpy
(
&
pyra
->
settings
,
buf
,
sizeof
(
struct
pyra_settings
));
profile_activated
(
pyra
,
pyra
->
settings
.
startup_profile
);
roccat_report
.
type
=
PYRA_MOUSE_EVENT_BUTTON_TYPE_PROFILE_2
;
roccat_report
.
value
=
pyra
->
settings
.
startup_profile
+
1
;
roccat_report
.
key
=
0
;
roccat_report_event
(
pyra
->
chrdev_minor
,
(
uint8_t
const
*
)
&
roccat_report
);
}
mutex_unlock
(
&
pyra
->
pyra_lock
);
return
sizeof
(
struct
pyra_settings
);
}
...
...
drivers/hid/hid-wiimote.c
View file @
b0eae38c
This diff is collapsed.
Click to expand it.
include/linux/hid.h
View file @
b0eae38c
...
...
@@ -312,6 +312,7 @@ struct hid_item {
#define HID_QUIRK_BADPAD 0x00000020
#define HID_QUIRK_MULTI_INPUT 0x00000040
#define HID_QUIRK_HIDINPUT_FORCE 0x00000080
#define HID_QUIRK_MULTITOUCH 0x00000100
#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000
#define HID_QUIRK_FULLSPEED_INTERVAL 0x10000000
#define HID_QUIRK_NO_INIT_REPORTS 0x20000000
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment