@@ -260,10 +260,14 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,
260
260
if (ret < 0 )
261
261
return ret ;
262
262
263
+ mutex_init (& led_cdev -> led_access );
264
+ mutex_lock (& led_cdev -> led_access );
263
265
led_cdev -> dev = device_create_with_groups (leds_class , parent , 0 ,
264
266
led_cdev , led_cdev -> groups , "%s" , name );
265
- if (IS_ERR (led_cdev -> dev ))
267
+ if (IS_ERR (led_cdev -> dev )) {
268
+ mutex_unlock (& led_cdev -> led_access );
266
269
return PTR_ERR (led_cdev -> dev );
270
+ }
267
271
led_cdev -> dev -> of_node = np ;
268
272
269
273
if (ret )
@@ -274,6 +278,7 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,
274
278
ret = led_add_brightness_hw_changed (led_cdev );
275
279
if (ret ) {
276
280
device_unregister (led_cdev -> dev );
281
+ mutex_unlock (& led_cdev -> led_access );
277
282
return ret ;
278
283
}
279
284
}
@@ -285,7 +290,6 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,
285
290
#ifdef CONFIG_LEDS_BRIGHTNESS_HW_CHANGED
286
291
led_cdev -> brightness_hw_changed = -1 ;
287
292
#endif
288
- mutex_init (& led_cdev -> led_access );
289
293
/* add to the list of leds */
290
294
down_write (& leds_list_lock );
291
295
list_add_tail (& led_cdev -> node , & leds_list );
@@ -302,6 +306,8 @@ int of_led_classdev_register(struct device *parent, struct device_node *np,
302
306
led_trigger_set_default (led_cdev );
303
307
#endif
304
308
309
+ mutex_unlock (& led_cdev -> led_access );
310
+
305
311
dev_dbg (parent , "Registered led device: %s\n" ,
306
312
led_cdev -> name );
307
313
0 commit comments