|
@@ -1222,6 +1222,7 @@ static bool hid_match_one_id(struct hid_device *hdev,
|
|
|
const struct hid_device_id *id)
|
|
|
{
|
|
|
return id->bus == hdev->bus &&
|
|
|
+ (id->group == HID_GROUP_ANY || id->group == hdev->group) &&
|
|
|
(id->vendor == HID_ANY_ID || id->vendor == hdev->vendor) &&
|
|
|
(id->product == HID_ANY_ID || id->product == hdev->product);
|
|
|
}
|
|
@@ -1694,6 +1695,7 @@ static ssize_t store_new_id(struct device_driver *drv, const char *buf,
|
|
|
return -ENOMEM;
|
|
|
|
|
|
dynid->id.bus = bus;
|
|
|
+ dynid->id.group = HID_GROUP_ANY;
|
|
|
dynid->id.vendor = vendor;
|
|
|
dynid->id.product = product;
|
|
|
dynid->id.driver_data = driver_data;
|
|
@@ -1817,6 +1819,23 @@ static int hid_device_remove(struct device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
|
|
+ int len;
|
|
|
+
|
|
|
+ len = snprintf(buf, PAGE_SIZE, "hid:b%04Xg%04Xv%08Xp%08X\n",
|
|
|
+ hdev->bus, hdev->group, hdev->vendor, hdev->product);
|
|
|
+
|
|
|
+ return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
|
|
|
+}
|
|
|
+
|
|
|
+static struct device_attribute hid_dev_attrs[] = {
|
|
|
+ __ATTR_RO(modalias),
|
|
|
+ __ATTR_NULL,
|
|
|
+};
|
|
|
+
|
|
|
static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|
|
{
|
|
|
struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
|
@@ -1834,8 +1853,8 @@ static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|
|
if (add_uevent_var(env, "HID_UNIQ=%s", hdev->uniq))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- if (add_uevent_var(env, "MODALIAS=hid:b%04Xv%08Xp%08X",
|
|
|
- hdev->bus, hdev->vendor, hdev->product))
|
|
|
+ if (add_uevent_var(env, "MODALIAS=hid:b%04Xg%04Xv%08Xp%08X",
|
|
|
+ hdev->bus, hdev->group, hdev->vendor, hdev->product))
|
|
|
return -ENOMEM;
|
|
|
|
|
|
return 0;
|
|
@@ -1843,6 +1862,7 @@ static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|
|
|
|
|
static struct bus_type hid_bus_type = {
|
|
|
.name = "hid",
|
|
|
+ .dev_attrs = hid_dev_attrs,
|
|
|
.match = hid_bus_match,
|
|
|
.probe = hid_device_probe,
|
|
|
.remove = hid_device_remove,
|