HID: logitech-hidpp: add a sysfs file to tell we support power_supply
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>
Mon, 27 Mar 2017 14:59:39 +0000 (16:59 +0200)
committerJiri Kosina <jkosina@suse.cz>
Thu, 6 Apr 2017 12:36:39 +0000 (14:36 +0200)
This way, upower can add a simple udev rule to decide whether or not
it should use the internal unifying support or just the generic kernel
one.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Bastien Nocera <hadess@hadess.net>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-logitech-hidpp.c

index eb4339e..41b3946 100644 (file)
@@ -2916,6 +2916,17 @@ static void hidpp_connect_event(struct hidpp_device *hidpp)
        hidpp->delayed_input = input;
 }
 
+static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL);
+
+static struct attribute *sysfs_attrs[] = {
+       &dev_attr_builtin_power_supply.attr,
+       NULL
+};
+
+static struct attribute_group ps_attribute_group = {
+       .attrs = sysfs_attrs
+};
+
 static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
 {
        struct hidpp_device *hidpp;
@@ -2960,6 +2971,12 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
        mutex_init(&hidpp->send_mutex);
        init_waitqueue_head(&hidpp->wait);
 
+       /* indicates we are handling the battery properties in the kernel */
+       ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group);
+       if (ret)
+               hid_warn(hdev, "Cannot allocate sysfs group for %s\n",
+                        hdev->name);
+
        ret = hid_parse(hdev);
        if (ret) {
                hid_err(hdev, "%s:parse failed\n", __func__);
@@ -3042,6 +3059,7 @@ hid_hw_open_failed:
        }
 hid_hw_start_fail:
 hid_parse_fail:
+       sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
        cancel_work_sync(&hidpp->work);
        mutex_destroy(&hidpp->send_mutex);
 allocate_fail:
@@ -3053,6 +3071,8 @@ static void hidpp_remove(struct hid_device *hdev)
 {
        struct hidpp_device *hidpp = hid_get_drvdata(hdev);
 
+       sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group);
+
        if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
                hidpp_ff_deinit(hdev);
                hid_hw_close(hdev);