aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2018-07-02 16:05:29 -0400
committerJacek Anaszewski <jacek.anaszewski@gmail.com>2018-07-05 17:21:13 -0400
commit81d5533297fb672012bb298c1f7545f9c168ccb0 (patch)
tree095e181b2ca8d515f5b051cb81c414f70d4eb821
parent823f786ac7615f1bf822227fc4cbeafe11fb6bf8 (diff)
leds: oneshot 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 .activated can go away in .deactivate(). Also make use of module_led_trigger() and do some minor coding style improvements. 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-oneshot.c89
1 files changed, 26 insertions, 63 deletions
diff --git a/drivers/leds/trigger/ledtrig-oneshot.c b/drivers/leds/trigger/ledtrig-oneshot.c
index 7bbf92bd7f80..95c9be4b6e7e 100644
--- a/drivers/leds/trigger/ledtrig-oneshot.c
+++ b/drivers/leds/trigger/ledtrig-oneshot.c
@@ -8,7 +8,6 @@
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as 9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation. 10 * published by the Free Software Foundation.
11 *
12 */ 11 */
13 12
14#include <linux/module.h> 13#include <linux/module.h>
@@ -29,8 +28,8 @@ struct oneshot_trig_data {
29static ssize_t led_shot(struct device *dev, 28static ssize_t led_shot(struct device *dev,
30 struct device_attribute *attr, const char *buf, size_t size) 29 struct device_attribute *attr, const char *buf, size_t size)
31{ 30{
32 struct led_classdev *led_cdev = dev_get_drvdata(dev); 31 struct led_classdev *led_cdev = led_trigger_get_led(dev);
33 struct oneshot_trig_data *oneshot_data = led_cdev->trigger_data; 32 struct oneshot_trig_data *oneshot_data = led_trigger_get_drvdata(dev);
34 33
35 led_blink_set_oneshot(led_cdev, 34 led_blink_set_oneshot(led_cdev,
36 &led_cdev->blink_delay_on, &led_cdev->blink_delay_off, 35 &led_cdev->blink_delay_on, &led_cdev->blink_delay_off,
@@ -42,8 +41,7 @@ static ssize_t led_shot(struct device *dev,
42static ssize_t led_invert_show(struct device *dev, 41static ssize_t led_invert_show(struct device *dev,
43 struct device_attribute *attr, char *buf) 42 struct device_attribute *attr, char *buf)
44{ 43{
45 struct led_classdev *led_cdev = dev_get_drvdata(dev); 44 struct oneshot_trig_data *oneshot_data = led_trigger_get_drvdata(dev);
46 struct oneshot_trig_data *oneshot_data = led_cdev->trigger_data;
47 45
48 return sprintf(buf, "%u\n", oneshot_data->invert); 46 return sprintf(buf, "%u\n", oneshot_data->invert);
49} 47}
@@ -51,8 +49,8 @@ static ssize_t led_invert_show(struct device *dev,
51static ssize_t led_invert_store(struct device *dev, 49static ssize_t led_invert_store(struct device *dev,
52 struct device_attribute *attr, const char *buf, size_t size) 50 struct device_attribute *attr, const char *buf, size_t size)
53{ 51{
54 struct led_classdev *led_cdev = dev_get_drvdata(dev); 52 struct led_classdev *led_cdev = led_trigger_get_led(dev);
55 struct oneshot_trig_data *oneshot_data = led_cdev->trigger_data; 53 struct oneshot_trig_data *oneshot_data = led_trigger_get_drvdata(dev);
56 unsigned long state; 54 unsigned long state;
57 int ret; 55 int ret;
58 56
@@ -73,7 +71,7 @@ static ssize_t led_invert_store(struct device *dev,
73static ssize_t led_delay_on_show(struct device *dev, 71static ssize_t led_delay_on_show(struct device *dev,
74 struct device_attribute *attr, char *buf) 72 struct device_attribute *attr, char *buf)
75{ 73{
76 struct led_classdev *led_cdev = dev_get_drvdata(dev); 74 struct led_classdev *led_cdev = led_trigger_get_led(dev);
77 75
78 return sprintf(buf, "%lu\n", led_cdev->blink_delay_on); 76 return sprintf(buf, "%lu\n", led_cdev->blink_delay_on);
79} 77}
@@ -81,7 +79,7 @@ static ssize_t led_delay_on_show(struct device *dev,
81static ssize_t led_delay_on_store(struct device *dev, 79static ssize_t led_delay_on_store(struct device *dev,
82 struct device_attribute *attr, const char *buf, size_t size) 80 struct device_attribute *attr, const char *buf, size_t size)
83{ 81{
84 struct led_classdev *led_cdev = dev_get_drvdata(dev); 82 struct led_classdev *led_cdev = led_trigger_get_led(dev);
85 unsigned long state; 83 unsigned long state;
86 int ret; 84 int ret;
87 85
@@ -93,10 +91,11 @@ static ssize_t led_delay_on_store(struct device *dev,
93 91
94 return size; 92 return size;
95} 93}
94
96static ssize_t led_delay_off_show(struct device *dev, 95static ssize_t led_delay_off_show(struct device *dev,
97 struct device_attribute *attr, char *buf) 96 struct device_attribute *attr, char *buf)
98{ 97{
99 struct led_classdev *led_cdev = dev_get_drvdata(dev); 98 struct led_classdev *led_cdev = led_trigger_get_led(dev);
100 99
101 return sprintf(buf, "%lu\n", led_cdev->blink_delay_off); 100 return sprintf(buf, "%lu\n", led_cdev->blink_delay_off);
102} 101}
@@ -104,7 +103,7 @@ static ssize_t led_delay_off_show(struct device *dev,
104static ssize_t led_delay_off_store(struct device *dev, 103static ssize_t led_delay_off_store(struct device *dev,
105 struct device_attribute *attr, const char *buf, size_t size) 104 struct device_attribute *attr, const char *buf, size_t size)
106{ 105{
107 struct led_classdev *led_cdev = dev_get_drvdata(dev); 106 struct led_classdev *led_cdev = led_trigger_get_led(dev);
108 unsigned long state; 107 unsigned long state;
109 int ret; 108 int ret;
110 109
@@ -122,61 +121,36 @@ static DEVICE_ATTR(delay_off, 0644, led_delay_off_show, led_delay_off_store);
122static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store); 121static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store);
123static DEVICE_ATTR(shot, 0200, NULL, led_shot); 122static DEVICE_ATTR(shot, 0200, NULL, led_shot);
124 123
124static struct attribute *oneshot_trig_attrs[] = {
125 &dev_attr_delay_on.attr,
126 &dev_attr_delay_off.attr,
127 &dev_attr_invert.attr,
128 &dev_attr_shot.attr,
129 NULL
130};
131ATTRIBUTE_GROUPS(oneshot_trig);
132
125static int oneshot_trig_activate(struct led_classdev *led_cdev) 133static int oneshot_trig_activate(struct led_classdev *led_cdev)
126{ 134{
127 struct oneshot_trig_data *oneshot_data; 135 struct oneshot_trig_data *oneshot_data;
128 int rc;
129 136
130 oneshot_data = kzalloc(sizeof(*oneshot_data), GFP_KERNEL); 137 oneshot_data = kzalloc(sizeof(*oneshot_data), GFP_KERNEL);
131 if (!oneshot_data) 138 if (!oneshot_data)
132 return 0; 139 return -ENOMEM;
133 140
134 led_cdev->trigger_data = oneshot_data; 141 led_set_trigger_data(led_cdev, oneshot_data);
135
136 rc = device_create_file(led_cdev->dev, &dev_attr_delay_on);
137 if (rc)
138 goto err_out_trig_data;
139 rc = device_create_file(led_cdev->dev, &dev_attr_delay_off);
140 if (rc)
141 goto err_out_delayon;
142 rc = device_create_file(led_cdev->dev, &dev_attr_invert);
143 if (rc)
144 goto err_out_delayoff;
145 rc = device_create_file(led_cdev->dev, &dev_attr_shot);
146 if (rc)
147 goto err_out_invert;
148 142
149 led_cdev->blink_delay_on = DEFAULT_DELAY; 143 led_cdev->blink_delay_on = DEFAULT_DELAY;
150 led_cdev->blink_delay_off = DEFAULT_DELAY; 144 led_cdev->blink_delay_off = DEFAULT_DELAY;
151 145
152 led_cdev->activated = true;
153
154 return 0;
155
156err_out_invert:
157 device_remove_file(led_cdev->dev, &dev_attr_invert);
158err_out_delayoff:
159 device_remove_file(led_cdev->dev, &dev_attr_delay_off);
160err_out_delayon:
161 device_remove_file(led_cdev->dev, &dev_attr_delay_on);
162err_out_trig_data:
163 kfree(led_cdev->trigger_data);
164
165 return 0; 146 return 0;
166} 147}
167 148
168static void oneshot_trig_deactivate(struct led_classdev *led_cdev) 149static void oneshot_trig_deactivate(struct led_classdev *led_cdev)
169{ 150{
170 struct oneshot_trig_data *oneshot_data = led_cdev->trigger_data; 151 struct oneshot_trig_data *oneshot_data = led_get_trigger_data(led_cdev);
171 152
172 if (led_cdev->activated) { 153 kfree(oneshot_data);
173 device_remove_file(led_cdev->dev, &dev_attr_delay_on);
174 device_remove_file(led_cdev->dev, &dev_attr_delay_off);
175 device_remove_file(led_cdev->dev, &dev_attr_invert);
176 device_remove_file(led_cdev->dev, &dev_attr_shot);
177 kfree(oneshot_data);
178 led_cdev->activated = false;
179 }
180 154
181 /* Stop blinking */ 155 /* Stop blinking */
182 led_set_brightness(led_cdev, LED_OFF); 156 led_set_brightness(led_cdev, LED_OFF);
@@ -186,20 +160,9 @@ static struct led_trigger oneshot_led_trigger = {
186 .name = "oneshot", 160 .name = "oneshot",
187 .activate = oneshot_trig_activate, 161 .activate = oneshot_trig_activate,
188 .deactivate = oneshot_trig_deactivate, 162 .deactivate = oneshot_trig_deactivate,
163 .groups = oneshot_trig_groups,
189}; 164};
190 165module_led_trigger(oneshot_led_trigger);
191static int __init oneshot_trig_init(void)
192{
193 return led_trigger_register(&oneshot_led_trigger);
194}
195
196static void __exit oneshot_trig_exit(void)
197{
198 led_trigger_unregister(&oneshot_led_trigger);
199}
200
201module_init(oneshot_trig_init);
202module_exit(oneshot_trig_exit);
203 166
204MODULE_AUTHOR("Fabio Baltieri <fabio.baltieri@gmail.com>"); 167MODULE_AUTHOR("Fabio Baltieri <fabio.baltieri@gmail.com>");
205MODULE_DESCRIPTION("One-shot LED trigger"); 168MODULE_DESCRIPTION("One-shot LED trigger");