aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2018-07-02 16:05:27 -0400
committerJacek Anaszewski <jacek.anaszewski@gmail.com>2018-07-05 17:21:12 -0400
commit2b7b6d44e29160eb12abd950c374babf21ed83d4 (patch)
tree16f07445e0a4b37ae7cdb8c823d1e4427443c4a5
parentf8112a1de1a728ffef0dd9f6c3005490c5f79ab1 (diff)
leds: timer trigger: simplifications from core changes
The trigger core learned error handling for the activate callback and can handle device attributes now. This allows simplifying the driver considerably. Note that .deactivate() is only called when .activate() succeeded, so the check for .trigger_data being non-NULL can go away. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
-rw-r--r--drivers/leds/trigger/ledtrig-timer.c53
1 files changed, 13 insertions, 40 deletions
diff --git a/drivers/leds/trigger/ledtrig-timer.c b/drivers/leds/trigger/ledtrig-timer.c
index 527055d815ad..7c14983781ee 100644
--- a/drivers/leds/trigger/ledtrig-timer.c
+++ b/drivers/leds/trigger/ledtrig-timer.c
@@ -20,7 +20,7 @@
20static ssize_t led_delay_on_show(struct device *dev, 20static ssize_t led_delay_on_show(struct device *dev,
21 struct device_attribute *attr, char *buf) 21 struct device_attribute *attr, char *buf)
22{ 22{
23 struct led_classdev *led_cdev = dev_get_drvdata(dev); 23 struct led_classdev *led_cdev = led_trigger_get_led(dev);
24 24
25 return sprintf(buf, "%lu\n", led_cdev->blink_delay_on); 25 return sprintf(buf, "%lu\n", led_cdev->blink_delay_on);
26} 26}
@@ -28,7 +28,7 @@ static ssize_t led_delay_on_show(struct device *dev,
28static ssize_t led_delay_on_store(struct device *dev, 28static ssize_t led_delay_on_store(struct device *dev,
29 struct device_attribute *attr, const char *buf, size_t size) 29 struct device_attribute *attr, const char *buf, size_t size)
30{ 30{
31 struct led_classdev *led_cdev = dev_get_drvdata(dev); 31 struct led_classdev *led_cdev = led_trigger_get_led(dev);
32 unsigned long state; 32 unsigned long state;
33 ssize_t ret = -EINVAL; 33 ssize_t ret = -EINVAL;
34 34
@@ -45,7 +45,7 @@ static ssize_t led_delay_on_store(struct device *dev,
45static ssize_t led_delay_off_show(struct device *dev, 45static ssize_t led_delay_off_show(struct device *dev,
46 struct device_attribute *attr, char *buf) 46 struct device_attribute *attr, char *buf)
47{ 47{
48 struct led_classdev *led_cdev = dev_get_drvdata(dev); 48 struct led_classdev *led_cdev = led_trigger_get_led(dev);
49 49
50 return sprintf(buf, "%lu\n", led_cdev->blink_delay_off); 50 return sprintf(buf, "%lu\n", led_cdev->blink_delay_off);
51} 51}
@@ -53,7 +53,7 @@ static ssize_t led_delay_off_show(struct device *dev,
53static ssize_t led_delay_off_store(struct device *dev, 53static ssize_t led_delay_off_store(struct device *dev,
54 struct device_attribute *attr, const char *buf, size_t size) 54 struct device_attribute *attr, const char *buf, size_t size)
55{ 55{
56 struct led_classdev *led_cdev = dev_get_drvdata(dev); 56 struct led_classdev *led_cdev = led_trigger_get_led(dev);
57 unsigned long state; 57 unsigned long state;
58 ssize_t ret = -EINVAL; 58 ssize_t ret = -EINVAL;
59 59
@@ -70,39 +70,23 @@ static ssize_t led_delay_off_store(struct device *dev,
70static DEVICE_ATTR(delay_on, 0644, led_delay_on_show, led_delay_on_store); 70static DEVICE_ATTR(delay_on, 0644, led_delay_on_show, led_delay_on_store);
71static DEVICE_ATTR(delay_off, 0644, led_delay_off_show, led_delay_off_store); 71static DEVICE_ATTR(delay_off, 0644, led_delay_off_show, led_delay_off_store);
72 72
73static struct attribute *timer_trig_attrs[] = {
74 &dev_attr_delay_on.attr,
75 &dev_attr_delay_off.attr,
76 NULL
77};
78ATTRIBUTE_GROUPS(timer_trig);
79
73static int timer_trig_activate(struct led_classdev *led_cdev) 80static int timer_trig_activate(struct led_classdev *led_cdev)
74{ 81{
75 int rc;
76
77 led_cdev->trigger_data = NULL;
78
79 rc = device_create_file(led_cdev->dev, &dev_attr_delay_on);
80 if (rc)
81 return 0;
82 rc = device_create_file(led_cdev->dev, &dev_attr_delay_off);
83 if (rc)
84 goto err_out_delayon;
85
86 led_blink_set(led_cdev, &led_cdev->blink_delay_on, 82 led_blink_set(led_cdev, &led_cdev->blink_delay_on,
87 &led_cdev->blink_delay_off); 83 &led_cdev->blink_delay_off);
88 led_cdev->activated = true;
89
90 return 0;
91
92err_out_delayon:
93 device_remove_file(led_cdev->dev, &dev_attr_delay_on);
94 84
95 return 0; 85 return 0;
96} 86}
97 87
98static void timer_trig_deactivate(struct led_classdev *led_cdev) 88static void timer_trig_deactivate(struct led_classdev *led_cdev)
99{ 89{
100 if (led_cdev->activated) {
101 device_remove_file(led_cdev->dev, &dev_attr_delay_on);
102 device_remove_file(led_cdev->dev, &dev_attr_delay_off);
103 led_cdev->activated = false;
104 }
105
106 /* Stop blinking */ 90 /* Stop blinking */
107 led_set_brightness(led_cdev, LED_OFF); 91 led_set_brightness(led_cdev, LED_OFF);
108} 92}
@@ -111,20 +95,9 @@ static struct led_trigger timer_led_trigger = {
111 .name = "timer", 95 .name = "timer",
112 .activate = timer_trig_activate, 96 .activate = timer_trig_activate,
113 .deactivate = timer_trig_deactivate, 97 .deactivate = timer_trig_deactivate,
98 .groups = timer_trig_groups,
114}; 99};
115 100module_led_trigger(timer_led_trigger);
116static int __init timer_trig_init(void)
117{
118 return led_trigger_register(&timer_led_trigger);
119}
120
121static void __exit timer_trig_exit(void)
122{
123 led_trigger_unregister(&timer_led_trigger);
124}
125
126module_init(timer_trig_init);
127module_exit(timer_trig_exit);
128 101
129MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>"); 102MODULE_AUTHOR("Richard Purdie <rpurdie@openedhand.com>");
130MODULE_DESCRIPTION("Timer LED trigger"); 103MODULE_DESCRIPTION("Timer LED trigger");