Commit d5d3e202 authored by Benjamin Tissoires's avatar Benjamin Tissoires Committed by Jiri Kosina

HID: core: move the dynamic quirks handling in core

usbhid has a list of dynamic quirks in addition to a list of static quirks.
There is not much USB specific in that, so move this part of the module
in core so we can have one central place for quirks.
Signed-off-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 20df1578
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# #
# Makefile for the HID driver # Makefile for the HID driver
# #
hid-y := hid-core.o hid-input.o hid-y := hid-core.o hid-input.o hid-quirks.o
hid-$(CONFIG_DEBUG_FS) += hid-debug.o hid-$(CONFIG_DEBUG_FS) += hid-debug.o
obj-$(CONFIG_HID) += hid.o obj-$(CONFIG_HID) += hid.o
......
...@@ -1597,8 +1597,8 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i ...@@ -1597,8 +1597,8 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
} }
EXPORT_SYMBOL_GPL(hid_input_report); EXPORT_SYMBOL_GPL(hid_input_report);
static bool hid_match_one_id(struct hid_device *hdev, bool hid_match_one_id(const struct hid_device *hdev,
const struct hid_device_id *id) const struct hid_device_id *id)
{ {
return (id->bus == HID_BUS_ANY || id->bus == hdev->bus) && return (id->bus == HID_BUS_ANY || id->bus == hdev->bus) &&
(id->group == HID_GROUP_ANY || id->group == hdev->group) && (id->group == HID_GROUP_ANY || id->group == hdev->group) &&
...@@ -1606,7 +1606,7 @@ static bool hid_match_one_id(struct hid_device *hdev, ...@@ -1606,7 +1606,7 @@ static bool hid_match_one_id(struct hid_device *hdev,
(id->product == HID_ANY_ID || id->product == hdev->product); (id->product == HID_ANY_ID || id->product == hdev->product);
} }
const struct hid_device_id *hid_match_id(struct hid_device *hdev, const struct hid_device_id *hid_match_id(const struct hid_device *hdev,
const struct hid_device_id *id) const struct hid_device_id *id)
{ {
for (; id->bus; id++) for (; id->bus; id++)
...@@ -2613,6 +2613,7 @@ static struct bus_type hid_bus_type = { ...@@ -2613,6 +2613,7 @@ static struct bus_type hid_bus_type = {
.remove = hid_device_remove, .remove = hid_device_remove,
.uevent = hid_uevent, .uevent = hid_uevent,
}; };
EXPORT_SYMBOL(hid_bus_type);
/* a list of devices that shouldn't be handled by HID core at all */ /* a list of devices that shouldn't be handled by HID core at all */
static const struct hid_device_id hid_ignore_list[] = { static const struct hid_device_id hid_ignore_list[] = {
...@@ -2931,6 +2932,8 @@ int hid_add_device(struct hid_device *hdev) ...@@ -2931,6 +2932,8 @@ int hid_add_device(struct hid_device *hdev)
if (WARN_ON(hdev->status & HID_STAT_ADDED)) if (WARN_ON(hdev->status & HID_STAT_ADDED))
return -EBUSY; return -EBUSY;
hdev->quirks = hid_lookup_quirk(hdev);
/* we need to kill them here, otherwise they will stay allocated to /* we need to kill them here, otherwise they will stay allocated to
* wait for coming driver */ * wait for coming driver */
if (hid_ignore(hdev)) if (hid_ignore(hdev))
...@@ -3117,6 +3120,7 @@ static void __exit hid_exit(void) ...@@ -3117,6 +3120,7 @@ static void __exit hid_exit(void)
hid_debug_exit(); hid_debug_exit();
hidraw_exit(); hidraw_exit();
bus_unregister(&hid_bus_type); bus_unregister(&hid_bus_type);
hid_quirks_exit(HID_BUS_ANY);
} }
module_init(hid_init); module_init(hid_init);
......
This diff is collapsed.
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# Makefile for the USB input drivers # Makefile for the USB input drivers
# #
usbhid-y := hid-core.o hid-quirks.o usbhid-y := hid-core.o
usbhid-$(CONFIG_USB_HIDDEV) += hiddev.o usbhid-$(CONFIG_USB_HIDDEV) += hiddev.o
usbhid-$(CONFIG_HID_PID) += hid-pidff.o usbhid-$(CONFIG_HID_PID) += hid-pidff.o
......
...@@ -978,8 +978,7 @@ static int usbhid_parse(struct hid_device *hid) ...@@ -978,8 +978,7 @@ static int usbhid_parse(struct hid_device *hid)
int num_descriptors; int num_descriptors;
size_t offset = offsetof(struct hid_descriptor, desc); size_t offset = offsetof(struct hid_descriptor, desc);
quirks = usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor), quirks = hid_lookup_quirk(hid);
le16_to_cpu(dev->descriptor.idProduct));
if (quirks & HID_QUIRK_IGNORE) if (quirks & HID_QUIRK_IGNORE)
return -ENODEV; return -ENODEV;
...@@ -1329,7 +1328,6 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * ...@@ -1329,7 +1328,6 @@ static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *
hid->vendor = le16_to_cpu(dev->descriptor.idVendor); hid->vendor = le16_to_cpu(dev->descriptor.idVendor);
hid->product = le16_to_cpu(dev->descriptor.idProduct); hid->product = le16_to_cpu(dev->descriptor.idProduct);
hid->name[0] = 0; hid->name[0] = 0;
hid->quirks = usbhid_lookup_quirk(hid->vendor, hid->product);
if (intf->cur_altsetting->desc.bInterfaceProtocol == if (intf->cur_altsetting->desc.bInterfaceProtocol ==
USB_INTERFACE_PROTOCOL_MOUSE) USB_INTERFACE_PROTOCOL_MOUSE)
hid->type = HID_TYPE_USBMOUSE; hid->type = HID_TYPE_USBMOUSE;
...@@ -1641,7 +1639,7 @@ static int __init hid_init(void) ...@@ -1641,7 +1639,7 @@ static int __init hid_init(void)
{ {
int retval = -ENOMEM; int retval = -ENOMEM;
retval = usbhid_quirks_init(quirks_param); retval = hid_quirks_init(quirks_param, BUS_USB, MAX_USBHID_BOOT_QUIRKS);
if (retval) if (retval)
goto usbhid_quirks_init_fail; goto usbhid_quirks_init_fail;
retval = usb_register(&hid_driver); retval = usb_register(&hid_driver);
...@@ -1651,7 +1649,7 @@ static int __init hid_init(void) ...@@ -1651,7 +1649,7 @@ static int __init hid_init(void)
return 0; return 0;
usb_register_fail: usb_register_fail:
usbhid_quirks_exit(); hid_quirks_exit(BUS_USB);
usbhid_quirks_init_fail: usbhid_quirks_init_fail:
return retval; return retval;
} }
...@@ -1659,7 +1657,7 @@ static int __init hid_init(void) ...@@ -1659,7 +1657,7 @@ static int __init hid_init(void)
static void __exit hid_exit(void) static void __exit hid_exit(void)
{ {
usb_deregister(&hid_driver); usb_deregister(&hid_driver);
usbhid_quirks_exit(); hid_quirks_exit(BUS_USB);
} }
module_init(hid_init); module_init(hid_init);
......
This diff is collapsed.
...@@ -860,7 +860,9 @@ int hid_open_report(struct hid_device *device); ...@@ -860,7 +860,9 @@ int hid_open_report(struct hid_device *device);
int hid_check_keys_pressed(struct hid_device *hid); int hid_check_keys_pressed(struct hid_device *hid);
int hid_connect(struct hid_device *hid, unsigned int connect_mask); int hid_connect(struct hid_device *hid, unsigned int connect_mask);
void hid_disconnect(struct hid_device *hid); void hid_disconnect(struct hid_device *hid);
const struct hid_device_id *hid_match_id(struct hid_device *hdev, bool hid_match_one_id(const struct hid_device *hdev,
const struct hid_device_id *id);
const struct hid_device_id *hid_match_id(const struct hid_device *hdev,
const struct hid_device_id *id); const struct hid_device_id *id);
s32 hid_snto32(__u32 value, unsigned n); s32 hid_snto32(__u32 value, unsigned n);
__u32 hid_field_extract(const struct hid_device *hid, __u8 *report, __u32 hid_field_extract(const struct hid_device *hid, __u8 *report,
...@@ -1098,9 +1100,9 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size, ...@@ -1098,9 +1100,9 @@ int hid_report_raw_event(struct hid_device *hid, int type, u8 *data, int size,
int interrupt); int interrupt);
/* HID quirks API */ /* HID quirks API */
u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct); unsigned long hid_lookup_quirk(const struct hid_device *hdev);
int usbhid_quirks_init(char **quirks_param); int hid_quirks_init(char **quirks_param, __u16 bus, int count);
void usbhid_quirks_exit(void); void hid_quirks_exit(__u16 bus);
#ifdef CONFIG_HID_PID #ifdef CONFIG_HID_PID
int hid_pidff_init(struct hid_device *hid); int hid_pidff_init(struct hid_device *hid);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment