aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2018-07-02 16:05:32 -0400
committerJacek Anaszewski <jacek.anaszewski@gmail.com>2018-07-05 17:21:14 -0400
commit13d698cbd99ce90f1d6b4fb0ff11ab90eb55f55e (patch)
treea7f57248e44e524c976b5a395e5e93a8731ef1b3
parent5cccc555108b602f92101a939143925095ff9b1d (diff)
leds: activity 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 the accessor function to get and set trigger_data. 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-activity.c38
1 files changed, 16 insertions, 22 deletions
diff --git a/drivers/leds/trigger/ledtrig-activity.c b/drivers/leds/trigger/ledtrig-activity.c
index 2fc065fb1754..bcbf41c90c30 100644
--- a/drivers/leds/trigger/ledtrig-activity.c
+++ b/drivers/leds/trigger/ledtrig-activity.c
@@ -152,8 +152,7 @@ static void led_activity_function(struct timer_list *t)
152static ssize_t led_invert_show(struct device *dev, 152static ssize_t led_invert_show(struct device *dev,
153 struct device_attribute *attr, char *buf) 153 struct device_attribute *attr, char *buf)
154{ 154{
155 struct led_classdev *led_cdev = dev_get_drvdata(dev); 155 struct activity_data *activity_data = led_trigger_get_drvdata(dev);
156 struct activity_data *activity_data = led_cdev->trigger_data;
157 156
158 return sprintf(buf, "%u\n", activity_data->invert); 157 return sprintf(buf, "%u\n", activity_data->invert);
159} 158}
@@ -162,8 +161,7 @@ static ssize_t led_invert_store(struct device *dev,
162 struct device_attribute *attr, 161 struct device_attribute *attr,
163 const char *buf, size_t size) 162 const char *buf, size_t size)
164{ 163{
165 struct led_classdev *led_cdev = dev_get_drvdata(dev); 164 struct activity_data *activity_data = led_trigger_get_drvdata(dev);
166 struct activity_data *activity_data = led_cdev->trigger_data;
167 unsigned long state; 165 unsigned long state;
168 int ret; 166 int ret;
169 167
@@ -178,21 +176,21 @@ static ssize_t led_invert_store(struct device *dev,
178 176
179static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store); 177static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store);
180 178
179static struct attribute *activity_led_attrs[] = {
180 &dev_attr_invert.attr,
181 NULL
182};
183ATTRIBUTE_GROUPS(activity_led);
184
181static int activity_activate(struct led_classdev *led_cdev) 185static int activity_activate(struct led_classdev *led_cdev)
182{ 186{
183 struct activity_data *activity_data; 187 struct activity_data *activity_data;
184 int rc;
185 188
186 activity_data = kzalloc(sizeof(*activity_data), GFP_KERNEL); 189 activity_data = kzalloc(sizeof(*activity_data), GFP_KERNEL);
187 if (!activity_data) 190 if (!activity_data)
188 return 0; 191 return -ENOMEM;
189 192
190 led_cdev->trigger_data = activity_data; 193 led_set_trigger_data(led_cdev, activity_data);
191 rc = device_create_file(led_cdev->dev, &dev_attr_invert);
192 if (rc) {
193 kfree(led_cdev->trigger_data);
194 return 0;
195 }
196 194
197 activity_data->led_cdev = led_cdev; 195 activity_data->led_cdev = led_cdev;
198 timer_setup(&activity_data->timer, led_activity_function, 0); 196 timer_setup(&activity_data->timer, led_activity_function, 0);
@@ -200,28 +198,24 @@ static int activity_activate(struct led_classdev *led_cdev)
200 led_cdev->blink_brightness = led_cdev->max_brightness; 198 led_cdev->blink_brightness = led_cdev->max_brightness;
201 led_activity_function(&activity_data->timer); 199 led_activity_function(&activity_data->timer);
202 set_bit(LED_BLINK_SW, &led_cdev->work_flags); 200 set_bit(LED_BLINK_SW, &led_cdev->work_flags);
203 led_cdev->activated = true;
204 201
205 return 0; 202 return 0;
206} 203}
207 204
208static void activity_deactivate(struct led_classdev *led_cdev) 205static void activity_deactivate(struct led_classdev *led_cdev)
209{ 206{
210 struct activity_data *activity_data = led_cdev->trigger_data; 207 struct activity_data *activity_data = led_get_trigger_data(led_cdev);
211 208
212 if (led_cdev->activated) { 209 del_timer_sync(&activity_data->timer);
213 del_timer_sync(&activity_data->timer); 210 kfree(activity_data);
214 device_remove_file(led_cdev->dev, &dev_attr_invert); 211 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
215 kfree(activity_data);
216 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
217 led_cdev->activated = false;
218 }
219} 212}
220 213
221static struct led_trigger activity_led_trigger = { 214static struct led_trigger activity_led_trigger = {
222 .name = "activity", 215 .name = "activity",
223 .activate = activity_activate, 216 .activate = activity_activate,
224 .deactivate = activity_deactivate, 217 .deactivate = activity_deactivate,
218 .groups = activity_led_groups,
225}; 219};
226 220
227static int activity_reboot_notifier(struct notifier_block *nb, 221static int activity_reboot_notifier(struct notifier_block *nb,