diff options
author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2017-03-27 10:59:39 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2017-04-06 08:36:39 -0400 |
commit | a4bf6153b317754e058ad9c7f5f02367e0bfdcc8 (patch) | |
tree | fdff0add614014eeebceeb275783943d441b5fc0 | |
parent | 7f7ce2a258b47f9510ad613328c046a3ff9426b0 (diff) |
HID: logitech-hidpp: add a sysfs file to tell we support power_supply
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>
-rw-r--r-- | drivers/hid/hid-logitech-hidpp.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c index eb4339e91f23..41b39464ded8 100644 --- a/drivers/hid/hid-logitech-hidpp.c +++ b/drivers/hid/hid-logitech-hidpp.c | |||
@@ -2916,6 +2916,17 @@ static void hidpp_connect_event(struct hidpp_device *hidpp) | |||
2916 | hidpp->delayed_input = input; | 2916 | hidpp->delayed_input = input; |
2917 | } | 2917 | } |
2918 | 2918 | ||
2919 | static DEVICE_ATTR(builtin_power_supply, 0000, NULL, NULL); | ||
2920 | |||
2921 | static struct attribute *sysfs_attrs[] = { | ||
2922 | &dev_attr_builtin_power_supply.attr, | ||
2923 | NULL | ||
2924 | }; | ||
2925 | |||
2926 | static struct attribute_group ps_attribute_group = { | ||
2927 | .attrs = sysfs_attrs | ||
2928 | }; | ||
2929 | |||
2919 | static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) | 2930 | static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) |
2920 | { | 2931 | { |
2921 | struct hidpp_device *hidpp; | 2932 | struct hidpp_device *hidpp; |
@@ -2960,6 +2971,12 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
2960 | mutex_init(&hidpp->send_mutex); | 2971 | mutex_init(&hidpp->send_mutex); |
2961 | init_waitqueue_head(&hidpp->wait); | 2972 | init_waitqueue_head(&hidpp->wait); |
2962 | 2973 | ||
2974 | /* indicates we are handling the battery properties in the kernel */ | ||
2975 | ret = sysfs_create_group(&hdev->dev.kobj, &ps_attribute_group); | ||
2976 | if (ret) | ||
2977 | hid_warn(hdev, "Cannot allocate sysfs group for %s\n", | ||
2978 | hdev->name); | ||
2979 | |||
2963 | ret = hid_parse(hdev); | 2980 | ret = hid_parse(hdev); |
2964 | if (ret) { | 2981 | if (ret) { |
2965 | hid_err(hdev, "%s:parse failed\n", __func__); | 2982 | hid_err(hdev, "%s:parse failed\n", __func__); |
@@ -3042,6 +3059,7 @@ hid_hw_open_failed: | |||
3042 | } | 3059 | } |
3043 | hid_hw_start_fail: | 3060 | hid_hw_start_fail: |
3044 | hid_parse_fail: | 3061 | hid_parse_fail: |
3062 | sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group); | ||
3045 | cancel_work_sync(&hidpp->work); | 3063 | cancel_work_sync(&hidpp->work); |
3046 | mutex_destroy(&hidpp->send_mutex); | 3064 | mutex_destroy(&hidpp->send_mutex); |
3047 | allocate_fail: | 3065 | allocate_fail: |
@@ -3053,6 +3071,8 @@ static void hidpp_remove(struct hid_device *hdev) | |||
3053 | { | 3071 | { |
3054 | struct hidpp_device *hidpp = hid_get_drvdata(hdev); | 3072 | struct hidpp_device *hidpp = hid_get_drvdata(hdev); |
3055 | 3073 | ||
3074 | sysfs_remove_group(&hdev->dev.kobj, &ps_attribute_group); | ||
3075 | |||
3056 | if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) { | 3076 | if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) { |
3057 | hidpp_ff_deinit(hdev); | 3077 | hidpp_ff_deinit(hdev); |
3058 | hid_hw_close(hdev); | 3078 | hid_hw_close(hdev); |