|
@@ -1562,12 +1562,26 @@ read_report_descriptor(struct file *filp, struct kobject *kobj,
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
+static ssize_t
|
|
|
+show_country(struct device *dev, struct device_attribute *attr,
|
|
|
+ char *buf)
|
|
|
+{
|
|
|
+ struct hid_device *hdev = container_of(dev, struct hid_device, dev);
|
|
|
+
|
|
|
+ return sprintf(buf, "%02x\n", hdev->country & 0xff);
|
|
|
+}
|
|
|
+
|
|
|
static struct bin_attribute dev_bin_attr_report_desc = {
|
|
|
.attr = { .name = "report_descriptor", .mode = 0444 },
|
|
|
.read = read_report_descriptor,
|
|
|
.size = HID_MAX_DESCRIPTOR_SIZE,
|
|
|
};
|
|
|
|
|
|
+static struct device_attribute dev_attr_country = {
|
|
|
+ .attr = { .name = "country", .mode = 0444 },
|
|
|
+ .show = show_country,
|
|
|
+};
|
|
|
+
|
|
|
int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
|
|
{
|
|
|
static const char *types[] = { "Device", "Pointer", "Mouse", "Device",
|
|
@@ -1646,6 +1660,11 @@ int hid_connect(struct hid_device *hdev, unsigned int connect_mask)
|
|
|
bus = "<UNKNOWN>";
|
|
|
}
|
|
|
|
|
|
+ ret = device_create_file(&hdev->dev, &dev_attr_country);
|
|
|
+ if (ret)
|
|
|
+ hid_warn(hdev,
|
|
|
+ "can't create sysfs country code attribute err: %d\n", ret);
|
|
|
+
|
|
|
ret = device_create_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
|
|
|
if (ret)
|
|
|
hid_warn(hdev,
|
|
@@ -1661,6 +1680,7 @@ EXPORT_SYMBOL_GPL(hid_connect);
|
|
|
|
|
|
void hid_disconnect(struct hid_device *hdev)
|
|
|
{
|
|
|
+ device_remove_file(&hdev->dev, &dev_attr_country);
|
|
|
device_remove_bin_file(&hdev->dev, &dev_bin_attr_report_desc);
|
|
|
if (hdev->claimed & HID_CLAIMED_INPUT)
|
|
|
hidinput_disconnect(hdev);
|