aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds/trigger/ledtrig-pattern.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/leds/trigger/ledtrig-pattern.c')
-rw-r--r--drivers/leds/trigger/ledtrig-pattern.c27
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
123static int pattern_trig_start_pattern(struct led_classdev *led_cdev) 120static 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