.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * One-shot LED Trigger |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright 2012, Fabio Baltieri <fabio.baltieri@gmail.com> |
---|
5 | 6 | * |
---|
6 | 7 | * Based on ledtrig-timer.c by Richard Purdie <rpurdie@openedhand.com> |
---|
7 | | - * |
---|
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 |
---|
10 | | - * published by the Free Software Foundation. |
---|
11 | 8 | */ |
---|
12 | 9 | |
---|
13 | 10 | #include <linux/module.h> |
---|
.. | .. |
---|
130 | 127 | }; |
---|
131 | 128 | ATTRIBUTE_GROUPS(oneshot_trig); |
---|
132 | 129 | |
---|
| 130 | +static void pattern_init(struct led_classdev *led_cdev) |
---|
| 131 | +{ |
---|
| 132 | + u32 *pattern; |
---|
| 133 | + unsigned int size = 0; |
---|
| 134 | + |
---|
| 135 | + pattern = led_get_default_pattern(led_cdev, &size); |
---|
| 136 | + if (!pattern) |
---|
| 137 | + goto out_default; |
---|
| 138 | + |
---|
| 139 | + if (size != 2) { |
---|
| 140 | + dev_warn(led_cdev->dev, |
---|
| 141 | + "Expected 2 but got %u values for delays pattern\n", |
---|
| 142 | + size); |
---|
| 143 | + goto out_default; |
---|
| 144 | + } |
---|
| 145 | + |
---|
| 146 | + led_cdev->blink_delay_on = pattern[0]; |
---|
| 147 | + led_cdev->blink_delay_off = pattern[1]; |
---|
| 148 | + kfree(pattern); |
---|
| 149 | + |
---|
| 150 | + return; |
---|
| 151 | + |
---|
| 152 | +out_default: |
---|
| 153 | + kfree(pattern); |
---|
| 154 | + led_cdev->blink_delay_on = DEFAULT_DELAY; |
---|
| 155 | + led_cdev->blink_delay_off = DEFAULT_DELAY; |
---|
| 156 | +} |
---|
| 157 | + |
---|
133 | 158 | static int oneshot_trig_activate(struct led_classdev *led_cdev) |
---|
134 | 159 | { |
---|
135 | 160 | struct oneshot_trig_data *oneshot_data; |
---|
.. | .. |
---|
140 | 165 | |
---|
141 | 166 | led_set_trigger_data(led_cdev, oneshot_data); |
---|
142 | 167 | |
---|
143 | | - led_cdev->blink_delay_on = DEFAULT_DELAY; |
---|
144 | | - led_cdev->blink_delay_off = DEFAULT_DELAY; |
---|
| 168 | + if (led_cdev->flags & LED_INIT_DEFAULT_TRIGGER) { |
---|
| 169 | + pattern_init(led_cdev); |
---|
| 170 | + /* |
---|
| 171 | + * Mark as initialized even on pattern_init() error because |
---|
| 172 | + * any consecutive call to it would produce the same error. |
---|
| 173 | + */ |
---|
| 174 | + led_cdev->flags &= ~LED_INIT_DEFAULT_TRIGGER; |
---|
| 175 | + } |
---|
145 | 176 | |
---|
146 | 177 | return 0; |
---|
147 | 178 | } |
---|