__check_hid_generic is used to check if there is a driver, other then the hid-generic driver, which wants to handle the hid-device, in which case hid_generic_match() will return false so that the other driver can bind. But what if the other driver also has a match callback and that indicates it does not want to handle the device? Then hid-generic should bind to it and thus hid_generic_match() should NOT return false in that case. This commit makes __check_hid_generic check if a matching driver has a match callback and if it does makes its check this, so that hid-generic will bind to devices which have a matching other driver, but that other driver's match callback rejects the device. Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> --- This patch was written while fixing the issues with hid-ite on the Acer SW5-012, where we only want to bind to one interface. In that specific case this change is not necessary because hid-multitouch will pick the hid-device which hid-ite's match callback is rejecting. --- drivers/hid/hid-generic.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/hid/hid-generic.c b/drivers/hid/hid-generic.c index f9db991d3c5a..fe3ca7612750 100644 --- a/drivers/hid/hid-generic.c +++ b/drivers/hid/hid-generic.c @@ -31,7 +31,13 @@ static int __check_hid_generic(struct device_driver *drv, void *data) if (hdrv == &hid_generic) return 0; - return hid_match_device(hdev, hdrv) != NULL; + if (!hid_match_device(hdev, hdrv)) + return 0; + + if (!hdrv->match) + return 1; + + return hdrv->match(hdev, false); } static bool hid_generic_match(struct hid_device *hdev, -- 2.23.0