diff options
author | Kees Cook <keescook@chromium.org> | 2017-10-04 20:49:34 -0400 |
---|---|---|
committer | Jacek Anaszewski <jacek.anaszewski@gmail.com> | 2017-10-06 15:39:21 -0400 |
commit | 26c7d6a321da64b49c38fffd827377fd8eb2379c (patch) | |
tree | dec88d54bbe25ee5ae367c2c7b9bfc45447d57a4 /drivers/leds/trigger | |
parent | 55edd1dad96b760c87f5b9e2c461ba551a625f44 (diff) |
leds: ledtrig-heartbeat: Convert timers to use timer_setup()
Instead of using .data directly, convert to from_timer. Since the
trigger_data is allocated separately, the led_cdev must be explicitly
tracked for the callback.
Cc: Richard Purdie <rpurdie@rpsys.net>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Zhang Bo <bo.zhang@nxp.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: linux-leds@vger.kernel.org
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
Diffstat (limited to 'drivers/leds/trigger')
-rw-r--r-- | drivers/leds/trigger/ledtrig-heartbeat.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/leds/trigger/ledtrig-heartbeat.c b/drivers/leds/trigger/ledtrig-heartbeat.c index e95ea65380c8..f0896de410b8 100644 --- a/drivers/leds/trigger/ledtrig-heartbeat.c +++ b/drivers/leds/trigger/ledtrig-heartbeat.c | |||
@@ -25,19 +25,23 @@ | |||
25 | static int panic_heartbeats; | 25 | static int panic_heartbeats; |
26 | 26 | ||
27 | struct heartbeat_trig_data { | 27 | struct heartbeat_trig_data { |
28 | struct led_classdev *led_cdev; | ||
28 | unsigned int phase; | 29 | unsigned int phase; |
29 | unsigned int period; | 30 | unsigned int period; |
30 | struct timer_list timer; | 31 | struct timer_list timer; |
31 | unsigned int invert; | 32 | unsigned int invert; |
32 | }; | 33 | }; |
33 | 34 | ||
34 | static void led_heartbeat_function(unsigned long data) | 35 | static void led_heartbeat_function(struct timer_list *t) |
35 | { | 36 | { |
36 | struct led_classdev *led_cdev = (struct led_classdev *) data; | 37 | struct heartbeat_trig_data *heartbeat_data = |
37 | struct heartbeat_trig_data *heartbeat_data = led_cdev->trigger_data; | 38 | from_timer(heartbeat_data, t, timer); |
39 | struct led_classdev *led_cdev; | ||
38 | unsigned long brightness = LED_OFF; | 40 | unsigned long brightness = LED_OFF; |
39 | unsigned long delay = 0; | 41 | unsigned long delay = 0; |
40 | 42 | ||
43 | led_cdev = heartbeat_data->led_cdev; | ||
44 | |||
41 | if (unlikely(panic_heartbeats)) { | 45 | if (unlikely(panic_heartbeats)) { |
42 | led_set_brightness_nosleep(led_cdev, LED_OFF); | 46 | led_set_brightness_nosleep(led_cdev, LED_OFF); |
43 | return; | 47 | return; |
@@ -127,18 +131,18 @@ static void heartbeat_trig_activate(struct led_classdev *led_cdev) | |||
127 | return; | 131 | return; |
128 | 132 | ||
129 | led_cdev->trigger_data = heartbeat_data; | 133 | led_cdev->trigger_data = heartbeat_data; |
134 | heartbeat_data->led_cdev = led_cdev; | ||
130 | rc = device_create_file(led_cdev->dev, &dev_attr_invert); | 135 | rc = device_create_file(led_cdev->dev, &dev_attr_invert); |
131 | if (rc) { | 136 | if (rc) { |
132 | kfree(led_cdev->trigger_data); | 137 | kfree(led_cdev->trigger_data); |
133 | return; | 138 | return; |
134 | } | 139 | } |
135 | 140 | ||
136 | setup_timer(&heartbeat_data->timer, | 141 | timer_setup(&heartbeat_data->timer, led_heartbeat_function, 0); |
137 | led_heartbeat_function, (unsigned long) led_cdev); | ||
138 | heartbeat_data->phase = 0; | 142 | heartbeat_data->phase = 0; |
139 | if (!led_cdev->blink_brightness) | 143 | if (!led_cdev->blink_brightness) |
140 | led_cdev->blink_brightness = led_cdev->max_brightness; | 144 | led_cdev->blink_brightness = led_cdev->max_brightness; |
141 | led_heartbeat_function(heartbeat_data->timer.data); | 145 | led_heartbeat_function(&heartbeat_data->timer); |
142 | set_bit(LED_BLINK_SW, &led_cdev->work_flags); | 146 | set_bit(LED_BLINK_SW, &led_cdev->work_flags); |
143 | led_cdev->activated = true; | 147 | led_cdev->activated = true; |
144 | } | 148 | } |