HID: gt683r: move mode attribute to led-class devices

Move led_mode attribute from HID device to led-class devices and
rename it mode. This will also fix race condition by using
attribute-groups.

(cooloney@gmai.com: fix a typo in commit message)

Signed-off-by: Janne Kanniainen <janne.kanniainen@gmail.com>
Reviewed-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
This commit is contained in:
Janne Kanniainen 2014-07-03 10:17:09 -07:00 committed by Bryan Wu
parent c3883ae918
commit 6522fe1c39
2 changed files with 28 additions and 14 deletions

View File

@ -1,9 +1,11 @@
What: /sys/class/hidraw/<hidraw>/device/leds_mode What: /sys/class/leds/<led>/gt683r/mode
Date: Jun 2014 Date: Jun 2014
KernelVersion: 3.17 KernelVersion: 3.17
Contact: Janne Kanniainen <janne.kanniainen@gmail.com> Contact: Janne Kanniainen <janne.kanniainen@gmail.com>
Description: Description:
Set the mode of LEDs Set the mode of LEDs. You should notice that changing the mode
of one LED will update the mode of its two sibling devices as
well.
0 - normal 0 - normal
1 - audio 1 - audio

View File

@ -84,12 +84,13 @@ static void gt683r_brightness_set(struct led_classdev *led_cdev,
} }
} }
static ssize_t leds_mode_show(struct device *dev, static ssize_t mode_show(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
u8 sysfs_mode; u8 sysfs_mode;
struct hid_device *hdev = container_of(dev, struct hid_device, dev); struct hid_device *hdev = container_of(dev->parent,
struct hid_device, dev);
struct gt683r_led *led = hid_get_drvdata(hdev); struct gt683r_led *led = hid_get_drvdata(hdev);
if (led->mode == GT683R_LED_NORMAL) if (led->mode == GT683R_LED_NORMAL)
@ -102,12 +103,13 @@ static ssize_t leds_mode_show(struct device *dev,
return scnprintf(buf, PAGE_SIZE, "%u\n", sysfs_mode); return scnprintf(buf, PAGE_SIZE, "%u\n", sysfs_mode);
} }
static ssize_t leds_mode_store(struct device *dev, static ssize_t mode_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
u8 sysfs_mode; u8 sysfs_mode;
struct hid_device *hdev = container_of(dev, struct hid_device, dev); struct hid_device *hdev = container_of(dev->parent,
struct hid_device, dev);
struct gt683r_led *led = hid_get_drvdata(hdev); struct gt683r_led *led = hid_get_drvdata(hdev);
@ -212,7 +214,22 @@ fail:
mutex_unlock(&led->lock); mutex_unlock(&led->lock);
} }
static DEVICE_ATTR_RW(leds_mode); static DEVICE_ATTR_RW(mode);
static struct attribute *gt683r_led_attrs[] = {
&dev_attr_mode.attr,
NULL
};
static const struct attribute_group gt683r_led_group = {
.name = "gt683r",
.attrs = gt683r_led_attrs,
};
static const struct attribute_group *gt683r_led_groups[] = {
&gt683r_led_group,
NULL
};
static int gt683r_led_probe(struct hid_device *hdev, static int gt683r_led_probe(struct hid_device *hdev,
const struct hid_device_id *id) const struct hid_device_id *id)
@ -261,6 +278,8 @@ static int gt683r_led_probe(struct hid_device *hdev,
led->led_devs[i].name = name; led->led_devs[i].name = name;
led->led_devs[i].max_brightness = 1; led->led_devs[i].max_brightness = 1;
led->led_devs[i].brightness_set = gt683r_brightness_set; led->led_devs[i].brightness_set = gt683r_brightness_set;
led->led_devs[i].groups = gt683r_led_groups;
ret = led_classdev_register(&hdev->dev, &led->led_devs[i]); ret = led_classdev_register(&hdev->dev, &led->led_devs[i]);
if (ret) { if (ret) {
hid_err(hdev, "could not register led device\n"); hid_err(hdev, "could not register led device\n");
@ -268,12 +287,6 @@ static int gt683r_led_probe(struct hid_device *hdev,
} }
} }
ret = device_create_file(&led->hdev->dev, &dev_attr_leds_mode);
if (ret) {
hid_err(hdev, "could not make mode attribute file\n");
goto fail;
}
return 0; return 0;
fail: fail:
@ -288,7 +301,6 @@ static void gt683r_led_remove(struct hid_device *hdev)
int i; int i;
struct gt683r_led *led = hid_get_drvdata(hdev); struct gt683r_led *led = hid_get_drvdata(hdev);
device_remove_file(&hdev->dev, &dev_attr_leds_mode);
for (i = 0; i < GT683R_LED_COUNT; i++) for (i = 0; i < GT683R_LED_COUNT; i++)
led_classdev_unregister(&led->led_devs[i]); led_classdev_unregister(&led->led_devs[i]);
flush_work(&led->work); flush_work(&led->work);