leds: transient trigger: simplifications from core changes
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Mon, 2 Jul 2018 20:05:28 +0000 (22:05 +0200)
committerJacek Anaszewski <jacek.anaszewski@gmail.com>
Thu, 5 Jul 2018 21:21:12 +0000 (23:21 +0200)
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.

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>
drivers/leds/trigger/ledtrig-transient.c

index a55fc58179a97d6cd88db6f76a2c72144dda10fc..a80bb82aacc2b6f0a8eba7c40a2fff5128017bc4 100644 (file)
@@ -42,8 +42,8 @@ static void transient_timer_function(struct timer_list *t)
 static ssize_t transient_activate_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct led_classdev *led_cdev = dev_get_drvdata(dev);
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct transient_trig_data *transient_data =
+               led_trigger_get_drvdata(dev);
 
        return sprintf(buf, "%d\n", transient_data->activate);
 }
@@ -51,8 +51,9 @@ static ssize_t transient_activate_show(struct device *dev,
 static ssize_t transient_activate_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
 {
-       struct led_classdev *led_cdev = dev_get_drvdata(dev);
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct led_classdev *led_cdev = led_trigger_get_led(dev);
+       struct transient_trig_data *transient_data =
+               led_trigger_get_drvdata(dev);
        unsigned long state;
        ssize_t ret;
 
@@ -94,8 +95,7 @@ static ssize_t transient_activate_store(struct device *dev,
 static ssize_t transient_duration_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct led_classdev *led_cdev = dev_get_drvdata(dev);
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct transient_trig_data *transient_data = led_trigger_get_drvdata(dev);
 
        return sprintf(buf, "%lu\n", transient_data->duration);
 }
@@ -103,8 +103,8 @@ static ssize_t transient_duration_show(struct device *dev,
 static ssize_t transient_duration_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
 {
-       struct led_classdev *led_cdev = dev_get_drvdata(dev);
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct transient_trig_data *transient_data =
+               led_trigger_get_drvdata(dev);
        unsigned long state;
        ssize_t ret;
 
@@ -119,8 +119,8 @@ static ssize_t transient_duration_store(struct device *dev,
 static ssize_t transient_state_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
-       struct led_classdev *led_cdev = dev_get_drvdata(dev);
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct transient_trig_data *transient_data =
+               led_trigger_get_drvdata(dev);
        int state;
 
        state = (transient_data->state == LED_FULL) ? 1 : 0;
@@ -130,8 +130,8 @@ static ssize_t transient_state_show(struct device *dev,
 static ssize_t transient_state_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
 {
-       struct led_classdev *led_cdev = dev_get_drvdata(dev);
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct transient_trig_data *transient_data =
+               led_trigger_get_drvdata(dev);
        unsigned long state;
        ssize_t ret;
 
@@ -152,84 +152,46 @@ static DEVICE_ATTR(duration, 0644, transient_duration_show,
                   transient_duration_store);
 static DEVICE_ATTR(state, 0644, transient_state_show, transient_state_store);
 
+static struct attribute *transient_trig_attrs[] = {
+       &dev_attr_activate.attr,
+       &dev_attr_duration.attr,
+       &dev_attr_state.attr,
+       NULL
+};
+ATTRIBUTE_GROUPS(transient_trig);
+
 static int transient_trig_activate(struct led_classdev *led_cdev)
 {
-       int rc;
        struct transient_trig_data *tdata;
 
        tdata = kzalloc(sizeof(struct transient_trig_data), GFP_KERNEL);
-       if (!tdata) {
-               dev_err(led_cdev->dev,
-                       "unable to allocate transient trigger\n");
-               return 0;
-       }
-       led_cdev->trigger_data = tdata;
-       tdata->led_cdev = led_cdev;
-
-       rc = device_create_file(led_cdev->dev, &dev_attr_activate);
-       if (rc)
-               goto err_out;
+       if (!tdata)
+               return -ENOMEM;
 
-       rc = device_create_file(led_cdev->dev, &dev_attr_duration);
-       if (rc)
-               goto err_out_duration;
-
-       rc = device_create_file(led_cdev->dev, &dev_attr_state);
-       if (rc)
-               goto err_out_state;
+       led_set_trigger_data(led_cdev, tdata);
+       tdata->led_cdev = led_cdev;
 
        timer_setup(&tdata->timer, transient_timer_function, 0);
-       led_cdev->activated = true;
-
-       return 0;
-
-err_out_state:
-       device_remove_file(led_cdev->dev, &dev_attr_duration);
-err_out_duration:
-       device_remove_file(led_cdev->dev, &dev_attr_activate);
-err_out:
-       dev_err(led_cdev->dev, "unable to register transient trigger\n");
-       led_cdev->trigger_data = NULL;
-       kfree(tdata);
 
        return 0;
 }
 
 static void transient_trig_deactivate(struct led_classdev *led_cdev)
 {
-       struct transient_trig_data *transient_data = led_cdev->trigger_data;
+       struct transient_trig_data *transient_data = led_get_trigger_data(led_cdev);
 
-       if (led_cdev->activated) {
-               del_timer_sync(&transient_data->timer);
-               led_set_brightness_nosleep(led_cdev,
-                                       transient_data->restore_state);
-               device_remove_file(led_cdev->dev, &dev_attr_activate);
-               device_remove_file(led_cdev->dev, &dev_attr_duration);
-               device_remove_file(led_cdev->dev, &dev_attr_state);
-               led_cdev->trigger_data = NULL;
-               led_cdev->activated = false;
-               kfree(transient_data);
-       }
+       del_timer_sync(&transient_data->timer);
+       led_set_brightness_nosleep(led_cdev, transient_data->restore_state);
+       kfree(transient_data);
 }
 
 static struct led_trigger transient_trigger = {
        .name     = "transient",
        .activate = transient_trig_activate,
        .deactivate = transient_trig_deactivate,
+       .groups = transient_trig_groups,
 };
-
-static int __init transient_trig_init(void)
-{
-       return led_trigger_register(&transient_trigger);
-}
-
-static void __exit transient_trig_exit(void)
-{
-       led_trigger_unregister(&transient_trigger);
-}
-
-module_init(transient_trig_init);
-module_exit(transient_trig_exit);
+module_led_trigger(transient_trigger);
 
 MODULE_AUTHOR("Shuah Khan <shuahkhan@gmail.com>");
 MODULE_DESCRIPTION("Transient LED trigger");