HID: move connect quirks
Move connecting from usbhid to the hid layer and fix also hidp in that manner. This removes all the ignore/force hidinput/hiddev connecting quirks. Signed-off-by: Jiri Slaby <jirislaby@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
@ -1113,6 +1113,80 @@ int hid_input_report(struct hid_device *hid, int type, u8 *data, int size, int i
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_input_report);
|
||||
|
||||
int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
||||
{
|
||||
static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
|
||||
"Joystick", "Gamepad", "Keyboard", "Keypad",
|
||||
"Multi-Axis Controller"
|
||||
};
|
||||
const char *type, *bus;
|
||||
char buf[64];
|
||||
unsigned int i;
|
||||
int len;
|
||||
|
||||
if (hdev->bus != BUS_USB)
|
||||
connect_mask &= ~HID_CONNECT_HIDDEV;
|
||||
|
||||
if ((connect_mask & HID_CONNECT_HIDINPUT) && !hidinput_connect(hdev,
|
||||
connect_mask & HID_CONNECT_HIDINPUT_FORCE))
|
||||
hdev->claimed |= HID_CLAIMED_INPUT;
|
||||
if ((connect_mask & HID_CONNECT_HIDDEV) && hdev->hiddev_connect &&
|
||||
!hdev->hiddev_connect(hdev,
|
||||
connect_mask & HID_CONNECT_HIDDEV_FORCE))
|
||||
hdev->claimed |= HID_CLAIMED_HIDDEV;
|
||||
if ((connect_mask & HID_CONNECT_HIDRAW) && !hidraw_connect(hdev))
|
||||
hdev->claimed |= HID_CLAIMED_HIDRAW;
|
||||
|
||||
if (!hdev->claimed) {
|
||||
dev_err(&hdev->dev, "claimed by neither input, hiddev nor "
|
||||
"hidraw\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if ((hdev->claimed & HID_CLAIMED_INPUT) &&
|
||||
(connect_mask & HID_CONNECT_FF) && hdev->ff_init)
|
||||
hdev->ff_init(hdev);
|
||||
|
||||
len = 0;
|
||||
if (hdev->claimed & HID_CLAIMED_INPUT)
|
||||
len += sprintf(buf + len, "input");
|
||||
if (hdev->claimed & HID_CLAIMED_HIDDEV)
|
||||
len += sprintf(buf + len, "%shiddev%d", len ? "," : "",
|
||||
hdev->minor);
|
||||
if (hdev->claimed & HID_CLAIMED_HIDRAW)
|
||||
len += sprintf(buf + len, "%shidraw%d", len ? "," : "",
|
||||
((struct hidraw *)hdev->hidraw)->minor);
|
||||
|
||||
type = "Device";
|
||||
for (i = 0; i < hdev->maxcollection; i++) {
|
||||
struct hid_collection *col = &hdev->collection[i];
|
||||
if (col->type == HID_COLLECTION_APPLICATION &&
|
||||
(col->usage & HID_USAGE_PAGE) == HID_UP_GENDESK &&
|
||||
(col->usage & 0xffff) < ARRAY_SIZE(types)) {
|
||||
type = types[col->usage & 0xffff];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (hdev->bus) {
|
||||
case BUS_USB:
|
||||
bus = "USB";
|
||||
break;
|
||||
case BUS_BLUETOOTH:
|
||||
bus = "BLUETOOTH";
|
||||
break;
|
||||
default:
|
||||
bus = "<UNKNOWN>";
|
||||
}
|
||||
|
||||
dev_info(&hdev->dev, "%s: %s HID v%x.%02x %s [%s] on %s\n",
|
||||
buf, bus, hdev->version >> 8, hdev->version & 0xff,
|
||||
type, hdev->name, hdev->phys);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_connect);
|
||||
|
||||
static bool hid_match_one_id(struct hid_device *hdev,
|
||||
const struct hid_device_id *id)
|
||||
{
|
||||
@ -1238,7 +1312,7 @@ static int hid_device_probe(struct device *dev)
|
||||
} else { /* default probe */
|
||||
ret = hid_parse(hdev);
|
||||
if (!ret)
|
||||
ret = hid_hw_start(hdev);
|
||||
ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
|
||||
}
|
||||
if (ret)
|
||||
hdev->driver = NULL;
|
||||
|
Reference in New Issue
Block a user