Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
Pull HID fixes from Jiri Kosina: "A few tiny HID subsystem fixes for 3.16" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: HID: use multi input quirk for 22b9:2968 HID: sensor-hub: fix potential memory leak HID: usbhid: quirk for PM1610 and PM1640 Touchscreen. HID: rmi: Protect PM-only functions by #ifdef CONFIG_PM HID: sensor-hub: introduce Kconfig dependency on IOMEM HID: sensor-hub: make dyn_callback_lock IRQ-safe
This commit is contained in:
Коммит
4c2f503aad
|
@ -810,7 +810,7 @@ config HID_ZYDACRON
|
||||||
|
|
||||||
config HID_SENSOR_HUB
|
config HID_SENSOR_HUB
|
||||||
tristate "HID Sensors framework support"
|
tristate "HID Sensors framework support"
|
||||||
depends on HID
|
depends on HID && HAS_IOMEM
|
||||||
select MFD_CORE
|
select MFD_CORE
|
||||||
default n
|
default n
|
||||||
---help---
|
---help---
|
||||||
|
|
|
@ -323,6 +323,7 @@
|
||||||
|
|
||||||
#define USB_VENDOR_ID_ETURBOTOUCH 0x22b9
|
#define USB_VENDOR_ID_ETURBOTOUCH 0x22b9
|
||||||
#define USB_DEVICE_ID_ETURBOTOUCH 0x0006
|
#define USB_DEVICE_ID_ETURBOTOUCH 0x0006
|
||||||
|
#define USB_DEVICE_ID_ETURBOTOUCH_2968 0x2968
|
||||||
|
|
||||||
#define USB_VENDOR_ID_EZKEY 0x0518
|
#define USB_VENDOR_ID_EZKEY 0x0518
|
||||||
#define USB_DEVICE_ID_BTC_8193 0x0002
|
#define USB_DEVICE_ID_BTC_8193 0x0002
|
||||||
|
@ -715,6 +716,8 @@
|
||||||
|
|
||||||
#define USB_VENDOR_ID_PENMOUNT 0x14e1
|
#define USB_VENDOR_ID_PENMOUNT 0x14e1
|
||||||
#define USB_DEVICE_ID_PENMOUNT_PCI 0x3500
|
#define USB_DEVICE_ID_PENMOUNT_PCI 0x3500
|
||||||
|
#define USB_DEVICE_ID_PENMOUNT_1610 0x1610
|
||||||
|
#define USB_DEVICE_ID_PENMOUNT_1640 0x1640
|
||||||
|
|
||||||
#define USB_VENDOR_ID_PETALYNX 0x18b1
|
#define USB_VENDOR_ID_PETALYNX 0x18b1
|
||||||
#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
|
#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
|
||||||
|
|
|
@ -428,6 +428,7 @@ static int rmi_raw_event(struct hid_device *hdev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int rmi_post_reset(struct hid_device *hdev)
|
static int rmi_post_reset(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
return rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS);
|
return rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS);
|
||||||
|
@ -437,6 +438,7 @@ static int rmi_post_resume(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
return rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS);
|
return rmi_set_mode(hdev, RMI_MODE_ATTN_REPORTS);
|
||||||
}
|
}
|
||||||
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
#define RMI4_MAX_PAGE 0xff
|
#define RMI4_MAX_PAGE 0xff
|
||||||
#define RMI4_PAGE_SIZE 0x0100
|
#define RMI4_PAGE_SIZE 0x0100
|
||||||
|
|
|
@ -159,17 +159,18 @@ int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
|
||||||
{
|
{
|
||||||
struct hid_sensor_hub_callbacks_list *callback;
|
struct hid_sensor_hub_callbacks_list *callback;
|
||||||
struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
|
struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock(&pdata->dyn_callback_lock);
|
spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
|
||||||
list_for_each_entry(callback, &pdata->dyn_callback_list, list)
|
list_for_each_entry(callback, &pdata->dyn_callback_list, list)
|
||||||
if (callback->usage_id == usage_id &&
|
if (callback->usage_id == usage_id &&
|
||||||
callback->hsdev == hsdev) {
|
callback->hsdev == hsdev) {
|
||||||
spin_unlock(&pdata->dyn_callback_lock);
|
spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
callback = kzalloc(sizeof(*callback), GFP_ATOMIC);
|
callback = kzalloc(sizeof(*callback), GFP_ATOMIC);
|
||||||
if (!callback) {
|
if (!callback) {
|
||||||
spin_unlock(&pdata->dyn_callback_lock);
|
spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
callback->hsdev = hsdev;
|
callback->hsdev = hsdev;
|
||||||
|
@ -177,7 +178,7 @@ int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
|
||||||
callback->usage_id = usage_id;
|
callback->usage_id = usage_id;
|
||||||
callback->priv = NULL;
|
callback->priv = NULL;
|
||||||
list_add_tail(&callback->list, &pdata->dyn_callback_list);
|
list_add_tail(&callback->list, &pdata->dyn_callback_list);
|
||||||
spin_unlock(&pdata->dyn_callback_lock);
|
spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -188,8 +189,9 @@ int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
|
||||||
{
|
{
|
||||||
struct hid_sensor_hub_callbacks_list *callback;
|
struct hid_sensor_hub_callbacks_list *callback;
|
||||||
struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
|
struct sensor_hub_data *pdata = hid_get_drvdata(hsdev->hdev);
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock(&pdata->dyn_callback_lock);
|
spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
|
||||||
list_for_each_entry(callback, &pdata->dyn_callback_list, list)
|
list_for_each_entry(callback, &pdata->dyn_callback_list, list)
|
||||||
if (callback->usage_id == usage_id &&
|
if (callback->usage_id == usage_id &&
|
||||||
callback->hsdev == hsdev) {
|
callback->hsdev == hsdev) {
|
||||||
|
@ -197,7 +199,7 @@ int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
|
||||||
kfree(callback);
|
kfree(callback);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
spin_unlock(&pdata->dyn_callback_lock);
|
spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -378,15 +380,16 @@ static int sensor_hub_suspend(struct hid_device *hdev, pm_message_t message)
|
||||||
{
|
{
|
||||||
struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
|
struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
|
||||||
struct hid_sensor_hub_callbacks_list *callback;
|
struct hid_sensor_hub_callbacks_list *callback;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
hid_dbg(hdev, " sensor_hub_suspend\n");
|
hid_dbg(hdev, " sensor_hub_suspend\n");
|
||||||
spin_lock(&pdata->dyn_callback_lock);
|
spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
|
||||||
list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
|
list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
|
||||||
if (callback->usage_callback->suspend)
|
if (callback->usage_callback->suspend)
|
||||||
callback->usage_callback->suspend(
|
callback->usage_callback->suspend(
|
||||||
callback->hsdev, callback->priv);
|
callback->hsdev, callback->priv);
|
||||||
}
|
}
|
||||||
spin_unlock(&pdata->dyn_callback_lock);
|
spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -395,15 +398,16 @@ static int sensor_hub_resume(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
|
struct sensor_hub_data *pdata = hid_get_drvdata(hdev);
|
||||||
struct hid_sensor_hub_callbacks_list *callback;
|
struct hid_sensor_hub_callbacks_list *callback;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
hid_dbg(hdev, " sensor_hub_resume\n");
|
hid_dbg(hdev, " sensor_hub_resume\n");
|
||||||
spin_lock(&pdata->dyn_callback_lock);
|
spin_lock_irqsave(&pdata->dyn_callback_lock, flags);
|
||||||
list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
|
list_for_each_entry(callback, &pdata->dyn_callback_list, list) {
|
||||||
if (callback->usage_callback->resume)
|
if (callback->usage_callback->resume)
|
||||||
callback->usage_callback->resume(
|
callback->usage_callback->resume(
|
||||||
callback->hsdev, callback->priv);
|
callback->hsdev, callback->priv);
|
||||||
}
|
}
|
||||||
spin_unlock(&pdata->dyn_callback_lock);
|
spin_unlock_irqrestore(&pdata->dyn_callback_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -632,6 +636,7 @@ static int sensor_hub_probe(struct hid_device *hdev,
|
||||||
if (name == NULL) {
|
if (name == NULL) {
|
||||||
hid_err(hdev, "Failed MFD device name\n");
|
hid_err(hdev, "Failed MFD device name\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
kfree(hsdev);
|
||||||
goto err_no_mem;
|
goto err_no_mem;
|
||||||
}
|
}
|
||||||
sd->hid_sensor_hub_client_devs[
|
sd->hid_sensor_hub_client_devs[
|
||||||
|
|
|
@ -49,6 +49,7 @@ static const struct hid_blacklist {
|
||||||
|
|
||||||
{ USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II, HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_EMS, USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II, HID_QUIRK_MULTI_INPUT },
|
||||||
{ USB_VENDOR_ID_ETURBOTOUCH, USB_DEVICE_ID_ETURBOTOUCH, HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_ETURBOTOUCH, USB_DEVICE_ID_ETURBOTOUCH, HID_QUIRK_MULTI_INPUT },
|
||||||
|
{ USB_VENDOR_ID_ETURBOTOUCH, USB_DEVICE_ID_ETURBOTOUCH_2968, HID_QUIRK_MULTI_INPUT },
|
||||||
{ USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD, HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_GREENASIA, USB_DEVICE_ID_GREENASIA_DUAL_USB_JOYPAD, HID_QUIRK_MULTI_INPUT },
|
||||||
{ USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
|
{ USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS },
|
||||||
{ USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT },
|
||||||
|
@ -76,6 +77,8 @@ static const struct hid_blacklist {
|
||||||
{ USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GX680R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GX680R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
{ USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_1610, HID_QUIRK_NOGET },
|
||||||
|
{ USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_1640, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
|
|
@ -122,6 +122,7 @@ config PHY_SUN4I_USB
|
||||||
|
|
||||||
config PHY_SAMSUNG_USB2
|
config PHY_SAMSUNG_USB2
|
||||||
tristate "Samsung USB 2.0 PHY driver"
|
tristate "Samsung USB 2.0 PHY driver"
|
||||||
|
depends on HAS_IOMEM
|
||||||
select GENERIC_PHY
|
select GENERIC_PHY
|
||||||
select MFD_SYSCON
|
select MFD_SYSCON
|
||||||
help
|
help
|
||||||
|
|
Загрузка…
Ссылка в новой задаче