Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID fixes from Jiri Kosina: "Bugfixes for HID subsystem that should go in 4.1. Important highlights: - the patch that extended support for HID++ protocol for TK820 touchpad turns out to be causing regressions due to firmware issues; patch reverting back to basic support from Benjamin Tissoires - Wacom driver can oops for devices that report non-touch data on touch interfaces. Fix from Ping Cheng - gpiolib is not mandatory for i2c-hid, so the driver shouldn't fail if gpiolib is not enabled. Fix from Mika Westerberg" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: HID: wacom: fix an Oops caused by wacom_wac_finger_count_touches HID: usbhid: Add HID_QUIRK_NOGET for Aten DVI KVM switch HID: hid-sensor-hub: Fix debug lock warning Revert "HID: logitech-hidpp: support combo keyboard touchpad TK820" HID: i2c-hid: Do not fail probing if gpiolib is not enabled
This commit is contained in:
commit
6efdb114b4
|
@ -164,6 +164,7 @@
|
||||||
#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
|
#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204
|
||||||
#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
|
#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
|
||||||
#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
|
#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
|
||||||
|
#define USB_DEVICE_ID_ATEN_CS682 0x2213
|
||||||
|
|
||||||
#define USB_VENDOR_ID_ATMEL 0x03eb
|
#define USB_VENDOR_ID_ATMEL 0x03eb
|
||||||
#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c
|
#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c
|
||||||
|
|
|
@ -44,7 +44,6 @@ MODULE_PARM_DESC(disable_raw_mode,
|
||||||
/* bits 1..20 are reserved for classes */
|
/* bits 1..20 are reserved for classes */
|
||||||
#define HIDPP_QUIRK_DELAYED_INIT BIT(21)
|
#define HIDPP_QUIRK_DELAYED_INIT BIT(21)
|
||||||
#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
|
#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
|
||||||
#define HIDPP_QUIRK_MULTI_INPUT BIT(23)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are two hidpp protocols in use, the first version hidpp10 is known
|
* There are two hidpp protocols in use, the first version hidpp10 is known
|
||||||
|
@ -706,12 +705,6 @@ static int wtp_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||||
struct hid_field *field, struct hid_usage *usage,
|
struct hid_field *field, struct hid_usage *usage,
|
||||||
unsigned long **bit, int *max)
|
unsigned long **bit, int *max)
|
||||||
{
|
{
|
||||||
struct hidpp_device *hidpp = hid_get_drvdata(hdev);
|
|
||||||
|
|
||||||
if ((hidpp->quirks & HIDPP_QUIRK_MULTI_INPUT) &&
|
|
||||||
(field->application == HID_GD_KEYBOARD))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -720,10 +713,6 @@ static void wtp_populate_input(struct hidpp_device *hidpp,
|
||||||
{
|
{
|
||||||
struct wtp_data *wd = hidpp->private_data;
|
struct wtp_data *wd = hidpp->private_data;
|
||||||
|
|
||||||
if ((hidpp->quirks & HIDPP_QUIRK_MULTI_INPUT) && origin_is_hid_core)
|
|
||||||
/* this is the generic hid-input call */
|
|
||||||
return;
|
|
||||||
|
|
||||||
__set_bit(EV_ABS, input_dev->evbit);
|
__set_bit(EV_ABS, input_dev->evbit);
|
||||||
__set_bit(EV_KEY, input_dev->evbit);
|
__set_bit(EV_KEY, input_dev->evbit);
|
||||||
__clear_bit(EV_REL, input_dev->evbit);
|
__clear_bit(EV_REL, input_dev->evbit);
|
||||||
|
@ -1245,10 +1234,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||||
if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
|
if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
|
||||||
connect_mask &= ~HID_CONNECT_HIDINPUT;
|
connect_mask &= ~HID_CONNECT_HIDINPUT;
|
||||||
|
|
||||||
/* Re-enable hidinput for multi-input devices */
|
|
||||||
if (hidpp->quirks & HIDPP_QUIRK_MULTI_INPUT)
|
|
||||||
connect_mask |= HID_CONNECT_HIDINPUT;
|
|
||||||
|
|
||||||
ret = hid_hw_start(hdev, connect_mask);
|
ret = hid_hw_start(hdev, connect_mask);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
|
hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
|
||||||
|
@ -1296,11 +1281,6 @@ static const struct hid_device_id hidpp_devices[] = {
|
||||||
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
|
HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
|
||||||
USB_DEVICE_ID_LOGITECH_T651),
|
USB_DEVICE_ID_LOGITECH_T651),
|
||||||
.driver_data = HIDPP_QUIRK_CLASS_WTP },
|
.driver_data = HIDPP_QUIRK_CLASS_WTP },
|
||||||
{ /* Keyboard TK820 */
|
|
||||||
HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE,
|
|
||||||
USB_VENDOR_ID_LOGITECH, 0x4102),
|
|
||||||
.driver_data = HIDPP_QUIRK_DELAYED_INIT | HIDPP_QUIRK_MULTI_INPUT |
|
|
||||||
HIDPP_QUIRK_CLASS_WTP },
|
|
||||||
|
|
||||||
{ HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE,
|
{ HID_DEVICE(BUS_USB, HID_GROUP_LOGITECH_DJ_DEVICE,
|
||||||
USB_VENDOR_ID_LOGITECH, HID_ANY_ID)},
|
USB_VENDOR_ID_LOGITECH, HID_ANY_ID)},
|
||||||
|
|
|
@ -294,7 +294,7 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
|
||||||
if (!report)
|
if (!report)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&hsdev->mutex);
|
mutex_lock(hsdev->mutex_ptr);
|
||||||
if (flag == SENSOR_HUB_SYNC) {
|
if (flag == SENSOR_HUB_SYNC) {
|
||||||
memset(&hsdev->pending, 0, sizeof(hsdev->pending));
|
memset(&hsdev->pending, 0, sizeof(hsdev->pending));
|
||||||
init_completion(&hsdev->pending.ready);
|
init_completion(&hsdev->pending.ready);
|
||||||
|
@ -328,7 +328,7 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
|
||||||
kfree(hsdev->pending.raw_data);
|
kfree(hsdev->pending.raw_data);
|
||||||
hsdev->pending.status = false;
|
hsdev->pending.status = false;
|
||||||
}
|
}
|
||||||
mutex_unlock(&hsdev->mutex);
|
mutex_unlock(hsdev->mutex_ptr);
|
||||||
|
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
@ -667,7 +667,14 @@ static int sensor_hub_probe(struct hid_device *hdev,
|
||||||
hsdev->vendor_id = hdev->vendor;
|
hsdev->vendor_id = hdev->vendor;
|
||||||
hsdev->product_id = hdev->product;
|
hsdev->product_id = hdev->product;
|
||||||
hsdev->usage = collection->usage;
|
hsdev->usage = collection->usage;
|
||||||
mutex_init(&hsdev->mutex);
|
hsdev->mutex_ptr = devm_kzalloc(&hdev->dev,
|
||||||
|
sizeof(struct mutex),
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!hsdev->mutex_ptr) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err_stop_hw;
|
||||||
|
}
|
||||||
|
mutex_init(hsdev->mutex_ptr);
|
||||||
hsdev->start_collection_index = i;
|
hsdev->start_collection_index = i;
|
||||||
if (last_hsdev)
|
if (last_hsdev)
|
||||||
last_hsdev->end_collection_index = i;
|
last_hsdev->end_collection_index = i;
|
||||||
|
|
|
@ -862,6 +862,7 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client,
|
||||||
union acpi_object *obj;
|
union acpi_object *obj;
|
||||||
struct acpi_device *adev;
|
struct acpi_device *adev;
|
||||||
acpi_handle handle;
|
acpi_handle handle;
|
||||||
|
int ret;
|
||||||
|
|
||||||
handle = ACPI_HANDLE(&client->dev);
|
handle = ACPI_HANDLE(&client->dev);
|
||||||
if (!handle || acpi_bus_get_device(handle, &adev))
|
if (!handle || acpi_bus_get_device(handle, &adev))
|
||||||
|
@ -877,7 +878,9 @@ static int i2c_hid_acpi_pdata(struct i2c_client *client,
|
||||||
pdata->hid_descriptor_address = obj->integer.value;
|
pdata->hid_descriptor_address = obj->integer.value;
|
||||||
ACPI_FREE(obj);
|
ACPI_FREE(obj);
|
||||||
|
|
||||||
return acpi_dev_add_driver_gpios(adev, i2c_hid_acpi_gpios);
|
/* GPIOs are optional */
|
||||||
|
ret = acpi_dev_add_driver_gpios(adev, i2c_hid_acpi_gpios);
|
||||||
|
return ret < 0 && ret != -ENXIO ? ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct acpi_device_id i2c_hid_acpi_match[] = {
|
static const struct acpi_device_id i2c_hid_acpi_match[] = {
|
||||||
|
|
|
@ -61,6 +61,7 @@ static const struct hid_blacklist {
|
||||||
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
|
||||||
|
{ USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET },
|
||||||
|
|
|
@ -1072,6 +1072,9 @@ static int wacom_wac_finger_count_touches(struct wacom_wac *wacom)
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (!touch_max)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* non-HID_GENERIC single touch input doesn't call this routine */
|
/* non-HID_GENERIC single touch input doesn't call this routine */
|
||||||
if ((touch_max == 1) && (wacom->features.type == HID_GENERIC))
|
if ((touch_max == 1) && (wacom->features.type == HID_GENERIC))
|
||||||
return wacom->hid_data.tipswitch &&
|
return wacom->hid_data.tipswitch &&
|
||||||
|
|
|
@ -74,7 +74,7 @@ struct sensor_hub_pending {
|
||||||
* @usage: Usage id for this hub device instance.
|
* @usage: Usage id for this hub device instance.
|
||||||
* @start_collection_index: Starting index for a phy type collection
|
* @start_collection_index: Starting index for a phy type collection
|
||||||
* @end_collection_index: Last index for a phy type collection
|
* @end_collection_index: Last index for a phy type collection
|
||||||
* @mutex: synchronizing mutex.
|
* @mutex_ptr: synchronizing mutex pointer.
|
||||||
* @pending: Holds information of pending sync read request.
|
* @pending: Holds information of pending sync read request.
|
||||||
*/
|
*/
|
||||||
struct hid_sensor_hub_device {
|
struct hid_sensor_hub_device {
|
||||||
|
@ -84,7 +84,7 @@ struct hid_sensor_hub_device {
|
||||||
u32 usage;
|
u32 usage;
|
||||||
int start_collection_index;
|
int start_collection_index;
|
||||||
int end_collection_index;
|
int end_collection_index;
|
||||||
struct mutex mutex;
|
struct mutex *mutex_ptr;
|
||||||
struct sensor_hub_pending pending;
|
struct sensor_hub_pending pending;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue