diff options
Diffstat (limited to 'drivers/leds/trigger/ledtrig-pattern.c')
-rw-r--r-- | drivers/leds/trigger/ledtrig-pattern.c | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/drivers/leds/trigger/ledtrig-pattern.c b/drivers/leds/trigger/ledtrig-pattern.c index ce7acd115dd8..1870cf87afe1 100644 --- a/drivers/leds/trigger/ledtrig-pattern.c +++ b/drivers/leds/trigger/ledtrig-pattern.c | |||
@@ -75,8 +75,6 @@ static void pattern_trig_timer_function(struct timer_list *t) | |||
75 | { | 75 | { |
76 | struct pattern_trig_data *data = from_timer(data, t, timer); | 76 | struct pattern_trig_data *data = from_timer(data, t, timer); |
77 | 77 | ||
78 | mutex_lock(&data->lock); | ||
79 | |||
80 | for (;;) { | 78 | for (;;) { |
81 | if (!data->is_indefinite && !data->repeat) | 79 | if (!data->is_indefinite && !data->repeat) |
82 | break; | 80 | break; |
@@ -87,9 +85,10 @@ static void pattern_trig_timer_function(struct timer_list *t) | |||
87 | data->curr->brightness); | 85 | data->curr->brightness); |
88 | mod_timer(&data->timer, | 86 | mod_timer(&data->timer, |
89 | jiffies + msecs_to_jiffies(data->curr->delta_t)); | 87 | jiffies + msecs_to_jiffies(data->curr->delta_t)); |
90 | 88 | if (!data->next->delta_t) { | |
91 | /* Skip the tuple with zero duration */ | 89 | /* Skip the tuple with zero duration */ |
92 | pattern_trig_update_patterns(data); | 90 | pattern_trig_update_patterns(data); |
91 | } | ||
93 | /* Select next tuple */ | 92 | /* Select next tuple */ |
94 | pattern_trig_update_patterns(data); | 93 | pattern_trig_update_patterns(data); |
95 | } else { | 94 | } else { |
@@ -116,8 +115,6 @@ static void pattern_trig_timer_function(struct timer_list *t) | |||
116 | 115 | ||
117 | break; | 116 | break; |
118 | } | 117 | } |
119 | |||
120 | mutex_unlock(&data->lock); | ||
121 | } | 118 | } |
122 | 119 | ||
123 | static int pattern_trig_start_pattern(struct led_classdev *led_cdev) | 120 | static int pattern_trig_start_pattern(struct led_classdev *led_cdev) |
@@ -176,14 +173,10 @@ static ssize_t repeat_store(struct device *dev, struct device_attribute *attr, | |||
176 | if (res < -1 || res == 0) | 173 | if (res < -1 || res == 0) |
177 | return -EINVAL; | 174 | return -EINVAL; |
178 | 175 | ||
179 | /* | ||
180 | * Clear previous patterns' performence firstly, and remove the timer | ||
181 | * without mutex lock to avoid dead lock. | ||
182 | */ | ||
183 | del_timer_sync(&data->timer); | ||
184 | |||
185 | mutex_lock(&data->lock); | 176 | mutex_lock(&data->lock); |
186 | 177 | ||
178 | del_timer_sync(&data->timer); | ||
179 | |||
187 | if (data->is_hw_pattern) | 180 | if (data->is_hw_pattern) |
188 | led_cdev->pattern_clear(led_cdev); | 181 | led_cdev->pattern_clear(led_cdev); |
189 | 182 | ||
@@ -234,14 +227,10 @@ static ssize_t pattern_trig_store_patterns(struct led_classdev *led_cdev, | |||
234 | struct pattern_trig_data *data = led_cdev->trigger_data; | 227 | struct pattern_trig_data *data = led_cdev->trigger_data; |
235 | int ccount, cr, offset = 0, err = 0; | 228 | int ccount, cr, offset = 0, err = 0; |
236 | 229 | ||
237 | /* | ||
238 | * Clear previous patterns' performence firstly, and remove the timer | ||
239 | * without mutex lock to avoid dead lock. | ||
240 | */ | ||
241 | del_timer_sync(&data->timer); | ||
242 | |||
243 | mutex_lock(&data->lock); | 230 | mutex_lock(&data->lock); |
244 | 231 | ||
232 | del_timer_sync(&data->timer); | ||
233 | |||
245 | if (data->is_hw_pattern) | 234 | if (data->is_hw_pattern) |
246 | led_cdev->pattern_clear(led_cdev); | 235 | led_cdev->pattern_clear(led_cdev); |
247 | 236 | ||