| .. | .. |
|---|
| 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 | } |
|---|