Commit 6522fe1c authored by Janne Kanniainen's avatar Janne Kanniainen Committed by Bryan Wu

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: default avatarJanne Kanniainen <janne.kanniainen@gmail.com>
Reviewed-by: default avatarJohan Hovold <johan@kernel.org>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent c3883ae9
What: /sys/class/hidraw/<hidraw>/device/leds_mode
What: /sys/class/leds/<led>/gt683r/mode
Date: Jun 2014
KernelVersion: 3.17
Contact: Janne Kanniainen <janne.kanniainen@gmail.com>
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
1 - audio
......
......@@ -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,
char *buf)
{
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);
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);
}
static ssize_t leds_mode_store(struct device *dev,
static ssize_t mode_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
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);
......@@ -212,7 +214,22 @@ static void gt683r_led_work(struct work_struct *work)
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,
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].max_brightness = 1;
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]);
if (ret) {
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;
fail:
......@@ -288,7 +301,6 @@ static void gt683r_led_remove(struct hid_device *hdev)
int i;
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++)
led_classdev_unregister(&led->led_devs[i]);
flush_work(&led->work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment