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:
Linus Torvalds 2014-07-07 13:13:03 -07:00
Родитель 92556e6039 3179e8e684
Коммит 4c2f503aad
6 изменённых файлов: 25 добавлений и 11 удалений

Просмотреть файл

@ -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