aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2018-07-02 16:05:30 -0400
committerJacek Anaszewski <jacek.anaszewski@gmail.com>2018-07-05 17:21:13 -0400
commit71c4af71e597f429d37c89f5db2e44c59c8ba88c (patch)
tree914e461a2fad66a9963d024aab595cf95d15a999
parent81d5533297fb672012bb298c1f7545f9c168ccb0 (diff)
leds: heartbeat 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-heartbeat.c41
1 files changed, 19 insertions, 22 deletions
diff --git a/drivers/leds/trigger/ledtrig-heartbeat.c b/drivers/leds/trigger/ledtrig-heartbeat.c
index 03a8dfce8fb9..7a2b12e19329 100644
--- a/drivers/leds/trigger/ledtrig-heartbeat.c
+++ b/drivers/leds/trigger/ledtrig-heartbeat.c
@@ -96,8 +96,8 @@ static void led_heartbeat_function(struct timer_list *t)
96static ssize_t led_invert_show(struct device *dev, 96static ssize_t led_invert_show(struct device *dev,
97 struct device_attribute *attr, char *buf) 97 struct device_attribute *attr, char *buf)
98{ 98{
99 struct led_classdev *led_cdev = dev_get_drvdata(dev); 99 struct heartbeat_trig_data *heartbeat_data =
100 struct heartbeat_trig_data *heartbeat_data = led_cdev->trigger_data; 100 led_trigger_get_drvdata(dev);
101 101
102 return sprintf(buf, "%u\n", heartbeat_data->invert); 102 return sprintf(buf, "%u\n", heartbeat_data->invert);
103} 103}
@@ -105,8 +105,8 @@ static ssize_t led_invert_show(struct device *dev,
105static ssize_t led_invert_store(struct device *dev, 105static ssize_t led_invert_store(struct device *dev,
106 struct device_attribute *attr, const char *buf, size_t size) 106 struct device_attribute *attr, const char *buf, size_t size)
107{ 107{
108 struct led_classdev *led_cdev = dev_get_drvdata(dev); 108 struct heartbeat_trig_data *heartbeat_data =
109 struct heartbeat_trig_data *heartbeat_data = led_cdev->trigger_data; 109 led_trigger_get_drvdata(dev);
110 unsigned long state; 110 unsigned long state;
111 int ret; 111 int ret;
112 112
@@ -121,22 +121,22 @@ static ssize_t led_invert_store(struct device *dev,
121 121
122static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store); 122static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store);
123 123
124static struct attribute *heartbeat_trig_attrs[] = {
125 &dev_attr_invert.attr,
126 NULL
127};
128ATTRIBUTE_GROUPS(heartbeat_trig);
129
124static int heartbeat_trig_activate(struct led_classdev *led_cdev) 130static int heartbeat_trig_activate(struct led_classdev *led_cdev)
125{ 131{
126 struct heartbeat_trig_data *heartbeat_data; 132 struct heartbeat_trig_data *heartbeat_data;
127 int rc;
128 133
129 heartbeat_data = kzalloc(sizeof(*heartbeat_data), GFP_KERNEL); 134 heartbeat_data = kzalloc(sizeof(*heartbeat_data), GFP_KERNEL);
130 if (!heartbeat_data) 135 if (!heartbeat_data)
131 return 0; 136 return -ENOMEM;
132 137
133 led_cdev->trigger_data = heartbeat_data; 138 led_set_trigger_data(led_cdev, heartbeat_data);
134 heartbeat_data->led_cdev = led_cdev; 139 heartbeat_data->led_cdev = led_cdev;
135 rc = device_create_file(led_cdev->dev, &dev_attr_invert);
136 if (rc) {
137 kfree(led_cdev->trigger_data);
138 return 0;
139 }
140 140
141 timer_setup(&heartbeat_data->timer, led_heartbeat_function, 0); 141 timer_setup(&heartbeat_data->timer, led_heartbeat_function, 0);
142 heartbeat_data->phase = 0; 142 heartbeat_data->phase = 0;
@@ -144,28 +144,25 @@ static int heartbeat_trig_activate(struct led_classdev *led_cdev)
144 led_cdev->blink_brightness = led_cdev->max_brightness; 144 led_cdev->blink_brightness = led_cdev->max_brightness;
145 led_heartbeat_function(&heartbeat_data->timer); 145 led_heartbeat_function(&heartbeat_data->timer);
146 set_bit(LED_BLINK_SW, &led_cdev->work_flags); 146 set_bit(LED_BLINK_SW, &led_cdev->work_flags);
147 led_cdev->activated = true;
148 147
149 return 0; 148 return 0;
150} 149}
151 150
152static void heartbeat_trig_deactivate(struct led_classdev *led_cdev) 151static void heartbeat_trig_deactivate(struct led_classdev *led_cdev)
153{ 152{
154 struct heartbeat_trig_data *heartbeat_data = led_cdev->trigger_data; 153 struct heartbeat_trig_data *heartbeat_data =
155 154 led_get_trigger_data(led_cdev);
156 if (led_cdev->activated) { 155
157 del_timer_sync(&heartbeat_data->timer); 156 del_timer_sync(&heartbeat_data->timer);
158 device_remove_file(led_cdev->dev, &dev_attr_invert); 157 kfree(heartbeat_data);
159 kfree(heartbeat_data); 158 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
160 clear_bit(LED_BLINK_SW, &led_cdev->work_flags);
161 led_cdev->activated = false;
162 }
163} 159}
164 160
165static struct led_trigger heartbeat_led_trigger = { 161static struct led_trigger heartbeat_led_trigger = {
166 .name = "heartbeat", 162 .name = "heartbeat",
167 .activate = heartbeat_trig_activate, 163 .activate = heartbeat_trig_activate,
168 .deactivate = heartbeat_trig_deactivate, 164 .deactivate = heartbeat_trig_deactivate,
165 .groups = heartbeat_trig_groups,
169}; 166};
170 167
171static int heartbeat_reboot_notifier(struct notifier_block *nb, 168static int heartbeat_reboot_notifier(struct notifier_block *nb,