Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid: USB HID: Add ID for eGalax Multitouch used in JooJoo tablet HID: hiddev: fix memory corruption due to invalid intfdata HID: hiddev: protect against disconnect/NULL-dereference race HID: picolcd: correct ordering of framebuffer freeing HID: picolcd: testing the wrong variable
This commit is contained in:
commit
d1126ad907
|
@ -1299,6 +1299,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV, USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) },
|
||||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR) },
|
||||||
|
|
|
@ -159,6 +159,13 @@ static int egalax_event(struct hid_device *hid, struct hid_field *field,
|
||||||
{
|
{
|
||||||
struct egalax_data *td = hid_get_drvdata(hid);
|
struct egalax_data *td = hid_get_drvdata(hid);
|
||||||
|
|
||||||
|
/* Note, eGalax has two product lines: the first is resistive and
|
||||||
|
* uses a standard parallel multitouch protocol (product ID ==
|
||||||
|
* 48xx). The second is capacitive and uses an unusual "serial"
|
||||||
|
* protocol with a different message for each multitouch finger
|
||||||
|
* (product ID == 72xx). We do not yet generate a correct event
|
||||||
|
* sequence for the capacitive/serial protocol.
|
||||||
|
*/
|
||||||
if (hid->claimed & HID_CLAIMED_INPUT) {
|
if (hid->claimed & HID_CLAIMED_INPUT) {
|
||||||
struct input_dev *input = field->hidinput->input;
|
struct input_dev *input = field->hidinput->input;
|
||||||
|
|
||||||
|
@ -246,6 +253,8 @@ static void egalax_remove(struct hid_device *hdev)
|
||||||
static const struct hid_device_id egalax_devices[] = {
|
static const struct hid_device_id egalax_devices[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
|
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
|
||||||
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
|
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_DWAV,
|
||||||
|
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1) },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(hid, egalax_devices);
|
MODULE_DEVICE_TABLE(hid, egalax_devices);
|
||||||
|
|
|
@ -188,6 +188,7 @@
|
||||||
#define USB_VENDOR_ID_DWAV 0x0eef
|
#define USB_VENDOR_ID_DWAV 0x0eef
|
||||||
#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001
|
#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001
|
||||||
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH 0x480d
|
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH 0x480d
|
||||||
|
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH1 0x720c
|
||||||
|
|
||||||
#define USB_VENDOR_ID_ELECOM 0x056e
|
#define USB_VENDOR_ID_ELECOM 0x056e
|
||||||
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
|
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
|
||||||
|
|
|
@ -547,11 +547,11 @@ static void picolcd_fb_destroy(struct fb_info *info)
|
||||||
ref_cnt--;
|
ref_cnt--;
|
||||||
mutex_lock(&info->lock);
|
mutex_lock(&info->lock);
|
||||||
(*ref_cnt)--;
|
(*ref_cnt)--;
|
||||||
may_release = !ref_cnt;
|
may_release = !*ref_cnt;
|
||||||
mutex_unlock(&info->lock);
|
mutex_unlock(&info->lock);
|
||||||
if (may_release) {
|
if (may_release) {
|
||||||
framebuffer_release(info);
|
|
||||||
vfree((u8 *)info->fix.smem_start);
|
vfree((u8 *)info->fix.smem_start);
|
||||||
|
framebuffer_release(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -266,13 +266,15 @@ static int hiddev_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
struct hiddev_list *list;
|
struct hiddev_list *list;
|
||||||
struct usb_interface *intf;
|
struct usb_interface *intf;
|
||||||
|
struct hid_device *hid;
|
||||||
struct hiddev *hiddev;
|
struct hiddev *hiddev;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
intf = usb_find_interface(&hiddev_driver, iminor(inode));
|
intf = usb_find_interface(&hiddev_driver, iminor(inode));
|
||||||
if (!intf)
|
if (!intf)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
hiddev = usb_get_intfdata(intf);
|
hid = usb_get_intfdata(intf);
|
||||||
|
hiddev = hid->hiddev;
|
||||||
|
|
||||||
if (!(list = kzalloc(sizeof(struct hiddev_list), GFP_KERNEL)))
|
if (!(list = kzalloc(sizeof(struct hiddev_list), GFP_KERNEL)))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -587,7 +589,7 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
struct hiddev_list *list = file->private_data;
|
struct hiddev_list *list = file->private_data;
|
||||||
struct hiddev *hiddev = list->hiddev;
|
struct hiddev *hiddev = list->hiddev;
|
||||||
struct hid_device *hid = hiddev->hid;
|
struct hid_device *hid = hiddev->hid;
|
||||||
struct usb_device *dev = hid_to_usb_dev(hid);
|
struct usb_device *dev;
|
||||||
struct hiddev_collection_info cinfo;
|
struct hiddev_collection_info cinfo;
|
||||||
struct hiddev_report_info rinfo;
|
struct hiddev_report_info rinfo;
|
||||||
struct hiddev_field_info finfo;
|
struct hiddev_field_info finfo;
|
||||||
|
@ -601,9 +603,11 @@ static long hiddev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
/* Called without BKL by compat methods so no BKL taken */
|
/* Called without BKL by compat methods so no BKL taken */
|
||||||
|
|
||||||
/* FIXME: Who or what stop this racing with a disconnect ?? */
|
/* FIXME: Who or what stop this racing with a disconnect ?? */
|
||||||
if (!hiddev->exist)
|
if (!hiddev->exist || !hid)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
dev = hid_to_usb_dev(hid);
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
|
||||||
case HIDIOCGVERSION:
|
case HIDIOCGVERSION:
|
||||||
|
@ -888,7 +892,6 @@ int hiddev_connect(struct hid_device *hid, unsigned int force)
|
||||||
hid->hiddev = hiddev;
|
hid->hiddev = hiddev;
|
||||||
hiddev->hid = hid;
|
hiddev->hid = hid;
|
||||||
hiddev->exist = 1;
|
hiddev->exist = 1;
|
||||||
usb_set_intfdata(usbhid->intf, usbhid);
|
|
||||||
retval = usb_register_dev(usbhid->intf, &hiddev_class);
|
retval = usb_register_dev(usbhid->intf, &hiddev_class);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
err_hid("Not able to get a minor for this device.");
|
err_hid("Not able to get a minor for this device.");
|
||||||
|
|
Loading…
Reference in New Issue